Machen Sie Twitter Trend Bot mit Heroku + Python

Zweck

Sowohl in der Browserversion als auch in der App-Version können Sie nur den Trend von Twitter top 30 sehen. Es ist mühsam, sich ständig an die Trendseite zu halten, und es ist auch schwierig, Trends in __ jeder Region __ zu erkennen.

Verwenden wir also die Twitter-API, um den Trend abzurufen und einen Twitter-Bot zu erstellen, der Sie benachrichtigt, wenn sich ein Hashtag im Trend befindet. Sie können die Twitter-API verwenden, um top 50 Trends in jeder Region __ zu erhalten. Vielleicht kann es kostenlos betrieben werden. Ich denke, es funktioniert nur, indem ein Teil des im Artikel behandelten Codes neu geschrieben wird.

Wenn Sie es nur lokal ausprobieren möchten, überspringen Sie es bitte.

Text

Vorbereitung

Erstellen Sie ein Twitter-Konto für Bot

Bitte mach es.

Verzeichnisvorbereitung

Erstellen Sie ein Verzeichnis, um die Bot-Dateien zu speichern. Speichern Sie alle unten erstellten Dateien hier. Hier ist es "vtuber-twitter-bot". Am Ende sieht es so aus.

vtuber-twitter-bot
├── dics.py
├── tools.py
├── main.py
├── index.py
├── runtime.txt
├── requirements.txt
├── Procfile

heroku Dieser Artikel ist detailliert. Registrieren und installieren wir die CLI. Da es kostenlos funktioniert, muss Creca nicht registriert werden.

Python 3.x Ich werde den Bot-Code in Python 3.x schreiben. Die zu installierenden Bibliotheken sind wie folgt. Bitte lassen Sie mich wissen, wenn es irgendwelche Auslassungen gibt. Vielleicht kann alles mit pip installiert werden.

Twitter API Dieser Artikel ist detailliert. Notieren Sie sich den API-Schlüssel Consumer_secret, Access_token und Access_secret.

Zuerst vor Ort

Führen Sie den folgenden Code aus. Sie sehen eine Liste der Städte, in denen Sie Trends abrufen können. Finden Sie die Stadt, die Sie erhalten möchten, indem Sie sich auf "Land" (Ländername) und "Name" (Städtename) verlassen, und notieren Sie sich das "Weh".

import tweepy


def twitter_api():
    CONSUMER_KEY    = 'YOUR API KEY'
    CONSUMER_SECRET = 'YOUR CONSUMER SECRET'
    ACCESS_TOKEN    = 'YOUR ACCESS TOKEN'
    ACCESS_SECRET   = 'YOUR ACCESS SECRET'
    auth            = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
    api             = tweepy.API(auth)

    return api


api = twitter_api()
api.trends_available()

#>>[{'country': '',
#>>  'countryCode': None,
#>>  'name': 'Worldwide',
#>>  'parentid': 0,
#>>  'placeType': {'code': 19, 'name': 'Supername'},
#>>  'url': 'http://where.yahooapis.com/v1/place/1',
#>>  'woeid': 1},
#>> {'country': 'Canada',
#>>  'countryCode': 'CA',
#>>  'name': 'Winnipeg',
#>>  'parentid': 23424775,
#>>  'placeType': {'code': 7, 'name': 'Town'},
#>>  'url': 'http://where.yahooapis.com/v1/place/2972',
#>>  'woeid': 2972},
#>>     .
#>>     .
#>>     .

Ich denke, das folgende Weh reicht aus, um den Welttrend, den Japan-Trend und den Trend der Großstädte in Japan zu erfassen. Wenn es ein Leck gibt, suchen Sie es bitte mit der oben beschriebenen Methode.

woeid_dic = {'Welt': 1, 'Japan': 23424856,
             'Tokio': 1118370, 'Kyoto': 15015372, 'Osaka': 15015370,
             'Sapporo': 1118108, 'Sendai': 1118129, 'Nagoya': 1117817, 
             'Kobe': 1117545, 'Hiroshima': 1117227, 'Fukuoka': 1117099,
             'Saitama': 1116753, 'Chiba': 1117034, 'Yokohama': 1118550,
             'Kawasaki': 1117502, 'Sagamihara': 1118072, 'Kitakyushu': 1110809,
             'Okayama': 90036018, 'Niigata': 1117881, 'Takamatsu': 1118285,
             'Hamamatsu': 1117155, 'Kumamoto': 1117605, 'Okinawa': 2345896}

