2017-02-18 10 views
0

私は3時間ごとにテキストファイルから行をつぶすHerokuで設定されたPython Twitterbotを持っています。 Herokuのワーカーdynoが少なくとも1日1回リフレッシュしてから、Twitterbotのツイートがファイルの先頭からやり直していることを除けば、魅力的なように機能しています。これは明らかに私が望むものではありません。Heroku Python Twitterbot - Worker Dynoは毎日更新します

作業者のdynoの更新を次のuntweetされた行にどのように反映させるべきかについてのアドバイスはありますか?

ボットのコードは非常に簡単で、ここに含まれている:

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. DBを使用すると、Heroku's own Postgresのようになります。 SQL Alchemyを使用すると、タイムスタンプと最後に読み込んだ行を保存して照会することができます。残念ですが、この方法で統計情報を保存することもできますし、DBを持つことの他の細部もあります。それは多くの時間やコード行を取ることはありませんし、それはうまくいきます。

  2. Redis' pugin for Herokuを使用。 SQL DBMSを使用するよりも簡単です。インストールされると(リンクの指示に従って)、2行のコードが必要になります。あなたはそれがfrom store import redis

    その後のような何かをしようとインポートする必要が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スクリプトの睡眠を作ることに注意し

が、それがPythonのsleepコマンドを実行しているので、dynoはスリープしません。

あなたのdynoをスリープ状態にしたい場合は、プログラムをスケジュールに従って実行する(アドオン/スケジューラをチェックする)だけです(これを行うには、投稿したコードを変更してワンショットスクリプトではなく、無限サイクル)

お知らせ:私はまだ、私は個人的に保存された状態を維持する必要はありません...私のdynosで これを試してみませんでした。

関連する問題