Heroku Python Twitterbot - 工作者Dyno每日更新

时间:2017-02-18 14:32:43

标签: python heroku twitter bots tweepy

我有一个使用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

1 个答案:

答案 0 :(得分:0)

问题:Heroku每天刷新文件系统和内存,因此将变量保存在内存中或存储在文件中是不行的。

<强>解决方案

首先,我已经看到周围的人建议将状态存储在环境变量中,但这也会得到更新,所以这也不可行......

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

  2. 使用Redis' pugin for Heroku;它也不需要花费太多精力,并且比使用SQL DBMS更简单。一旦安装(根据链接的说明),您只需要两行代码。

  3. 使用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命令。

    如果你想让你的dyno睡觉,只需安排(检查插件/调度程序)程序按计划运行(为此,你需要更改我发布的代码,这样它就是一次性脚本而不是无限循环)

    注意:我还没试过...... 在我的dynos中,我个人不需要保存状态。