2018-04-08

Python3でCrontabを設定し指定したキーワードからツイッターのいいねの自動実行を行う

#この記事の目的


  • PythonでCRONTABを利用して、いいね自動化プログラムを定期実行する方法をまとめます。
  • 内容としては主に以下の内容となります
    • CRONTABとは何かという話
    • 実際にCRONTABを使うときに必要な知識
    • PythonコードをCRONTABから実行する方法


CRONTABとは


  • 指定した時間に、ファイルを実行してくれる機能です。
  • 同じような処理を何度も実行したい場合に便利です。
  • PCが起動していれば、なんどでも同じ処理を実行することができます
  • Linux系のOSには標準でついているらしい(Windowsだとタスクスケジューラなるものがあるらしい)

CRONTABの書き方


  • 時間の指定の仕方に癖がありますが、覚えてしまえばこっちのものです。
  • 具体的な書き方については、下記記事を参照するとわかりやすいです。

crontabの書き方 | server-memo.net

crontabの書き方 検証環境 OS CentOS 4.4 crontabについて 設定した時間になったら定期的にコマンドを実行してくれる、ナイスガイですw 設定方法をすぐに忘れるのでメモ代わりに:-p 設定方法 crontab 書式 crontab { -l | -r | -e } オプションの使い方 -u オプション -u どのユーザがcrontabを設定するのかを指定します。省略した場合はcrontabコマンドを実行したユーザで設定されます。 # crontab -u tamo -l 1 * * * * echo "cron test" -l オプション -l オプションは、現在の crontab を標準出力へ表示させる。 $ crontab -l 1 * *


  • Linuxなら crontab -eで呼び出すと、VIMで起動されます。
  • いくつかのサンプルを書いてみます
    • 毎時15分に1回: 15  *  *  *  *
    • 毎日4:02に実行: 02  4  *  *  *
    • 10分ごとに実行: */10  *  *  *  *
    • 1分ごとに実行: * * * * * 
  • ぼくが今回書いたコードのcrontabはこんな感じでした。crontab -eで編集できます

kdmgs110@DESKTOP-4HHEO95:/mnt/c/workspace/pydev/tweet-analyser$ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 * * * * python3 /mnt/c/workspace/pydev/tweet-analyser/autoLike.py progate >> /mnt/c/workspace/pydev/tweet-analyser/autoLike.log



  • 30 * * * * ⇒ 30分に一回実行
  • フルパスで実行しないとダメらしいです。
    • python3 /mnt/c/workspace/pydev/tweet-analyser/autoLike.py progate
  • 実行結果をautoLike.logに保存 (>>で結果を渡せる)
    •  >> /mnt/c/workspace/pydev/tweet-analyser/autoLike.log


30 * * * * python3 /mnt/c/workspace/pydev/tweet-analyser/autoLike.py progate >> /mnt/c/workspace/pydev/tweet-analyser/autoLike.log

WSL(Windows Subsystem For Linux)からCRONTABを設定する

  • crontab -eでviが起動する

CRONTABを起動する



  • $ sudo service cron start で起動する
  • ps -aef | grep cron でプロセスが生きているか確認。ルート権限で存在するらしい。
root 975 1 0 17:24 ? 00:00:00 /usr/sbin/cron
USER 992 2 0 17:26 tty1 00:00:00 grep --color=auto cron


PythonでTweepyを使っていいねしたスクリプト


  • 引数にキーワードを入れるといいねしてくれるスクリプト


autoLike.py

import tweepy
from config import CONFIG
import time
import sys
from datetime import datetime

def searchTweets(query):
    tweets = api.search(q=query, count=100)
    return tweets

def likeTweets(tweets, keyword_id):
    like_count = 0
    created_at = datetime.now().strftime("%Y%m%d%H%M%S")
    for tweet in tweets:
        #DB:ID KEYWORD_ID CREATED_AT USER_ID USER_NAME TWEET_ID CONTENT IS_FOLLOWER
        user_id = tweet.user._json['screen_name']
        user_name = tweet.user.name
        tweet_id = tweet.id
        content = tweet.text
        try:
            api.create_favorite(tweet_id) #フォロワーでなければいいねする
            #insertLikeRecord(keyword_id, created_at, user_id, user_name, tweet_id, content, is_follower) #結果をDBに保存する
            print("[INFO]likeレコードを追加しました。user_id:{}".format(user_id))
            like_count += 1
            print("[INFO]いいね数: {}".format(like_count))
        except Exception as e:
            print("[ERROR]いいねに失敗しました: {}".format(e))
            if e.response and e.response.status == 88:
                print("[INFO] rate limitの上限値を超えたので、15分待機後に実行します。")
                time.sleep(60 * 15)
            if e.response and e.response.status == 139:
                print("[ERROR] すでにいいねをしているツイートです")
    return like_count

if __name__ == '__main__':

    args = sys.argv
    query = args[1]
    print("[INFO]「{}」で検索したツイートを取得し、いいねします".format(query))

    # 各種ツイッターのキーをセット
    CONSUMER_KEY = CONFIG["CONSUMER_KEY"]
    CONSUMER_SECRET = CONFIG["CONSUMER_SECRET"]
    ACCESS_TOKEN = CONFIG["ACCESS_TOKEN"]
    ACCESS_SECRET = CONFIG["ACCESS_SECRET"]

    #Tweepy
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
    #APIインスタンスを作成
    api = tweepy.API(auth)

    tweets =  searchTweets(query)
    likeTweets(tweets, 0)


CRONTAB使うときに覚えておえておきたいコマンド


crontab -e : crontabを編集できる (vi的なやつ)
crontab -l : 実際のcrontabの中身を見ることができる(cat的なやつ)

よく知らなかったこと・今もわからないこと・後で覚えておきたいこと









注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...