我有一个使用Heroku设置的Python Twitterbot,每隔3小时从文本文件中发送一行。除了Heroku工作者dyno每天至少刷新一次之外,它一直像魅力一样工作,然后Twitterbot从文件的开头再次推文,这显然不是我想要的。
有关如何通过工作人员dyno刷新到下一个不受欢迎的行的任何建议吗?
机器人的代码非常简单,包含在这里:
import tweepy, time
from credentials import *
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)
# What the bot will tweet
filename = open('.txt','r')
tweettext = filename.readlines()
filename.close()
for line in tweettext:
api.update_status(line)
time.sleep(10800) # Sleep for 3 hours
except tweepy.error.TweepError:
pass
答案 0 :(得分:0)
问题:Heroku每天刷新文件系统和内存,因此将变量保存在内存中或存储在文件中是不行的。
<强>解决方案强>:
首先,我已经看到周围的人建议将状态存储在环境变量中,但这也会得到更新,所以这也不可行......
使用数据库,如Heroku's own Postgres;然后使用SQL Alchemy,您可以存储和查询时间戳和最后一行读取。这可能是矫枉过正,但这样你也可以存储统计数据,以及拥有数据库的其他细节。它不需要花费太多时间或代码行,而且效果很好。
使用Redis' pugin for Heroku;它也不需要花费太多精力,并且比使用SQL DBMS更简单。一旦安装(根据链接的说明),您只需要两行代码。
首先,您需要导入from store import redis
然后尝试类似的事情:
f = open('.txt','r')
# teet first line
tweetline = f.readline()
api.update_status(tweetline)
redis.set('line', 1) # store line number
f.close()
time.sleep(10800) # Sleep for 3 hours
#tweets all other lines
while true:
f=open('filename')
lines=f.readlines()
current = int(redis.get('line'))
tweetline = lines[current]
redis.set('line', current + 1)
f.close()
time.sleep(10800) # Sleep for 3 hours
请注意,您使用的sleep(10800)
使python脚本处于休眠状态,但dyno将无法休眠,因为它正在执行python的sleep命令。
如果你想让你的dyno睡觉,只需安排(检查插件/调度程序)程序按计划运行(为此,你需要更改我发布的代码,这样它就是一次性脚本而不是无限循环)
注意:我还没试过...... 在我的dynos中,我个人不需要保存状态。