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