twitter4j java Speichern Sie die gesuchten Tweets in DB (MySQL).

Eine Quelle, die so viel wie die Vergangenheit (bis zu 8 oder 9 Tage) eines bestimmten Wortes erfasst und in der Datenbank (MySQL) speichert.

Entwicklungsumgebung

Eclipse 4.8   jdk 1.8

Intervall, um die API zu treffen

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.

Ressourcenklasse SearchWordResource

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

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

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

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

API-Rest GetAPIRestCount

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

Konstante Klasse TwitterContents


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

twitter4j java Speichern Sie die gesuchten Tweets in DB (MySQL).
Speichern Sie das empfangene Java-Objekt in tabellarischer Form im entsprechenden Modell
Greifen Sie mit Java auf die Netzwerkschnittstelle zu
Geben Sie den Java-Speicherort in eclipse.ini an
Entpacken Sie die Zip-Datei in Java
Analysieren der COTOHA-API-Syntaxanalyse in Java
Speichern Sie UUID-Daten in MySQL als 16 Byte
Rufen Sie die Super-Methode in Java auf
[Java] Batch Insert Inserts werden beim Umgang mit MySQL DB in Doma zu einem zusammengefasst.
Implementierung von DBlayer in Java (RDB, MySQL)
Holen Sie sich das Ergebnis von POST in Java
Java-Referenz zum Verständnis in der Abbildung
Versuchen Sie es mit der Stream-API in Java
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
Notizen im Kopf organisieren (Java-Arrangement)
ERRORCODE = -4471 tritt in einer Java-Anwendung auf, die Db2 verwendet.
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen
Was ist die Hauptmethode in Java?
So erhalten Sie das Datum mit Java
[Schienen] Speichern Sie nur markierte Elemente in der Datenbank
Konsoleneingabe in Java (Verständnis des Mechanismus)
Lösung, die beim Versuch, mit Java eine Verbindung zu DB (MySQL) herzustellen, einen Fehler verursacht
Beispielcode zum Abrufen der wichtigsten SQL-Typwerte in Java + MySQL 8.0
In Bezug auf transiente Modifikatoren und Serialisierung in Java
Die Geschichte des einfachen String-Vergleichs in Java
[Java] Behandlung von Java Beans in der Methodenkette
Über die Verwirrung beim Starten von Java-Servern
Die Geschichte eines gewöhnlichen Othello in Java
Über die Idee anonymer Klassen in Java
ChatWork4j für die Verwendung der ChatWork-API in Java
Eine Geschichte über das JDK in der Java 11-Ära
Organisiertes Memo im Kopf (Java - Control Syntax)
Der in Java 10 eingeführte Schnittpunkttyp ist erstaunlich (?)
Die Geschichte des Lernens von Java in der ersten Programmierung
Messen Sie die Größe eines Ordners mit Java
[NCMB] Ich habe den Datenspeicher mit mbaas durchsucht
Spüren Sie den Lauf der Zeit auch in Java
Notizen im Kopf organisieren (Java - Instance Edition)
[Java] Dateien in src / main / resources lesen
Organisiertes Memo im Kopf (Java - Datentyp)
Zeigen Sie "Hello World" im Browser mit Java an
[Java] Beurteilung durch Eingabe von Zeichen in das Terminal
Zeigen Sie "Hello World" im Browser mit Java an
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
[Java] In der Ausgabe wird etwas als "-0.0" angezeigt
Importieren Sie Dateien derselben Hierarchie in Java