Wenn Sie auf "Weh" verzichten, ist es endlich Zeit, den Trend zu erkennen.

city   = 'Tokio'
woeid  = woeid_dic[city]
trends = api.trends_place(woeid)

#Drucken Sie nur Trendranking und Inhalt
for trend in trends:
    trend_l = 0
    for trend_id in trend['trends']:
        trend_n  = trend_id['name']
        trend_l += 1
        print(city, trend_l, trend_n)

Implementierung

Im Folgenden erstellen wir als Beispiel einen Bot, der benachrichtigt, wenn ein geeignetes Hash-Tag in den Trend eintritt. Das Design ist wie folgt. Bitte ändern Sie die Erfassungshäufigkeit und die Benachrichtigungshäufigkeit entsprechend. __ Beachten Sie zu diesem Zeitpunkt das API-Limit. __ (GET Trends / Ort ist 75 Anfragen / 15 Minuten)

Wenn Sie nur dics.py umschreiben, sollte es Ihr Lieblingsbot sein. []( Wenn Sie woeid_dic ändern, ändern Sie auch now_trend, tmp_record, Recent_trends in tools.py. )

Zum besseren Verständnis empfehlen wir, dass Sie versuchen, jeden Code lokal auszuführen. Seien Sie vorsichtig, wenn Sie lokal ausgeführt werden, da os.environ ['ENV_NAME'] der Code ist, der den Wert der Umgebungsvariablen ENV_NAME empfängt.

dics.py

dics.py


#Liste der Hash-Tags, über die Sie benachrichtigt werden möchten, wenn ein Trend vorliegt
check_trend  = ['#Hashtag', '#Trend']

#Woeid in der Gegend, um den Trend zu bekommen
woeid_dic = {'Welt': 1, 'Japan': 23424856}

tools.py

tools.py


import pickle
import os
import tweepy

from dics import check_trend, woeid_dic


#Vorbereitung zum Twittern oder Abrufen von Daten auf Twitter
def twitter_api():
    CONSUMER_KEY    = os.environ['API_KEY']
    CONSUMER_SECRET = os.environ['API_SECRET_KEY']
    ACCESS_TOKEN    = os.environ['ACCESS_TOKEN']
    ACCESS_SECRET   = os.environ['ACCESS_TOKEN_SECRET']
    auth            = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
    api             = tweepy.API(auth)

    return api


