Créer un bot Twitter Trend avec heroku + Python

Objectif

Dans la version du navigateur et dans la version de l'application, vous ne pouvez voir que la tendance de Twitter top 30. Il est difficile de s'en tenir à la page des tendances tout le temps, et il est également difficile de voir les tendances dans __toute région __.

Utilisons donc l'API Twitter pour obtenir la tendance et créer un bot Twitter qui vous avertira lorsqu'un hashtag est dans la tendance. Vous pouvez utiliser l'API Twitter pour obtenir les tendances top 50 dans n'importe quelle région __. Peut-être qu'il peut être utilisé gratuitement. Je pense que cela fonctionne simplement en réécrivant une partie du code couvert dans l'article.

Si vous souhaitez simplement l'essayer localement, veuillez l'ignorer.

Texte

Préparation

Créer un compte Twitter pour bot

Veuillez le faire.

Préparation du répertoire

Créez un répertoire pour enregistrer les fichiers du bot. Enregistrez ici tous les fichiers créés ci-dessous. Ici, c'est vtuber-twitter-bot. En fin de compte, ça ressemble à ça.

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

heroku Cet article est détaillé. Enregistrons et installons la CLI. Puisqu'il fonctionne gratuitement, il n'est pas nécessaire d'enregistrer Creca.

Python 3.x J'écrirai le code du bot en Python 3.x. Les bibliothèques à installer sont les suivantes. Veuillez me faire savoir s'il y a des omissions. Peut-être que tout peut être installé avec pip.

Twitter API Cet article est détaillé. Notez la clé API, Consumer_secret, Access_token et Access_secret.

D'abord localement

Exécutez le code suivant. Vous verrez une liste de villes où vous pouvez obtenir des tendances. Trouvez la ville que vous souhaitez obtenir en vous basant sur country (nom du pays) et nom (nom de la ville), et notez le woeid.

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},
#>>     .
#>>     .
#>>     .

Je pense que le malheur suivant est suffisant pour obtenir la tendance mondiale, la tendance japonaise et la tendance des grandes villes du Japon. S'il y a une fuite, recherchez-la par la méthode ci-dessus.

woeid_dic = {'monde': 1, 'Japon': 23424856,
             'Tokyo': 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}

Si vous vous abstenez de «woeid», il est enfin temps de saisir la tendance.

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

#Imprimer uniquement le classement et le contenu des tendances
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)

la mise en oeuvre

Dans ce qui suit, à titre d'exemple, nous allons créer un bot qui avertit lorsqu'une balise de hachage appropriée entre dans la tendance. La conception est la suivante. Veuillez modifier la fréquence d'acquisition et la fréquence de notification le cas échéant. __ À ce stade, tenez compte de la limite d'API. __ (GET tendances / lieu est de 75 demandes / 15 minutes)

Si vous ne réécrivez que «dics.py», ce devrait être votre bot préféré. []( Si vous changez woeid_dic, changez également now_trend, tmp_record, recent_trends dans tools.py. )

Par souci de compréhension, nous vous recommandons d'essayer d'exécuter chaque code localement. Soyez prudent lors de l'exécution localement, car os.environ ['ENV_NAME'] est le code qui reçoit la valeur de la variable d'environnement ENV_NAME.

dics.py

dics.py


#Liste des balises de hachage pour lesquelles vous souhaitez être notifié en cas de tendance
check_trend  = ['#hashtag', '#tendance']

#Woeid dans la région pour obtenir la tendance
woeid_dic = {'monde': 1, 'Japon': 23424856}

tools.py

tools.py


import pickle
import os
import tweepy

from dics import check_trend, woeid_dic


