フォローとツイートを定期実行してみた

久しぶりの投稿。 なんやかんやと毎週勉強してはいるのだけど、ブログにするのが面倒で放置してました。 今日同じ処理するのに迷ったので、備忘録的にあげます。

やりたいこと

  • ブログのURLをツイートしたい
  • 興味ありそうな人をフォローしたい
  • 全部自動で定期実行したい

ちなみに前回あげたこの記事の続きなので、oauth使うところは飛ばします。

taikomegane.hatenablog.jp

使ったもの

  • Tweepy
  • heroku

Tweepy Documentation — tweepy 3.5.0 documentation

devcenter.heroku.com

実際にやってみた

1. 自動ツイートしたい

今回は最終的にrun.pyを用意して、そこから呼び出したいので、全て関数で実装しています。

コードはこんな感じ。

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"
        ]

    for tweet in tweets: # リストの中身を1つずつ取り出してツイート
        api.update_status(tweet) # update_statusでツイートできる

まずtweetsをリストにしてひたすらつぶやきたい内容を追加します。 あとはforループで、api.update_statusでつぶやくだけ。 簡単ですね。

ただこれだと、一斉に4ツイート流れてしまうので、 適当に時間の感覚をあけてつぶやいてもいいかも。

引数を用意して、リストの添字で呼び出せばOKかな。今度作ります ひとまずこれで一つ目の要望はクリア

2.興味ありそうな人をフォローしたい

これはこのブログからのもらいものを修正したものです。

review-of-my-life.blogspot.jp

  def autoFollow (num, query, count): # 引数にクエリーの数、クエリー、検索数を入力

    if num == 1: # クエリー1つならqに代入
        q = query

    else: # クエリーが2つなら、ANDを挟んでqに代入
        keywords =[query[0], query[1]]
        q = ' AND '.join(keywords)

    # searchで検索をかける(q=クエリ、countは検索数、langで日本語のみに絞れる
    search_results = api.search(q=q, count=count, lang="ja")

    for result in search_results: # 検索結果を順に処理
        screen_name = result.user._json['screen_name'] # 取り出した結果からscreen_nameを取り出す

        # 検索結果に自分が含まれるとエラーになるので、try文でくくる
        try:
            # create_friendshipでフォローする
            api.create_friendship(screen_name)

        # エラーのときは飛ばす
        except:
            continue

複数語句での検索もできるようにしました。

またpythonとかtwitterとかで検索かけると、 日本語以外のツイートがかなり混ざってしまうので、lang="ja"で日本語指定をしています。

もう一つ躓いたポイントとして、 create_friendshipで自分をフォローしようとするとエラーになって 処理が止まってしまうので、try文でくくる必要があります。

3. 自動実行したい

ここからが本番です。 今回はherokuを使って自動実行していきます。

まずAPSchedulerを使って自動実行の設定を行います。

Advanced Python Scheduler — APScheduler 3.5.0.post13 documentation

from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler() #インスタンス化

# @以下で定期実行の設定ができる
# intervalなら20分おきに実行
@sched.scheduled_job('interval', minutes=20)
def timed_job():
    print('This job is run every twenty minutes.')

# cronは御存知の通り。これだと9時に実行
@sched.scheduled_job('cron', hour=9)
def scheduled_job():
    autoFollow(2,["スクレイピング","python"],20)

# 20時に勝手にツイート
@sched.scheduled_job('cron', hour=20)
def scheduled_job():
    autoTweet()
    print('ツイートに成功しました')

sched.start() # おまじない?

とまあこんな具合に、前に作った関数を呼び出して実行していきます。 @sched.scheduled_jobで引数にintervalとかcronつけるだけで自動で実行できるんだからすごい

これでファイルの準備はひとまずできたので、herokuの準備をしていきます。 herokuのユーザ登録とかその辺はとりあえず他の記事に譲って、 実行に必要なファイルを作成していきます。

作成するファイルは以下3つ。

  • Procfile
  • requirement.txt
  • runtime.txt

どれもパッと作れます

clock: python3 run.py

今回は定期実行をしたいので clock ウェブページあげたかったらwebだし、ぼっとならbot その辺りはググってください。

APScheduler==3.0.0
cryptography==1.7.1
idna==2.2
oauthlib==2.0.2
pyasn1==0.1.9
pycosat==0.6.1
pycparser==2.17
pyOpenSSL==16.2.0
requests==2.12.4
requests-oauthlib==0.8.0
six==1.10.0
tweepy==3.5.0
twitter==1.12.1

いらないのも入ってそうな感じ。 ここに入っているものを立ち上げ時に読み込んでくれます

大事なのは、APSchedulerとtweepyかな

python-3.6.1

pythonのバージョンを指定するだけ。簡単。

ここまでできたら、以下のコマンドを順に行っていきます。

初めてのときだけ

heroku login #ログインする
heroku git:clone -a アプリ名

以下は毎回共通。

git add . #全部突っ込んで
git commit -m "update" #コミットして
git push heroku master #heroku masterにプッシュ
heroku ps:scale clock=1 #最後にプロセスを起動?して終わり

ちなみに、heroku logsで実行ログを見れるので、そこで結果を確認できます。

ひとまずここまで。

今後の課題

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