Twitter のリプライの時刻と Python で処理した時刻の差を求める

時間が無かったので書き溜めから投稿します。 twitter からリプライをもらった時刻から、実際にPython で処理した時刻までの時間を返す関数が欲しかったので、少し考えてみました。

使用するモジュールのインポート

まずは使うモジュールのインポートをします。

import twitter
import time
import email.utils

twitter からリプライをもらった時刻の取得

次に twitter からリプライをもらった時間を取得します。

API の取得

keyは環境変数からos.environで読み込むのが良いと思いますが略します。

api = twitter.Api(consumer_key="hoge",
                  consumer_secret="hoge",
                  access_token_key="hoge",
                  access_token_secret="hoge"
                  )

rfc2822 形式で時刻を取得

time_of_reply = api.GetMentions()[0].AsDict()[‘created_at’] で取得できます。その結果、以下のような文字列が返されます。

>>> time_of_reply = api.GetMentions()[0].AsDict()['created_at'] 
>>> time_of_reply
'Tue Jun 06 14:27:54 +0000 2017'

上のように返ってきた時刻は rfc2822 形式で、タイムゾーンは考慮されていません。

秒に変換

rfc2822 形式はemail.utils.parsedate(date) でパースできます。

>>> email.utils.parsedate(time_of_reply)
(2017, 6, 6, 14, 27, 54, 0, 1, -1)

のようなタプルが返されます。この9桁はそのままtime.mktime()に通して秒に変換できます。 日本は標準時 +9時間なので、それに9*60*60を足せばいいんですね。

>>> time.mktime((email.utils.parsedate(time_of_reply))) + (9*60*60)
1496759274.0

これでツイッター側のリプライの時刻を秒で取得できました。

Python で処理する時刻の取得

一方で、現在の時刻(秒)はtime.mktime(time.localtime())で取得できます。

>>> time.mktime(time.localtime())
1496759535.0

twitter からリプライをもらった時刻から、実際にPython で処理した時刻までの時間

>>> (time.mktime(time.localtime()))-(time.mktime((email.utils.parsedate(time_of_reply))) + (9*60*60))
328.0

という様に、秒で取得できます。ただ、twitterとサーバーのタイムゾーンの設定がずれてると悲しいことになるので、herokuなどで動かしてる場合は設定が必要だと思われます。