#Se préparer à tweeter ou à récupérer des données sur 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: {}})

    #Obtenez des tendances et extrayez des régions / classements / mots de tendance
    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})

    #Extrayez uniquement les mots que vous souhaitez notifier des tendances acquises
    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)

    #Mettre à jour si le classement est supérieur à l'enregistrement précédent
    #Ajouter s'il y a une tendance qui ne fait pas partie de l'enregistrement passé
    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 != {'monde': {}, 'Japon': {}}:#, 'Tokyo': {}}:
    #    print('trend : ', new_record)

    #Extraire le classement des 10 notifications passées
    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 '[Notification de tendance]' in sp_tw[0]:
            hashtag = '#'+ tweet.entities['hashtags'][0]['text']
            for key_city in recent_trends.keys():
                try:
                    re_lev  = sp_tw[2].replace('Au cours des 15 dernières minutes, "{}"Mais{}Tendance'.format(hashtag, key_city), '').replace('Il semble qu'il ait atteint le rang.', '')
                    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

    #Lors de l'exécution d'une notification, tweetez si le classement est supérieur à la notification précédente
    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  = '[Notification de tendance]\n\n'
                    #tw_str  = '[Notification de tendance] Pendant l'opération d'essai\n\n'
                    tw_str += 'Au cours des 15 dernières minutes, "{}"Mais{}Tendance{}Il semble qu'il ait atteint le rang.'.format(trend_name, city, new_record[city][trend_name])
                    print(tw_str)
                    api.update_status(tw_str)
        #Effacez l'enregistrement lorsque vous tweetez
        os.remove(trend_log)

main.py

main.py


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

from tools import twitetr_trend_notification


#Ne tweet pas
@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


#vide. J'ai l'impression que je n'en ai pas besoin.

Déployer

Création de fichier

Créez runtime.txt, requirements.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

Premier déploiement

app-name est une bonne idée pour nommer le répertoire dans lequel vous souhaitez enregistrer votre code. Les commandes suivantes doivent être exécutées dans ce répertoire.

heroku login
heroku create app-name

Paramètres des variables d'environnement

Vous pouvez définir des variables d'environnement avec heroku config: set ENV_NAME =" VALUE ". Les quatre derniers sont exécutés tels quels. app-name est celui du début.

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

Déployer

app-name est celui du début.

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

entretien

Vous pouvez voir les journaux imprimés en exécutant la commande heroku logs -t dans le répertoire app-name.

Pour le débogage, il est plus facile de placer le script shell suivant dans le répertoire un niveau au-dessus du répertoire app-name. Après avoir modifié le code, exécutez ../ heroku_deploy.sh dans le répertoire app-name. En cas d'échec, définissez-le sur exécutable avec chmod u + x ../ heroku_deploy.sh.

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

Créer un bot Twitter Trend avec heroku + Python
Faisons un bot Twitter avec Python!
Étapes pour créer un bot Twitter avec Python
Faites une loterie avec Python
J'ai essayé de faire LINE BOT avec Python et Heroku
[Super facile] Faisons un LINE BOT avec Python.
Créez un bot LINE avec Python + heroku
Faisons une interface graphique avec python.
Créer un système de recommandation avec python
Faisons un graphe avec python! !!
Créez un Twitter BOT avec le SDK GoogleAppEngine pour Python
Faisons un jeu de shiritori avec Python
Faisons la voix lentement avec Python
Créez un framework Web avec Python! (1)
Créez une application de bureau avec Python avec Electron
Créez un framework Web avec Python! (2)
Facile! Implémenter un bot Twitter qui s'exécute sur Heroku en Python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Les débutants en Python ont décidé de créer un bot LINE avec Flask (commentaire approximatif de Flask)
Créer un LINE BOT avec Minette pour Python
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
Remplaçons UWSC par Python (5) Faisons un robot
Essayez de créer un groupe de dièdre avec Python
Créer un bot LINE WORKS avec Amazon Lex
Made Mattermost Bot avec Python (+ Flask)
Si vous voulez créer un bot discord avec python, utilisons un framework
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
Faisons un outil de veille de commande avec python
[Pratique] Créez une application Watson avec Python! # 2 [Fonction de traduction]
[Pratique] Créez une application Watson avec Python! # 1 [Discrimination linguistique]
Créez un Slackbot simple avec un bouton interactif en python
[Jouons avec Python] Créer un livre de comptes de ménage
Essayez de créer un jeu simple avec Python 3 et iPhone
Faire un point d'arrêt sur la couche c avec python
[Pour jouer] Essayez de faire de Yuma un robot LINE (Python)
Créer un outil de formatage CSV avec Python Pandas Py Installer
Qu'est-ce que Dieu? Créez un chatbot simple avec python
Faisons un robot Discord.
Mémo graphique Twitter avec Python
Obtenez la chronologie Twitter avec Python
Utiliser l'API Twitter avec Python
Créez Puyopuyo AI avec Python
Créer un LINE BOT (chat)
Créer un bookmarklet en Python
Rechercher des tweets Twitter avec Python
Créer un répertoire avec python
Faire un feu avec kdeplot
Créons un client de socket Web avec Python. (Authentification par jeton d'accès)
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
Associez Python Enum à une fonction pour la rendre appelable
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
[Python] Qu'est-ce qu'une instruction with?
Résoudre ABC163 A ~ C avec Python
Faites fonctionner l'imprimante de reçus avec python