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.
Veuillez le faire.
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.
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)
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.
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
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
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
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
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