事象発生日:2017-08-05
記事公開日:-
アクセス数:8185
334ツイート競争において,自分や他人のツイートの正確な時間が知りたいことがある.
公式クライアントからでは分単位でしかわからないので,ミリ秒単位でリプを飛ばしてくれるBotを作成した.
トップ画像の出典はこちら.
Twitter APIなどの環境構築については,「」を参照のこと.
Ubuntu Server 16.04.2 LTS
Python 2.7.12
TLより334を含むツイートを取得し,ツイート時刻を返すスクリプトは下のようになる.
ツイートIDから時刻を取得する方法は,を参考にした.(はおそらくRubyで実装していた.)
また,APIを叩いて返ってくるJSONは,どうやらユニコード文字列のようだ.(つまりPythonのstr
関数は使えない.)
# coding: UTF-8 import sys import os from requests_oauthlib import OAuth1Session import json import time import datetime import locale CONSUMER_KEY = '*************************' CONSUMER_SECRET = '**************************************************' ACCESS_TOKEN = '**************************************************' ACCESS_TOKEN_SECRET = '*********************************************' LOG_FILE = '${path}/log_334.log' def main(args): twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET) # TL取得 params = { "count" : 200, # ツイートを最新から何件取得するか(最大200件) "exclude_replies" : "true", # リプライを含めないか } req = twitter.get("https://api.twitter.com/1.1/statuses/home_timeline.json", params = params) timeline = json.loads(req.text) if (str(req) != "<Response [200]>"): # 追記モードで出力 f = open(LOG_FILE, "a") try: # 文字列を出力 f.write(GetStringTime()+"\t"+str(req)+"\tat home_timeline.json\n") #=> test12345test finally: f.close() ps(req) ps("\n") ps("##############################\n") i = 0; for tlTweet in timeline: ps("["+str(i)+"]\n") i += 1; ps(tlTweet["id"]) ps("\n") ps(tlTweet["user"]["screen_name"]) ps("\n") # 基本的にユニコード文字列? 取得できるJsonって. ps(tlTweet["text"].encode('utf-8')) # pu(tlTweet["text"]) ps("\n") if (tlTweet["text"].find(u'334') > -1): # リプ飛ばす st = TweetId2Time(int(tlTweet["id"])) params = {"status" : "@" + tlTweet["user"]["screen_name"] + u"\nついーと時刻は,\n" + st + u"\nです.\n[Bot]", "in_reply_to_status_id" : tlTweet["id"], } req = twitter.post("https://api.twitter.com/1.1/statuses/update.json", params = params) if (str(req) != "<Response [200]>"): # 追記モードで出力 f = open(LOG_FILE, "a") try: # 文字列を出力 f.write(GetStringTime()+"\t"+str(req)+"\tat update.json\n") finally: f.close() ps(req) ps("\n==================================\n") ps("\n\n") ps("\n") ps("\n") def ps(output): sys.stdout.write(str(output)) sys.stdout.flush() def pu(output): sys.stdout.write(output) sys.stdout.flush() def TweetId2Time(id): epoch = ((id >> 22) + 1288834974657) / 1000.0 d = datetime.datetime.fromtimestamp(epoch) stringTime = "" stringTime += str(d.year) stringTime += '-' stringTime += '{0:02d}'.format(d.month) stringTime += '-' stringTime += '{0:02d}'.format(d.day) stringTime += ' ' stringTime += '{0:02d}'.format(d.hour) stringTime += ':' stringTime += '{0:02d}'.format(d.minute) stringTime += ':' stringTime += '{0:02d}'.format(d.second) stringTime += '.' stringTime += '{0:03d}'.format(d.microsecond / 1000) return stringTime def GetStringTime(): d = datetime.datetime.today() stringTime = str(d.year) stringTime += '.' stringTime += '{0:02d}'.format(d.month) stringTime += '.' stringTime += '{0:02d}'.format(d.day) stringTime += '-' stringTime += '{0:02d}'.format(d.hour) stringTime += '.' stringTime += '{0:02d}'.format(d.minute) stringTime += '.' stringTime += '{0:02d}'.format(d.second) stringTime += '.' stringTime += '{0:02d}'.format(d.microsecond / 10000) return stringTime if __name__ == '__main__': main(sys.argv)
今回も例によって例の如くソースコード編集ユーザーと実行ユーザーが違ったので,適当にパーミッションを変更.
$ sudo chmod 767 334timechecker.py
今回は3:35と3:40に実行するようにした.
重複してReplyを送ってしまいそうだが,Twitterでは短い時間内に同じ内容を投稿できず,APIを叩いたときに403が返ってくるので,ひとまずは問題ない.
まあ,暇な時にでもきちんと実装します.
# バックアップは重要 $ crontab -l > ~/crontab.backup $ crontab -e # 以下を追記 35,40 3 * * * python /home/share/script/twitter/334timechecker.py > /dev/null 2>&1
名前
Email (※公開されることはありません)
コメント