はい。たぶん探せばこんな感じのドコかにあるんじゃないかなぁと思うのですがなんとなく自前で行いたかったので。
想定している環境、使い方
主たる自分のtwitterアカウントから雑用のbotアカウントへおはよう/おやすみを@付きで投げて受け取った時間を基準に計算する。
#!/usr/bin/env python
# -*- coding:UTF-8 -*-
from urllib import urlencode
import re
import random
import datetime
import tweepy
import oat #ウチのbot機能用にOAuthトークン収納させてます
jikan = datetime.datetime.now()
#動かしている間隔と適当にバランス取ってこれくらいで
#取りこぼしはないかな、と。
tl = oat.api.mentions_timeline()
for i in range(1,5):
tll=tl[i].text
if re.search(u'@xxx おやす', tll):
jk = tl[i].created_at
# jk = jikan.strftime('%Y/%m/%d %H:%M:%S')
t = open('/kanri.txt', 'w')
t.write(str(jk))
t.close()
# tane = 'お疲れ様でした。おやすみを{0:02d}時{0:02d}分でセットしました。'.format(jikan.hour, jikan.minute)
tane = 'お疲れ様でした。おやすみを%s時%s分くらいでセットしました。' % (str(jk.hour+9), str(jk.minute))
i+=5
elif re.search(u'@xxx おはよ', tll):
f = open('/kanri.txt', 'r')
line = f.read()
jk = tl[i].created_at
sabun = jk- datetime.datetime.strptime(line, "%Y-%m-%d %H:%M:%S")
f.close()
tane = 'おはようございます。twitter利用差分から推定睡眠時間は%sくらいです。' % str(sabun)
break
else: pass
oat.client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST', urlencode({'status': tane}))
はい、変数名も適当で全てが雑です。
推定睡眠時間の差分返すのも整えようと思ったのですが上手く行かなかったので断念しました。daysで日にち差とsecondsで秒の差分はすぐ使えるんですが、hourとminuteは別途計算させるかstrでキャストして整形か正規表現で抜くかしか思いつかなく。。目的は時間計算さすだけなのでとりあえずコレで使いながら修正を重ねる予定です。
同一投稿の防止について
http://qiita.com/clarinet758/items/2a2f2ed176a5b25ae0d2
2013/11/28
同一投稿の防止も含めた修正版
#!/usr/bin/env python
# -*- coding:UTF-8 -*-
import urllib2
import lxml.html
from urllib import urlencode
import re
import random
import oat
import datetime
import tweepy
import json
y = datetime.datetime.now()
tll = oat.api.mentions_timeline()
## word
aut=u'自分のスクリーンネーム'
bot=u'ボットのスクリーンネーム'
oya=re.compile(u'おやすみ')
otu=re.compile(u'お疲れ様でした')
you=re.compile(u'おはよう')
oha=re.compile(u'利用差分')
kanri='/xxx/kanri.txt'
## template
neru = u'@%s @%s お疲れ様でした。ベッドインを%s時%s分くらいでセットしました。'
kisy = u'@%s @%s おはよー!おはよー!そこにいるの?まぶしー!まぶしー!twitter利用差分から推定睡眠時間は%sくらいです。'
def suimin():
i=0
while i < 4:
tex = tll[i].text
men = tll[i].author.screen_name
# おやすみもーど
# 私がおやすみを言ってたら仮動作。お疲れ様でしたを言うor言ってたで抜ける。
if oya.search(tex) and men == aut:
#おやすみがhitしたら投稿時間を抜いて管理ファイルへ書き込み
#毎回寝てる間に時間書き直してるから無駄なので次回以降に改善
# 元々はココ
jk = tll[i].created_at
jkhour=jk.hour+9
if jkhour>23: jkhour=jkhour-24
tane = neru % (aut, bot, str(jkhour), str(jk.minute))
#おやすみがhitしたら新着にお疲れを探しに行く
m=i
while m>=0:
chk=tll[m].text
if otu.search(chk):
break
else:
m,i = m-1,i-1
#おやすみから新着を見に行ってお疲れ様がなかった場合はiは-1になっているはず
if i<0:
t = open(kanri, 'w')
t.write(str(jk))
t.close()
jkhour=jk.hour+9
if jkhour>23: jkhour-=24
### tweetの仕方もOAuthトークンのところへ放り込みました
# oat.client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST', urlencode({'status': tane.encode('utf-8')}))
message = tane.encode('utf-8')
oat.tweet(message)
else:
break
#iを加算して強制的に探索を終了させる。
i=10
# おはようもーど
elif you.search(tex) and men == aut:
f = open(kanri, 'r')
line = f.read()
#おはようは投稿時間を抜いて、おやすみログから差分時間を計算
jk = tll[i].created_at
sabun = jk- datetime.datetime.strptime(line, "%Y-%m-%d %H:%M:%S")
f.close()
tane = kisy % (aut, bot, str(sabun))
m=i
while m>=0:
# 利用差分がhitしたら抜ける
chk=tll[m].text
if oha.search(chk):
break
else:
m,i = m-1,i-1
if i<0:
message = tane.encode('utf-8')
oat.tweet(message)
else:
break
i=10
else:
# print 'no hit'
#おやすみorおはようが無かったらiを加算して古い投稿を観に行く
i+=1
過去では一日に繰り返しでおはよーされる不具合に対応しました。
tweetさせる命令はOAuthトークン管理と合わせて同じファイルに放り込みました。これでまたAPI変更とかでtweetするURLが変わってもあちこち書きなおす必要がなくなった。
まだまだ変数名とか汚いです。
27時とか言われるのを3時と言わせるようにしました。