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
Automatische Antwort bis zu einmal täglich pro Konto
Reagiert nicht auf andere Tweets als Follower
Reagiert nicht auf Retweets
Reagiert nicht (nicht) auf Tweets von privaten Konten
Sie können auf Ihre eigenen Tweets antworten
Twitter API
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:
Geänderte App-Berechtigungen von Lesen zu Lesen und Schreiben (zum Twittern aus dem Programm)
Generieren Sie Access Token & Secret (erforderlich, um die API zu verwenden)
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.0 ・ Hinweise zur Verwendung der Python-Twitter-Tools ・ Python-Ersatzmemo für Twitter durch Twitter User User
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)
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.
[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.
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
Es liest nur die Datei und führt die Funktion aus.
bot.py
import bot
if __name__ == '__main__':
bot.start()
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
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).
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']
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