Eclipse 4.8 jdk 1.8
Gehen Sie alle 3 Sekunden zu MAX100 / 1API. Schlagen Sie 15 Mal mit einer Instanz und warten Sie dann 10 Sekunden. Wenn das API-Limit erreicht ist, wird der Fehlercode 429 zurückgegeben. Warten Sie in diesem Fall 60 Sekunden.
package CollectionTweet;
import java.util.Date;
import twitter4j.Status;
import twitter4j.TwitterException;
/**
*Ressourcenklasse, die nach beliebigen Wörtern sucht und vergangene Tweets in der Datenbank speichert
*/
public class SearchWordResource {
public static void main(String[] args) {
//Endlosschleife
for (;;) {
TrendSearch trendSearchPRG = new TrendSearch();
WordSearch wordSearchPRG = new WordSearch();
Status retweetStatus = null;
try {
//Suchen und speichern in der DB
String wordSearch = "Reform des Arbeitsstils";
retweetStatus = wordSearchPRG.wordSearch(wordSearch);
} catch (TwitterException e) {
e.printStackTrace();
}
// sleep
try {
Date date = new Date();
System.out.println(date.toString());
Thread.sleep(TwitterContents.TIME_INTERVAL);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package CollectionTweet;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
/**
*Klasse, um nach einem bestimmten Wort zu suchen
*/
public class WordSearch {
public Status wordSearch(String seachWord) throws TwitterException {
//Initialisieren
Twitter twitter = new TwitterFactory().getInstance();
Query query = new Query();
//Anzahl der Tweets, die in einer Anfrage eingehen sollen (maximal 100)
query.setCount(TwitterContents.MAX_GETTWEET_NUMBER);
//Suchwort einstellen
query.setQuery(seachWord);
//DB-Verbindung
ConnectionDB connectionDB = new ConnectionDB();
Connection connection = null;
Statement statement = null;
try {
connection = connectionDB.getConnection();
statement = connection.createStatement();
} catch (ClassNotFoundException | SQLException e3) {
e3.printStackTrace();
}
String getMaxIdSQL = "select min(tweet_id) as min_tweet_id from t_tweet where search_word =?;";
List<String> minUntilCreateDatetimeList = new ArrayList<String>();
//Rufen Sie den Mindestwert für das Datum und die Uhrzeit der Tweet-Erstellung des Suchworts von DB ab
try(
PreparedStatement ps = connection.prepareStatement(getMaxIdSQL)){
ps.setString(1,seachWord);
try(ResultSet rs = ps.executeQuery()){
while (rs.next()) {
System.out.println("◆◆ DB gespeichert Tweet ID Mindestwert:" + rs.getString("min_tweet_id") + "◆◆");
minUntilCreateDatetimeList.add(rs.getString("min_tweet_id"));
}
};
} catch (SQLException e2) {
e2.printStackTrace();
}
//Wenn Sie sich bereits in der Vergangenheit in der Datenbank registriert haben, geben Sie die minimale Tweet-ID in der Abfrage-Suchbedingung an.
if(minUntilCreateDatetimeList.get(0) != null) {
//Holen Sie sich die Tweet-ID vor der angegebenen Tweet-ID
query.setMaxId(Long.valueOf(minUntilCreateDatetimeList.get(0)));
System.out.println(minUntilCreateDatetimeList.get(0) + "_JST");
}
//Tweets mit den meisten Retweets
Status popularTweet = null;
//Suchergebnisse
QueryResult result = null;
//API-Rückstand
GetAPIRestCount getAPIRestCount = new GetAPIRestCount();
//Suchausführung
for (int i = 0; i < TwitterContents.SERACH_PAGE_NUMBER; i++) {
//Suchausführung
try {
result = twitter.search(query);
System.out.println("Anzahl der Treffer: " + result.getTweets().size());
System.out.println("Seitenzahl: " + i);
} catch (TwitterException twi_e) {
twi_e.printStackTrace();
if (twi_e.getStatusCode() == 429) {
intarvalTime();
}
break;
} catch (Exception ee) {
ee.printStackTrace();
break;
}
//Wenn das Erfassungsergebnis 0 ist, wird null zurückgegeben.
if(result.getTweets().size() == 0) {
return null;
}
//Treffer-API-Intervall: 3 Sekunden
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
//Schauen Sie sich die Suchergebnisse an
for (Status tweet : result.getTweets()) {
popularTweet = tweet;
// System.out.println("◆◆◆◆◆◆ Gesuchte Trendwörter:" + seachWord + "◆◆◆◆◆◆");
//System.out.println("Status ID:" + popularTweet.getId()); //Erforderlich für Retweets
//System.out.println("Text:" + popularTweet.getText());
//Benutzer, der gesprochen hat
// System.out.println("Benutzeridentifikation_num:" + popularTweet.getUser().getId());
// System.out.println("Benutzeridentifikation@:" + popularTweet.getUser().getScreenName());
System.out.println("Notation des Benutzernamens:" + popularTweet.getUser().getName());
//Datum und Uhrzeit des Sprechens
// System.out.println("Tweet Datum und Uhrzeit:" + popularTweet.getCreatedAt());
// System.out.println("Sprache:" + popularTweet.getLang());
// System.out.println("Bereich:" + popularTweet.getGeoLocation());
// System.out.println("Anzahl der Likes:" + popularTweet.getFavoriteCount());
// System.out.println("Anzahl der Retweets:" + popularTweet.getRetweetCount());
//Ausführung einfügen
try {
String sql = "INSERT INTO T_tweet VALUES ("
+ "'" + popularTweet.getId() + "'" + "," //Tweet ID Damit können Sie retweeten
+ "'" + popularTweet.getUser().getScreenName() + "'" + "," //Benutzeridentifikation
+ "'" + popularTweet.getUser().getName() + "'" + "," //Nutzername
+ "'" + popularTweet.getText() + "'" + "," //Tweet Körper
+ "'" + popularTweet.getGeoLocation() + "'" + "," //Bereich
+ "'" + popularTweet.getLang() + "'" + "," //Sprache
+ "'" + seachWord + "'" + "," //Suchbegriff
+ popularTweet.getFavoriteCount() + "," //Anzahl der Favoriten
+ popularTweet.getRetweetCount() + "," //Anzahl der Retweets
+ "'" + new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(popularTweet.getCreatedAt()) + "'" //Tweet Datum und Uhrzeit
+ ");";
int resultInsert = statement.executeUpdate(sql);
System.out.println("Ergebnis 1:" + resultInsert);
} catch (SQLException e) {
e.printStackTrace();
}
query = result.nextQuery(); //Siehe nächste Seite
}
}
//Als Ergebnis der Suche wird NULL zurückgegeben, wenn kein entsprechender Tweet vorhanden ist
if(popularTweet == null ){
return null;
}
return popularTweet;
}
//Zeit
public void intarvalTime() {
Date date = new Date();
System.out.println(date.toString());
try {
//60 Sekunden
Thread.sleep(60000);
} catch (InterruptedException e) {
//TODO automatisch generierter Fangblock
e.printStackTrace();
}
}
}
package CollectionTweet;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionDB {
public Connection getConnection() throws ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
try {
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/twitter?serverTimezone=JST", "user", "password");
return connection;
} catch (SQLException ex) {
ex.printStackTrace();
}
return null;
}
}
package CollectionTweet;
import java.util.HashMap;
import java.util.Map;
import twitter4j.RateLimitStatus;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
/**
*Informationen zu API-Einschränkungen abrufen
*
*/
public class GetAPIRestCount {
public static void getAPIRestCount() {
Twitter twitter = new TwitterFactory().getInstance();
Map<String , RateLimitStatus> helpmap = new HashMap<String,RateLimitStatus>();//Erstellen Sie eine Variable zum Speichern von API-Einschränkungsinformationen
try {
helpmap = twitter.help().getRateLimitStatus();
for(Map.Entry<String, RateLimitStatus> e : helpmap.entrySet()){
if(e.getKey().equals("/application/rate_limit_status") ||
e.getKey().equals("/statuses/retweeters/ids") ||
e.getKey().equals("/search/tweets") ||
e.getKey().equals("/friendships/show")){
System.out.println(e.getKey() + "\nremain: " + e.getValue().getRemaining());
}
}
} catch (TwitterException e1) {
e1.printStackTrace();
}
}
}
package CollectionTweet;
/**
*Klasse, die Konstanten verwaltet
*/
public class TwitterContents {
//Unterdrücken Sie die Instanziierung mit einem privaten Konstruktor
private TwitterContents(){};
//Anzahl der zu suchenden Trendwörter
public static final int TRENDWORD_NUMBER = 2;
//Mindestanzahl von Retweets
public static final int MIN_RETWEET_NUMBER = 150;
//Mindestanzahl von Retweets
public static final int LOCALNUMBER_JAPAN = 23424856;
//Verarbeitungsintervallzeit
public static final int TIME_INTERVAL = 10000;
//Anzahl der Tweets, die auf Anfrage abgerufen werden sollen (maximal 100)
public static final int MAX_GETTWEET_NUMBER = 100;
//Anzahl der zu durchsuchenden Seiten max. 15 Seiten
public static final int SERACH_PAGE_NUMBER = 15;
}
DDL
CREATE TABLE `t_tweet` (
`tweet_id` varchar(256) NOT NULL,
`user_id` varchar(256) NOT NULL,
`user_name` varchar(256) DEFAULT NULL,
`tweet` text,
`location` varchar(256) DEFAULT NULL,
`langeuge` varchar(256) DEFAULT NULL,
`search_word` varchar(256) NOT NULL,
`favarite_count` bigint(20) DEFAULT NULL,
`retweet_count` bigint(20) DEFAULT NULL,
`create_datetime` datetime DEFAULT NULL,
PRIMARY KEY (`tweet_id`,`user_id`,`search_word`),
UNIQUE KEY `tweet_id_UNIQUE` (`tweet_id`,`user_id`,`search_word`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Recommended Posts