1時間おきにブログ記事を自動で呟けるようにした話

前回の課題を解決しましたので、簡単に共有。

前回やったこと

  • 決まった時間にツイート
  • 定期的に自動フォロー

この2つをPythonとherokuで作りました。詳細は以下記事。

前回の課題

上手いこと定期実行出来たのはいいんですが、3つほど課題が残りました。

  • よく考えたらherokuの時間指定アメリカだから意味わからない時間に実行しているのでは
  • 毎回まとめてツイートしちゃうのどうにかしたい
  • 検索で引数2つしかとれないの弱い

今回は上2つの対応をしていきます。

1. 時間指定問題を解決する

Twitterで記事あげるときって20時くらいがちょうどいいという噂を聞いていたので、 そこを狙って作っていたにもかかわらず、なぜか13時ごろツイートが実行されてしまう問題

これを解決するのに、とりあえず時差を考慮して時間を設定し直しました。
過去のツイート時間を見ると17時間ほどずれている様子。
そしてどうせ直すなら19時〜23時くらいまで1時間おきにツイートできるようにしたい。

というわけで、こんな感じに変更。

@sched.scheduled_job('cron', hour=2)
@sched.scheduled_job('cron', hour=3)
@sched.scheduled_job('cron', hour=4)
@sched.scheduled_job('cron', hour=5)
@sched.scheduled_job('cron', hour=6)
def scheduled_job():
    autoTweet()

これで上手いこといくはず。 実はこの記事書いているときに、時間設定上手くいってなかったことが発覚したので、結果は今晩わかります。

2. 1時間おきに、違う記事をツイートする

上の方法で、1時間おきにcronを実行することができるので、
今度はそこでツイートする内容を詰めていきます。

理想は、毎回違うツイートがランダムに投稿されること。
そうすれば記事が増えても、リストに追加するだけで毎日5件ずつ記事をつぶやいてくれる。

やり方は非常に簡単で、
1. リストを用意する
2. 無限ループで乱数を回し、それを添え字にしてツイートする

このときに、同じツイート内容だとduplicateで弾かれるはずなので、
try文でくくることで、失敗したらもう一回乱数発生させて成功するまで繰り返すって感じにしています。
今のところうまいこと5個の記事が順番につぶやかれているので成功してるみたい。

import random
def autoTweet():
    tweets=[
        "PythonとSeleniumで自分のツイートを抽出する - 駆け出し眼鏡のプログラミング道場 http://taikomegane.hatenablog.jp/entry/2017/07/01/173359",
        "JavaとSeleniumで自分のツイートを抽出する - 駆け出し眼鏡のプログラミング道場 http://taikomegane.hatenablog.jp/entry/2017/07/01/201337",
        "NewsPicksでスクレイピングやってみた - 駆け出し眼鏡のプログラミング道場 http://taikomegane.hatenablog.jp/entry/2017/05/28/235823",
        "Tweepyでpythonについて呟いたアカウントをフォローしまくってみた - 駆け出し眼鏡のプログラミング道場 http://taikomegane.hatenablog.jp/entry/2017/07/08/151110",
        "フォローとツイートを定期実行してみた - 駆け出し眼鏡のプログラミング道場 http://taikomegane.hatenablog.jp/entry/2017/07/31/220047"
        ]

    while True:
        index = random.randint(0,4)
        try:
            api.update_status(tweets[index]) 
            print('ツイートに成功しました')
            break
        except:
            continue

oauth認証などは過去記事を参照してください。

taikomegane.hatenablog.jp

結果はこんな感じ。

無事上手くいきました。 あとは検索条件ですね。ここはそんなに重要度高くないので後回しにしちゃうけど、そのうち対応します。

それでは。