[PYTHON] Erstellen Sie mithilfe der Twitter-Streaming-API einen Echtzeit-Bot für die automatische Antwort

Einführung

Ich werde ausführlich über den Twitter-API-Teil von dem schreiben, was ich in [diesem Artikel] getan habe (https://qiita.com/YiwaiY/items/ce790838725aba54c035).

Während der Entwicklung des Bot für die automatische Antwort auf Twitter konnte ich keinen Referenzartikel mit Inhalten wie "Tweets (Antworten) in Echtzeit abrufen" für die Version 2020 finden. Daher möchte ich zusammenfassen, was ich diesmal recherchiert habe. Ich denke.

Hier sind die Spezifikationen des Bot, den ich dieses Mal gemacht habe.

--Überwachen Sie die Zeitleiste in Echtzeit und antworten Sie automatisch, wenn Sie einen Tweet für sich finden, der ein bestimmtes Wort enthält

Twitter API

Holen Sie sich den Twitter API-Schlüssel

Ab August 2020 ist die Methode zum Abrufen des API-Schlüssels etwas anders, aber ich habe auf diesen Artikel verwiesen, z. B. wie man die Verwendung beantragt. ・ Detaillierte Erläuterung des Beispielsatzes der Twitter-API-Verwendungsanwendung der Version 2020 zur Erfassung des API-Schlüssels

Nachdem Ihre Anwendung genehmigt wurde, haben Sie im Entwicklerportal Folgendes ausgeführt:

Twitter Streaming API

Anscheinend wurde die User Streams API verwendet, um Tweets in Echtzeit auf der Timeline abzurufen. Es scheint jedoch, dass diese API im August 2018 abgeschafft wurde und als Ersatz jetzt Status / Filter von Filter-Echtzeit-Tweets. / tweets / filter-realtime / api-reference / post-statuses-filter) kann verwendet werden.

Für Details habe ich auf diesen Artikel verwiesen. ・ Informationen zur Streaming-API von Twitter - Kivantium-Aktivitätstagebuch

Im obigen Artikel scheint es, dass "Tweepy" verwendet wird, aber ich persönlich fand die "Twitter" -Bibliothek einfacher zu verwenden, also habe ich die "Twitter" -Bibliothek verwendet. Installieren Sie mit dem folgenden Befehl. (In virtueller Umgebung ausführen)

(venv)$ pip install twitter

Für die "Twitter" -Bibliothek waren die folgenden Websites hilfreich. ・ Twitter 1.18.0Hinweise zur Verwendung der Python-Twitter-ToolsPython-Ersatzmemo für Twitter durch Twitter User User

Verwendung der Twitter-Bibliothek

Vorbereiten von Schnittstellenobjekten für die Twitter-API

import twitter

#Erstellen eines OAuth-Authentifizierungsobjekts
oauth = twitter.OAuth('Your Access token',
                      'Your Access token secret',
                      'Your API key',
                      'Your API secret key')

#Objekt zur Verwendung der Twitter REST API
twitter_api = twitter.Twitter(auth=oauth)
#Objekte zur Verwendung der Twitter Streaming API
twitter_stream = twitter.TwitterStream(auth=oauth)

Senden Sie eine Antwort

API zum Senden von Tweets POST-Status / Update Ist eine REST-API, verwenden Sie das oben vorbereitete Objekt "twitter_api".

text = 'Prüfung'

#Für normale Tweets
twitter_api.statuses.update(status=text)

#Bei der Beantwortung eines bestimmten Tweets
reply_text = '@username' + '\n'
reply_text += text
twitter_api.statuses.update(status=reply_text, in_reply_to_status_id='ID des zu antwortenden Tweets')

Wenn Sie eine Antwort senden, müssen Sie anscheinend nicht nur in_reply_to_status_id angeben, sondern auch "@ username" (@ + Benutzername des Tweets, auf den geantwortet werden soll) in den Text aufnehmen.

Holen Sie sich die Zeitleiste in Echtzeit