def twitter_trend_notification(tw_switch):
    api       = twitter_api()
    trend_log = './trend_log.pickle'

    now_trend     = {}
    tmp_record    = {}
    recent_trends = {}
    for city in woeid_dic.keys():
        now_trend.update({city: {}})
        tmp_record.update({city: {}})
        recent_trends.update({city: {}})

    #Holen Sie sich Trends und extrahieren Sie Regionen / Rankings / Trendwörter
    for city, woeid in woeid_dic.items():
        trends  = api.trends_place(woeid)
        for trend in trends:
            trend_l = 0
            for trend_id in trend['trends']:
                trend_l   += 1
                trend_name = trend_id['name']
                if trend_name in check_trend:
                    print(city, trend_l, trend_name)
                now_trend[city].update({trend_name: trend_l})

    #Extrahieren Sie nur die Wörter, die Sie benachrichtigen möchten, aus den erfassten Trends
    for city in now_trend.keys():
        for c_trend in check_trend:
            if c_trend in now_trend[city].keys():
                in_dic_tmp = {c_trend: now_trend[city][c_trend]}
                tmp_record[city].update(in_dic_tmp)
    if not os.path.exists(trend_log):
        with open(trend_log, 'wb') as pi:
            pickle.dump(tmp_record, pi)
    with open(trend_log, 'rb') as pi:
        old_record = pickle.load(pi)
    #print(tmp_record)
    #print(old_record)

    #Aktualisieren Sie, wenn das Ranking höher als der vorherige Datensatz ist
    #Hinzufügen, wenn es einen Trend gibt, der nicht im letzten Datensatz enthalten ist
    new_record = old_record
    for city in now_trend.keys():
        for t_trend in tmp_record[city].keys():
            if t_trend in old_record[city].keys():
                if tmp_record[city][t_trend] < old_record[city][t_trend]:
                    new_record[city][t_trend] = tmp_record[city][t_trend]
            else:
                in_dic_tmp = {t_trend: tmp_record[city][t_trend]}
                new_record[city].update(in_dic_tmp)
    with open(trend_log, 'wb') as pi:
        pickle.dump(new_record, pi)
    #if new_record != {'Welt': {}, 'Japan': {}}:#, 'Tokio': {}}:
    #    print('trend : ', new_record)

    #Extrahieren Sie die Rangfolge von 10 früheren Benachrichtigungen
    recent_tweets = api.user_timeline(count=10, tweet_mode='extended')
    #recent_tweets = [tweet.full_text for tweet in recent_tweets]
    for tweet in recent_tweets:
        sp_tw = tweet.full_text.split('\n')
        if '[Trendbenachrichtigung]' in sp_tw[0]:
            hashtag = '#'+ tweet.entities['hashtags'][0]['text']
            for key_city in recent_trends.keys():
                try:
                    re_lev  = sp_tw[2].replace('In den letzten 15 Minuten "{}"Aber{}Trend'.format(hashtag, key_city), '').replace('Es scheint, dass es den Rang erreicht hat.', '')
                    re_lev  = int(re_lev)
                    try:
                        if recent_trends[key_city][hashtag] > re_lev:
                            recent_trends[key_city][hashtag] = re_lev
                    except:
                        recent_trends[key_city].update({hashtag: re_lev})
                except:
                    pass

    #Wenn Sie eine Benachrichtigung ausführen, twittern Sie, wenn das Ranking höher ist als die vorherige Benachrichtigung
    if tw_switch:
        for city in new_record.keys():
            for trend_name in new_record[city].keys():
                if not trend_name in recent_trends[city].keys():
                    tw_flag = 1
                elif recent_trends[city][trend_name] > new_record[city][trend_name]:
                    tw_flag = 1
                else:
                    tw_flag = 0

                if tw_flag and (trend_name in check_trend):
                    tw_str  = '[Trendbenachrichtigung]\n\n'
                    #tw_str  = '[Trendbenachrichtigung] Während des Testbetriebs\n\n'
                    tw_str += 'In den letzten 15 Minuten "{}"Aber{}Trend{}Es scheint, dass es den Rang erreicht hat.'.format(trend_name, city, new_record[city][trend_name])
                    print(tw_str)
                    api.update_status(tw_str)
        #Löschen Sie den Datensatz, wenn Sie twittern
        os.remove(trend_log)

main.py

main.py


from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()

from tools import twitetr_trend_notification


#Tweet nicht
@sched.scheduled_job('cron', minute='5,10,20,25,35,40,50,55', hour='*')
def main_wo_tw():
    try:
        tw_switch = 0
        twitter_trend_notification(tw_switch)
    except Exception as e:
        print('ERROR on twitter_trend_notification')
        print(e)


#Tweet
@sched.scheduled_job('cron', minute='0,15,30,45', hour='*')
def main_w_tw():
    try:
        tw_switch = 1
        twitter_trend_notification(tw_switch)
    except Exception as e:
        print('ERROR on twitter_trend_notification')
        print(e)



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

index.py


#leer. Ich habe das Gefühl, ich brauche es nicht.

Bereitstellen

Dateierstellung

Erstellen Sie runtime.txt , require.txt, Procfile.

runtime.txt


python-3.6.2

requirements.txt


tweepy==3.6.0
APScheduler==3.0.3

Procfile


web: python index.py
clock: python main.py

Erste Bereitstellung

app-name ist eine gute Idee, das Verzeichnis zu benennen, in dem Sie Ihren Code speichern möchten. Die folgenden Befehle sollten in diesem Verzeichnis ausgeführt werden.

heroku login
heroku create app-name

Einstellungen für Umgebungsvariablen

Sie können Umgebungsvariablen mit heroku config: set ENV_NAME =" VALUE " setzen. Die letzten vier werden so ausgeführt, wie sie sind. app-name ist der von früher.

appname=app-name

heroku config:set ACCESS_TOKEN="YOUR TWITTER ACCESS TOKEN" --app $appname
heroku config:set ACCESS_TOKEN_SECRET="YOUR TWITTER ACCESS TOKEN SECRET" --app $appname
heroku config:set API_KEY="YOUR TWITTER API KEY" --app $appname
heroku config:set API_SECRET_KEY="YOUR TWITTER API SECRET KEY" --app $appname
heroku config:set TZ="Asia/Tokyo" --app $appname

