はじめに
「PythonでTwitter使ってやるぜ!」と意気込んで、アプリーケーション登録を済ませてからあっという間に3ヶ月がたちました。何か作らねば…と考えていたところ、xkcdでこんな話を見つけました。
Factoring the Time - xkcd.com
この男性(?)が暇つぶしにしていた、時刻を素因数分解する作業を自動化し、結果をつぶやいてくれるbotを作りました。
こんな感じで動きます。
環境
- Ubuntu 16.04
- Python 2.7
- tweepy
- sympy
- datetime
- time
手順
何はともあれアプリケーション登録です。たくさん記事が書かれているので、ここでは割愛します。「twitter python 登録」とかでググると、いくつか出てくるはずです。
token
というファイルを作り、そこに取得した文字列を書き込みます。
"Consumer Key"
"Consumer Secret"
"Access Token"
"Access Secret"
こんな感じで書き込んだら、同じディレクトリにmain.py
を作って編集します。
# coding:utf-8
import tweepy
from datetime import datetime
import sympy
import time
def login():
with open("token") as f:
(consumer_key,
consumer_secret,
access_token,
access_secret) = f.read().split("\n")[:4]
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
return api
def get_factor_by_string(i):
d = sympy.factorint(i)
return "*".join(str(fact) for fact in d for num in range(d[fact]))
def get_time_by_int():
return int(datetime.now().strftime('%H%M'))
def main():
api = login()
old = get_time_by_int()
while True:
now = get_time_by_int()
if now != old and now != 0 and now != 1:
old = now
factor = get_factor_by_string(now)
if "*" in factor:
text = str(now) + "=" + factor
else:
text = str(now) + " is a prime number"
api.update_status(text)
time.sleep(0.1)
if __name__ == '__main__':
main()
実行すると、ほぼ毎分時刻を素因数分解した結果をつぶやいてくれます。やったね!
解説
するまでもないと思いますが、一応…。
プログラムの流れはこんな感じです
①tweepyでtwitter認証
②datetimeで現在時刻を取得
③すでにつぶやいた時刻ならば②に戻る
④sympyで素因数分解、書式を変える
⑤結果をツイート(②に戻る)
login()
でtokenにある情報を使い、Twitterの認証を行っています。get_time_by_int()
でdatetime.now().strftime()
を使い、現在時と現在分をくっつけた数字を取得します(12:30→1230みたいな感じ)。ここで、すでにつぶやき済みの時間であるか、もしくは返ってきた数字が0または1である場合には次の処理に入りません。素因数分解にはsympy.factorint()
を使っています。結果は{素因数:指数,素因数:指数...}という辞書型で返ってくるので、forを使って指数を使わない掛け算だけの形に直してあげます。最後に素因数分解の結果に*が入っているか(時刻の数字が素数か)でメッセージを変えて、api.update.status()
でつぶやきます。
処理のほぼすべてをライブラリに頼った結果、50行未満に収まりました。Pythonすごい。
おわりに
初のbot作成でしたが、単純なものなら結構簡単に作れると分かりました。
適当に実行してるので時々止まったりしますが、あと数日は動かしたいです。