繁体   English   中英

Heroku Python Twitterbot —工人Dyno每天刷新

[英]Heroku Python Twitterbot — Worker Dyno Refreshes Daily

我有一个用Heroku设置的Python Twitterbot,它每3小时从一条文本文件发送一条推文。 除了Heroku的dyno每天至少刷新一次,然后Twitterbot从文件的开头再次发推文外,它的工作方式一直很吸引人,这显然不是我想要的。

关于如何通过worker 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

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

解决方案

首先,我已经看到有人建议将状态存储在环境变量中,但是这种情况也有所刷新,因此这也不可行...

  1. 使用数据库,例如Heroku自己的Postgres 然后使用SQL Alchemy,您可以存储和查询时间戳以及最后读取的行。 也许这是矫kill过正,但是通过这种方式,您还可以存储统计信息以及拥有数据库的其他好处。 它不需要花费很多时间或代码行,而且效果很好。

  2. Redis的pugin用于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命令。

如果您想让dyno入睡,只需计划(检查加载项/调度程序)程序按计划运行(为此,您需要更改我发布的代码,因此该脚本是一次性脚本而不是无限循环)

注意 :我还没有尝试过...在我的测功机中,我个人不必保存状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM