Eclipse 4.8 jdk 1.8
Allez frapper MAX100 / 1API toutes les 3 secondes. Frappez 15 fois avec une instance, puis attendez 10 secondes. Lorsque la limite de l'API est atteinte, le code d'erreur 429 est renvoyé. Dans ce cas, attendez 60 secondes.
package CollectionTweet;
import java.util.Date;
import twitter4j.Status;
import twitter4j.TwitterException;
/**
*Classe de ressources qui recherche des mots arbitraires et stocke les anciens tweets dans la base de données
*/
public class SearchWordResource {
public static void main(String[] args) {
//boucle infinie
for (;;) {
TrendSearch trendSearchPRG = new TrendSearch();
WordSearch wordSearchPRG = new WordSearch();
Status retweetStatus = null;
try {
//Rechercher et stocker dans DB
String wordSearch = "Réforme du style de travail";
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;
/**
*Classe pour rechercher un mot spécifique
*/
public class WordSearch {
public Status wordSearch(String seachWord) throws TwitterException {
//Initialisation
Twitter twitter = new TwitterFactory().getInstance();
Query query = new Query();
//Nombre de Tweets à recevoir dans une demande (100 est le maximum)
query.setCount(TwitterContents.MAX_GETTWEET_NUMBER);
//Définir le mot de recherche
query.setQuery(seachWord);
//Connexion DB
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>();
//Obtenez la valeur minimale de la date et de l'heure de création du tweet du mot de recherche de DB
try(
PreparedStatement ps = connection.prepareStatement(getMaxIdSQL)){
ps.setString(1,seachWord);
try(ResultSet rs = ps.executeQuery()){
while (rs.next()) {
System.out.println("◆◆ Valeur minimale de l'ID de Tweet stocké dans la base de données:" + rs.getString("min_tweet_id") + "◆◆");
minUntilCreateDatetimeList.add(rs.getString("min_tweet_id"));
}
};
} catch (SQLException e2) {
e2.printStackTrace();
}
//Si vous vous êtes déjà enregistré dans la base de données dans le passé, spécifiez l'ID de tweet minimum dans la condition de recherche de requête.
if(minUntilCreateDatetimeList.get(0) != null) {
//Obtenir l'ID de Tweet avant l'ID de Tweet spécifié
query.setMaxId(Long.valueOf(minUntilCreateDatetimeList.get(0)));
System.out.println(minUntilCreateDatetimeList.get(0) + "_JST");
}
//Tweets avec le plus de retweets
Status popularTweet = null;
//Résultats de recherche
QueryResult result = null;
//Résidu API
GetAPIRestCount getAPIRestCount = new GetAPIRestCount();
//Exécution de la recherche
for (int i = 0; i < TwitterContents.SERACH_PAGE_NUMBER; i++) {
//Exécution de la recherche
try {
result = twitter.search(query);
System.out.println("Nombre de visites: " + result.getTweets().size());
System.out.println("nombre de pages: " + i);
} catch (TwitterException twi_e) {
twi_e.printStackTrace();
if (twi_e.getStatusCode() == 429) {
intarvalTime();
}
break;
} catch (Exception ee) {
ee.printStackTrace();
break;
}
//Si le résultat de l'acquisition est 0, nul est renvoyé.
if(result.getTweets().size() == 0) {
return null;
}
//Intervalle d'API Hit: 3 secondes
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
//Jetez un œil aux résultats de la recherche
for (Status tweet : result.getTweets()) {
popularTweet = tweet;
// System.out.println("◆◆◆◆◆◆ Mots de tendance recherchés:" + seachWord + "◆◆◆◆◆◆");
//System.out.println("ID de statut:" + popularTweet.getId()); //Requis pour les retweets
//System.out.println("Texte:" + popularTweet.getText());
//Utilisateur qui a parlé
// System.out.println("Identifiant d'utilisateur_num:" + popularTweet.getUser().getId());
// System.out.println("Identifiant d'utilisateur@:" + popularTweet.getUser().getScreenName());
System.out.println("Notation du nom d'utilisateur:" + popularTweet.getUser().getName());
//Date et heure de la parole
// System.out.println("Date et heure du Tweet:" + popularTweet.getCreatedAt());
// System.out.println("Langue:" + popularTweet.getLang());
// System.out.println("zone:" + popularTweet.getGeoLocation());
// System.out.println("Nombre de likes:" + popularTweet.getFavoriteCount());
// System.out.println("Nombre de retweets:" + popularTweet.getRetweetCount());
//insérer une exécution
try {
String sql = "INSERT INTO T_tweet VALUES ("
+ "'" + popularTweet.getId() + "'" + "," //Identifiant du Tweet Vous pouvez retweeter avec ceci
+ "'" + popularTweet.getUser().getScreenName() + "'" + "," //Identifiant d'utilisateur
+ "'" + popularTweet.getUser().getName() + "'" + "," //Nom d'utilisateur
+ "'" + popularTweet.getText() + "'" + "," //Corps du Tweet
+ "'" + popularTweet.getGeoLocation() + "'" + "," //zone
+ "'" + popularTweet.getLang() + "'" + "," //Langue
+ "'" + seachWord + "'" + "," //Rechercher un mot
+ popularTweet.getFavoriteCount() + "," //Nombre de favoris
+ popularTweet.getRetweetCount() + "," //Nombre de retweets
+ "'" + new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(popularTweet.getCreatedAt()) + "'" //Date et heure du Tweet
+ ");";
int resultInsert = statement.executeUpdate(sql);
System.out.println("Résultat 1:" + resultInsert);
} catch (SQLException e) {
e.printStackTrace();
}
query = result.nextQuery(); //Voir page suivante
}
}
//À la suite de la recherche, s'il n'y a pas de tweet correspondant, NULL est renvoyé
if(popularTweet == null ){
return null;
}
return popularTweet;
}
//temps
public void intarvalTime() {
Date date = new Date();
System.out.println(date.toString());
try {
//60 secondes
Thread.sleep(60000);
} catch (InterruptedException e) {
//Bloc de capture généré automatiquement TODO
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;
/**
*Obtenir des informations de restriction d'API
*
*/
public class GetAPIRestCount {
public static void getAPIRestCount() {
Twitter twitter = new TwitterFactory().getInstance();
Map<String , RateLimitStatus> helpmap = new HashMap<String,RateLimitStatus>();//Créer une variable pour stocker les informations de restriction d'API
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;
/**
*Classe qui gère les constantes
*/
public class TwitterContents {
//Supprimer l'instanciation avec le constructeur privé
private TwitterContents(){};
//Nombre de mots de tendance à rechercher
public static final int TRENDWORD_NUMBER = 2;
//Nombre minimum de retweets
public static final int MIN_RETWEET_NUMBER = 150;
//Nombre minimum de retweets
public static final int LOCALNUMBER_JAPAN = 23424856;
//Temps d'intervalle de traitement
public static final int TIME_INTERVAL = 10000;
//Nombre de Tweets à obtenir sur demande (100 est le maximum)
public static final int MAX_GETTWEET_NUMBER = 100;
//Nombre de pages à rechercher max 15 pages
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