Bereitstellen

app-name ist der von früher.

appname=app-name

git init
git add .
git commit -m "new commit"
git remote add heroku https://git.heroku.com/$appname.git
git push heroku master

Instandhaltung

Sie können die gedruckten Protokolle anzeigen, indem Sie den Befehl heroku logs -t im Verzeichnis app-name ausführen.

Zum Debuggen ist es einfacher, das folgende Shell-Skript eine Ebene über dem Verzeichnis "app-name" in das Verzeichnis zu stellen. Führen Sie nach dem Ändern des Codes ../ heroku_deploy.sh im Verzeichnis app-name aus. Wenn dies fehlschlägt, setzen Sie es mit ch mod u + x ../ heroku_deploy.sh auf ausführbar.

heroku_deploy.sh


git add .
git commit -m "new commit"
git push heroku master
heroku ps:scale web=0 clock=1
heroku ps
heroku logs --tail

Recommended Posts

Machen Sie Twitter Trend Bot mit Heroku + Python
Machen wir einen Twitter-Bot mit Python!
Schritte zum Erstellen eines Twitter-Bots mit Python
Machen Sie eine Lotterie mit Python
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
[Super einfach] Machen wir einen LINE BOT mit Python.
Erstelle einen LINE-Bot mit Python + Heroku
Lassen Sie uns eine GUI mit Python erstellen.
Erstellen Sie ein Empfehlungssystem mit Python
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Lassen Sie uns mit Python langsam sprechen
Erstellen Sie ein Webframework mit Python! (1)
Erstellen Sie eine Desktop-App mit Python mit Electron
Erstellen Sie ein Webframework mit Python! (2)
Einfach! Implementieren Sie einen Twitter-Bot, der auf Heroku in Python ausgeführt wird
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Python-Anfänger haben beschlossen, einen LINE-Bot mit Flask zu erstellen (Flask-Kommentar)
Erstellen Sie mit Minette für Python einen LINE BOT
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Ich möchte ein Spiel mit Python machen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Ersetzen wir UWSC durch Python (5) Machen wir einen Roboter
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Erstellen Sie mit Amazon Lex einen LINE WORKS-Bot
Mattermost Bot mit Python gemacht (+ Flask)
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework
Machen Sie mit LINE + Flask einen morphologischen Analyse-Bot
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
[Übung] Erstellen Sie eine Watson-App mit Python! # 2 [Übersetzungsfunktion]
[Übung] Erstellen Sie eine Watson-App mit Python! # 1 [Sprachdiskriminierung]
Erstellen Sie einen einfachen Slackbot mit einer interaktiven Schaltfläche in Python
[Lass uns mit Python spielen] Ein Haushaltsbuch erstellen
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
[Zum Spielen] Versuche Yuma zu einem LINE Bot zu machen (Python)
Erstellen Sie mit Python Pandas Py Installer ein CSV-Formatierungswerkzeug
Was ist Gott? Erstelle einen einfachen Chatbot mit Python
Machen wir einen Discord Bot.
Twitter-Grafiknotiz mit Python
Holen Sie sich Twitter-Timeline mit Python
Verwenden Sie die Twitter-API mit Python
Erstelle Puyopuyo AI mit Python
Machen Sie einen LINE BOT (Chat)
Erstellen Sie ein Lesezeichen in Python
Suche nach Twitter-Tweets mit Python
Erstellen Sie ein Verzeichnis mit Python
Machen Sie ein Feuer mit kdeplot
Lassen Sie uns mit Python einen Web-Socket-Client erstellen. (Zugriffstoken-Authentifizierung)
Erstellen Sie einen Mastodon-Bot mit einer Funktion, die automatisch mit Python antwortet
Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen
Experimentieren Sie mit Python, um ein PDF für Selbstversorger für Kindle zu erstellen
Ich habe ein Skript geschrieben, um mit AWS Lambda + Python 2.7 schnell eine Entwicklungsumgebung für Twitter Bot zu erstellen
[Python] Was ist eine with-Anweisung?
Löse ABC163 A ~ C mit Python
Bedienen Sie den Belegdrucker mit Python