読者です 読者をやめる 読者になる 読者になる

ぽよメモ

ファッション情報学徒の備忘録.

tweepyを使って指定条件のツイートを削除

この前はrequestsとrequests-oauthlibを使ってpythonでツイートをしました。ツイートするだけなら楽勝なんですが、さすがにTLを取得してゴニョゴニョとかはなんかもう闇っぽかったのでtweepyを使ってみることにしました。

pip install tweepy

準備は完了です。

import tweepy

CK = 'xxxxxxxxxxxxxxxx'
CS = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
AT = 'xxxxxxxxxxxxxxxxx'
AS = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)
api = tweepy.API(auth)
#アカウントの情報を取得
myinfo = api.me()
#100ツイートほどTLを取得
tweets = tweepy.Cursor(api.user_timeline, id = myinfo.id).items(100)

TLを取得までいけました。このままprint tweetsすればそれはもう意味不明な文字列がたくさん表示されることでしょう。
上で示したように、myinfoというオブジェクトにはたくさんのデータが格納されています。同様に取得した情報にもたくさん情報が入っており、tweepyのAPIリファレンスを見てもさっぱり書いてないのでつらいんですが、Twitter DeveloppersのAPIリファレンスを読むと多少はわかるかと。例えば

#リストで返ってくるTLをforループにかける
for tweet in tweets:
    #本文を取得
    sentence = tweet.text #Twitter始めました
    #ツイートのidを取得
    id = tweet.id #145872304857203445452345(適当な数字です
    #fav数、RT数を取得
    rt_ct = tweet.retweet_count #0
    fav_ct = tweet.favorite_count #1
    #ツイートした人の名前及びID
    name = tweet.user.name #ぷりん
    sc_name = tweet.user.screen_name #pudding_info
    #公式アカウントかどうか
    kousiki = tweet.user.verified #False
    #ツイート日時
    date = tweet.created_at #2015-09-17 16:55:59
    #via名
    via = tweet.source #Twitter for iPhone

print type()すると各要素がどういう値かわかると思いますが、nameやtextはunicode、verifiedはboolean、日時はdatetime.datetime、RT数やfav数はintで返ってきます。
公式のリファレンスを読むとRT数はretweet_countなのにfav数はfavorites_countだとか、いやなんでやねんみたいなとこがたまにあって面白いです(全然読みたいとは思いませんが
休講通知botには、毎朝その日の休講情報をダイジェストでツイートする機能を実装したかったのですが、ただそれを実装するだけではどんどんダイジェストツイートが溜まっていってウザいなぁと思ったので、毎回それと一緒に前の日のダイジェストツイートを削除してやろうと言うわけで、TLを取得までした後、以下の様な実装を加えました。
ダイジェストツイートは「2015/9/28 本日の休講はありません」といった感じの仕様にしてあります。

import re
from datetime import datetime, timedelta
#前日の日付を取得
d = datetime.now() + timedelta(days = -1)
yesterday = '%s/%s/%s' % (d.year, d.month, d.day)
#本文に一致するものを探し、削除
for tweet in tweets:
    r = re.compile(yesterday)
    sentence = tweet.text.encode('utf-8')
    m = re.match(r, sentence)
    if m == None:
        pass
    else:
        api.destroy_status(tweet.id)

実装してから正規表現である必要なくねとか思いましたがもう良いんです。
そのうちリプライに反応して休講情報とか持ってこれるようにしたいなぁ……