#この記事の目的
- 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
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的なやつ)
よく知らなかったこと・今もわからないこと・後で覚えておきたいこと
- grep / fgrepの違いとか
- crontabを1秒おきに指定する方法
- 普通に使うと最短で1分らしい。
- ps -aef | grep cron : プロセスを見つけて、検索しているっぽい
- シェルスクリプトで、ログファイルを上書きして追加したいときは>>を使う
- シバンもよくわからなかった
- ○○.shを./○○.shで実行できるようにする
- tailf ファイル名:リアルタイムでファイルが更新されているのが見れる
- less F ファイル名でもできるらしい