twitter4j java Stocke les tweets recherchés dans DB (MySQL).

Une source qui acquiert autant que le passé (jusqu'à 8 ou 9 jours) d'un certain mot et le stocke dans la base de données (mysql).

Environnement de développement

Eclipse 4.8   jdk 1.8

Intervalle pour accéder à l'API

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.

Classe de ressources SearchWordResource

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();
            }
        }
    }
}

Classe de recherche de mots WordSearch

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();
        }
    }
}

Classe de connexion DB ConnectionDB

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;
        }
}

Résidu d'API GetAPIRestCount

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();
        }
    }
}

Classe constante TwitterContents


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

twitter4j java Stocke les tweets recherchés dans DB (MySQL).
Stocker l'objet Java reçu au format tabulaire dans le modèle approprié
Accéder à l'interface réseau avec Java
Spécifiez l'emplacement Java dans eclipse.ini
Décompressez le fichier zip en Java
Analyser l'analyse syntaxique de l'API COTOHA en Java
Enregistrer les données UUID dans MySQL sous 16 octets
Appelez la super méthode en Java
[Java] Les insertions Batch Insert sont combinées en une seule lorsque vous utilisez MySQL DB dans Doma.
Implémentation de DBlayer en Java (RDB, MySQL)
Obtenez le résultat de POST en Java
Référence Java à comprendre dans la figure
Essayez d'utiliser l'API Stream en Java
Appelez l'API de notification Windows en Java
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
Organisation des notes dans la tête (Java-Arrangement)
ERRORCODE = -4471 se produit dans une application Java qui utilise Db2.
Essayez d'appeler le service CORBA sur Java 11+
Quelle est la méthode principale en Java?
Comment obtenir la date avec Java
[Rails] Stocker uniquement les éléments cochés dans la base de données
Entrée de la console en Java (comprendre le mécanisme)
Solution qui donne une erreur lors de la tentative de connexion à DB (MySQL) avec Java
Exemple de code pour obtenir les valeurs de type SQL clés dans Java + MySQL 8.0
Concernant les modificateurs transitoires et la sérialisation en Java
L'histoire de la comparaison de chaînes de bas niveau en Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
À propos de la confusion observée dans les serveurs Java de démarrage
L'histoire de la fabrication d'un Othello ordinaire à Java
À propos de l'idée des classes anonymes en Java
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Une histoire sur le JDK à l'ère de Java 11
Mémo organisé dans la tête (syntaxe Java --Control)
Le type d'intersection introduit dans Java 10 est incroyable (?)
L'histoire de l'apprentissage de Java dans la première programmation
Mesurer la taille d'un dossier avec Java
[NCMB] J'ai recherché le magasin de données avec mbaas
Ressentez le passage du temps même à Java
Organisation des notes dans la tête (Java - édition d'instance)
[Java] Lire les fichiers dans src / main / resources
Mémo organisé dans la tête (Java - type de données)
Afficher "Hello World" dans le navigateur à l'aide de Java
[Java] Jugement en saisissant des caractères dans le terminal
Afficher "Hello World" dans le navigateur à l'aide de Java
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
[Java] Quelque chose est affiché comme "-0.0" dans la sortie
Importer des fichiers de la même hiérarchie en Java