[Wie oben](# twitter-Streaming-API) wird die Streaming-API verwendet. Verwenden Sie daher das oben vorbereitete Objekt "twitter_stream".

#Zu überwachende Zeichenfolge
tracking_text = '@my_Benutzername testen' #UND Suche mit halbbreite Breite.','ODER Suche nach Trennzeichen

for tweet in twitter_stream.statuses.filter(language='ja', track=tracking_text):
    print(tweet)

Wenn Sie dies tun, erhalten Sie ein Tweet-Objekt "tweet", das sowohl die Zeichenfolgen "@ my_username" als auch "test" enthält. (Für alle Tweets im öffentlichen Konto) Bitte überprüfen Sie den Inhalt. Verwenden Sie die in diesem "Tweet" -Objekt enthaltenen Informationen, um zu antworten.

Es gibt auch ein Filterargument namens "follow", und Sie können die zu überwachenden Benutzer einschränken, indem Sie "durch", "getrennte Benutzer-IDs übergeben. Der Grund, warum ich diesmal nicht "Follow" angegeben habe, ist, dass es sich um eine ODER-Suche anstelle einer UND-Suche mit der Bedingung "Track" handelt. Mit anderen Worten, der durch "Folgen" angegebene Tweet des Benutzers wird unabhängig vom Inhalt erfasst. In dieser Spezifikation kann die Angabe von "Spur" die zu erfassenden Tweets eingrenzen, anstatt "Folgen" anzugeben, sodass nur "Spur" angegeben wird.

Quellcode

Verzeichnisaufbau

Dieses Mal habe ich einen Verwaltungsbildschirm mit einer Flasche zum Registrieren und Bearbeiten des Antworttextes erstellt, sodass die Struktur der Flasche ähnlich ist. Es gibt kein Problem, auch wenn Sie sie in einer Datei zusammenfassen.

app/
├── .env             #Bereiten Sie den Twitter API Key usw. vor.
├── bot.py           #Ausführungsdatei
└── bot/             #DB-Verarbeitung für Antworttext / Serviceklasse weggelassen
    ├── __init__.py
    ├── config.py
    └── tweet.py

Ausführungsdatei

Es liest nur die Datei und führt die Funktion aus.

bot.py


import bot

if __name__ == '__main__':
    bot.start()

Einstellungsdatei

Wir bereiten ein Objekt zum Lesen der Umgebungsvariablen und zur Verwendung der Twitter-API vor.

config.py


import os
from os.path import join, dirname
from dotenv import load_dotenv

import twitter

dotenv_path = join(dirname(__file__), '../.env')
load_dotenv(dotenv_path)


oauth = twitter.OAuth(os.environ.get('ACCESS_TOKEN_KEY'),
                      os.environ.get('ACCESS_TOKEN_SECRET'),
                      os.environ.get('CONSUMER_KEY'),
                      os.environ.get('CONSUMER_SECRET'))

twitter_api = twitter.Twitter(auth=oauth)
twitter_stream = twitter.TwitterStream(auth=oauth)
SCREEN_NAME = os.environ.get('TWITTER_SCREEN_NAME') # @Benutzername Ihr eigener Benutzername

Hauptverarbeitung

Es überwacht die Zeitleiste in Echtzeit und reagiert automatisch auf Antworten mit bestimmten Wörtern. Ich hätte sie in dieser Datei zusammenstellen können, aber ich habe eine andere Klasse für das abgerufene Tweet-Objekt vorbereitet und die Verarbeitung getrennt.

__init__.py


import logging
from bot.config import twitter_stream, SCREEN_NAME
from bot.tweet import Tweet


def start():

    #Protokollierungseinstellungen
    formatter = '%(levelname)s : %(asctime)s : %(message)s'
    logging.basicConfig(level=logging.INFO, format=formatter)

    REPLY_TEXT = 'Hallo'

    replied_user_list = [] #Verwalten Sie antwortende Benutzer in einer Liste

    tracking_text = '@'+ SCREEN_NAME + 'Hallo'
    for tweet in twitter_stream.statuses.filter(language='ja', track=tracking_text):
        tweet_obj = Tweet(tweet)

        #Wenn der erforderliche Schlüssel nicht enthalten ist
        required_keys_list = [
            'id_str',
            'text',
            'user'
        ]
        if not tweet_obj.has_required_keys(required_keys_list):
            logging.warning('FALSE->required key is empty')
            print(tweet_obj.tweet)
            continue

        #Für Retweets (Tracking_Es reagiert, wenn es mit dem Text übereinstimmt.
        if tweet_obj.is_retweet():
            logging.warning('%s\n [user]: %s\n [tweet]: %s', 'FALSE->is retweet', tweet_obj.get_user_screenname(), tweet_obj.get_tweet_text())
            continue

        #Für Benutzer, die in der Vergangenheit geantwortet haben
        user_id = tweet_obj.get_user_id()
        if user_id in replied_user_list:
            logging.warning('%s\n [user]: %s\n [tweet]: %s', 'FALSE->has already replied', tweet_obj.get_user_screenname(), tweet_obj.get_tweet_text())
            continue

        #Für deine eigenen Tweets
        if tweet_obj.is_reply_from_me():
            tweet_obj.reply(REPLY_TEXT)
            replied_user_list.append(user_id)
            logging.info('%s\n [user]: %s\n [tweet]: %s', 'SUCCESS->self tweet', tweet_obj.get_user_screenname(), tweet_obj.get_tweet_text())
            continue

        #Wenn nicht der Tweet eines Followers
        if not tweet_obj.is_reply_from_follower():
            logging.warning('%s\n [user]: %s\n [tweet]: %s', 'FALSE->not follwer', tweet_obj.get_user_screenname(), tweet_obj.get_tweet_text())
            continue

        #Normales System
        tweet_obj.reply(REPLY_TEXT)
        replied_user_list.append(user_id)
        logging.info('%s\n [user]: %s\n [tweet]: %s', 'SUCCESS', tweet_obj.get_user_screenname(), tweet_obj.get_tweet_text())

Dieses Mal wird die Erläuterung der Verarbeitung der Serviceklasse für den Antworttext weggelassen, sodass sie in den festen Antworttext "REPLY_TEXT" geändert wird. Für eine Antwort pro Tag klicken Sie hier (https://qiita.com/YiwaiY/items/ce790838725aba54c035#1%E3%82%A2%E3%82%AB%E3%82%A6%E3%83% B3% E3% 83% 88% E3% 81% AB% E3% 81% A4% E3% 81% 8D1% E6% 97% A51% E3% 83% AA% E3% 83% 97% E3% 83% A9% E3% 82% A4% E3% 82% 92% E3% 81% A9% E3% 81% 86% E5% AE% 9F% E8% A3% 85% E3% 81% 99% E3% 82% 8B% E3% Bitte beziehen Sie sich auf 81% 8B).

Klasse, die Tweet-Objekte verarbeitet

Die Verarbeitung, die die Twitter-REST-API verwendet, und die Bedingungsbeurteilungsmethode werden hier zusammengefasst.

tweet.py


from bot.config import twitter_api, SCREEN_NAME


class Tweet():

    def __init__(self, tweet):
        self.tweet = tweet

    def has_required_keys(self, required_keys_list):
        for required_key in required_keys_list:
            if required_key not in self.tweet:
                return False
        return True

    def reply(self, text):
        status = '@' + self.get_user_screenname() + '\n'
        status += text
        return twitter_api.statuses.update(status=status, in_reply_to_status_id=self.tweet['id_str'])

    def is_retweet(self):
        return 'retweeted_status' in self.tweet

    def is_reply_from_me(self):
        return self.get_user_screenname() == SCREEN_NAME

    def is_reply_from_follower(self):
        followers = twitter_api.followers.ids(screen_name=SCREEN_NAME, count=5000) #ID-Array von Followern vom Typ int
        return self.get_user_id() in followers['ids']

    def get_user_id(self):
        return self.tweet['user']['id']

    def get_user_name(self):
        return self.tweet['user']['name']

    def get_user_screenname(self):
        return self.tweet['user']['screen_name']

    def get_tweet_text(self):
        return self.tweet['text']

Zusammenfassung

Zuerst wollte ich einen automatischen Antwortbot auf Twitter erstellen, und dann recherchierte ich verschiedene Dinge, aber ich konnte diese Artikel nicht ganz erreichen und fragte mich, ob ich sie nicht mehr erstellen konnte. Es war meine erste Erfahrung, etwas selbst zu machen, also bin ich über verschiedene Dinge gestolpert, aber ich bin froh, dass ich es vorerst abgeschlossen habe.

Ich bin noch in meinem zweiten Jahr der Programmierung und ich denke, der Python-Code des Mannes, der normalerweise PHP verwendet, ist nicht ganz da, aber ich hoffe, er hilft jemandem, der Probleme wie ich hat. ..

Ich habe es am Anfang vorgestellt, aber ich würde mich auch über Ihre Gunst in diesem Artikel freuen. ・ [Erste persönliche Entwicklung] Die Geschichte der Bereitstellung der Flask-App und des Twitter-Bot für die automatische Antwort auf Heroku

Recommended Posts

Erstellen Sie mithilfe der Twitter-Streaming-API einen Echtzeit-Bot für die automatische Antwort
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der Twitter-API
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Erstellen Sie die CRUD-API mit der Fast API
Erstellen Sie mit dem Sympy-Modul ein Diagramm
Erstellen Sie eine Anwendung mit der Spotify-API
Erstellen Sie einen Bot, der Twitter-Trends verstärkt
Erstellen Sie einen Twitter-BOT-Dienst mit der GAE / P + Tweepy + RIOT-API! (Teil 1)
Erstellen Sie einen Twitter-BOT-Dienst mit der GAE / P + Tweepy + RIOT-API! (Teil 2)
Erstellen wir eine REST-API mit SpringBoot + MongoDB
Schritte zum Erstellen eines Twitter-Bots mit Python
Erstellen Sie eine GUI auf dem Terminal mit Flüchen
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Erstellen Sie eine REST-API mit dem in Lobe und TensorFlow Serving erlernten Modell.
Erstellen Sie einen Slack Bot
Erstellen Sie mit Selenium einen Datenerfassungsbot in Python
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 1 ~
Erstellen Sie eine Tweet-Heatmap mit der Google Maps-API
Posten Sie mit der API auf Twitter in Ihrem Konto
Erstellen Sie mit GitHub Pages einen Pseudo-REST-API-Server
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 2 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 3 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 4 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 5 ~
Durchsuchen Sie die Tabelle mit sqlalchemy und erstellen Sie ein Wörterbuch
Verwenden Sie die Twitter-API, um die von Twitter benötigte Zeit zu verkürzen (erstellen Sie eine Hervorhebungszeitleiste).
Versuchen Sie es mit der PeeringDB 2.0-API
Erstellen Sie ein Korrelationsdiagramm aus dem Konversationsverlauf von Twitter
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Erstellen Sie mit turicreate eine API, die Daten aus einem Modell zurückgibt
Exportieren Sie die von der Twitter Streaming API erfassten Inhalte im JSON-Format
Verwenden Sie sqlalchemy, um die DB-Tabelle zu durchsuchen und eine Datenflamme für Pandas zu erstellen
Ich habe einen Twitter-Bot mit Go x Qiita API x Lambda erstellt
[Ev3dev] Erstellen Sie ein Programm, das das LCD (Bildschirm) mit Python erfasst
Erstellen Sie ganz einfach einen TalkBot mit Discord.py und der Talk-API von A3RT (pya3rt).
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Erstellen Sie mit tkinter eine Python-GUI
Erstellen Sie ein verschachteltes Wörterbuch mit defaultdict
Erstellen Sie eine API mit hug mit mod_wsgi
Greifen Sie mit Python auf die Twitter-API zu
Ich habe versucht, die checkio-API zu verwenden
Erstellen Sie mit Boost.Python einen C-Sprach-Wrapper
Erstellen Sie mit Django einen LINE-Bot
[Python] Ich habe einen Twitter-Bot erstellt, der freundschaftliche Tweets mit Markov-Kettenregeln generiert.
Erstellen Sie mit dem Python-Anforderungsmodul einen Datensatz mit Anhängen in KINTONE
Hanashi, der beim Versuch, eine morphologische Analyse BOT mit der beliebten LINE BOT API durchzuführen, zum BOT durchgelesen wurde
Tweet die Wettervorhersage mit Bot
Erstellen Sie einen Bot, um Corona-Virus-Informationen zu retweeten
Versuchen Sie es mit der Wunderlist-API in Python
Kenntnisse beim Erstellen eines Bots mit discord.py
Klasse, die die API von DMM trifft
Versuchen Sie, die Kraken-API mit Python zu verwenden
[Python] Erstellen Sie eine Stapelumgebung mit AWS-CDK
[Python] [LINE Bot] Erstellen Sie einen LINE Bot mit Papageienrückgabe
Erstellen Sie mit Pandas einen Datenrahmen aus Excel