2017-02-18 80 views
0

我有一个Python的Twitterbot设置Heroku,每3小时从文本文件推文一行。它一直像魅力一样工作,除了Heroku工人动态测试仪每天至少刷新一次,然后Twitterbot再次从文件开始推文,这显然不是我想要的。Heroku Python 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

问题:Heroku的日常刷新两个文件系统和内存,因此保持在内存中的变量或存储上的文件是一个没有去。

解决方案

首先,我看到周围的人提出来存储环境变量的状态,但被刷新为好,所以这也是不可行的......

  1. 使用数据库,如Heroku's own Postgres;然后使用SQL Alchemy,您可以存储和查询时间戳并读取最后一行。这可能是矫枉过正,但是这样你也可以存储统计信息,以及拥有数据库的其他细节。它不需要太多的时间或代码,并且收益良好。

  2. 使用Redis' pugin for Heroku;它并不需要太多的努力,而且比使用SQL DBMS更简单。一旦安装(按照链接的说明),你只需要两行代码。

使用Redis的

首先,你需要将其导入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命令。

如果你想要你的动态睡眠,只需安排(检查插件/调度程序)程序运行的时间表(这样做,你需要改变我发布的代码,以便它是一次性的脚本,而不是一个无限循环)

注意:我并没有尝试了这一点... 在我DYNOS我个人没有保持存储的状态。