24時過ぎとかにcronで実行させると、FriendsとFollowersそれぞれのリストを前日に保存しておいたリストと照合し、追加した(された)および削除した(された)Friends/FollowersをリストアップしてGmailで自分宛に送信します。Twitter APIを扱うモジュールはPython-twitterというものを使用していますが、前回と同じく、easy_installで入るものでなくtrunkにあるものを使用しています。
作ってみて色々思ったこと
- 結構行数が増えてきたので、Classにまとめようと思ったけど、次回チャレンジする
- Pythonで書いている人は文字列囲むのにダブルクォーテーションとシングルクォーテーションどちらなのか。もしくは使い分けしているのか
- 変数命名が納得いかない。どうしたものか。
- 自分で書いた英語がそもそも怪しい><
- コードを書き始めてから、このblogを書き始めるまで13時間くらいかかった。半年前だったら1週間以上かかっただろう。この進歩(牛歩だが)が嬉しい
コードはこちら。Python2.6(MacOSX dmg)で動作確認は取れています。但しcronでの運用はまだ行っていません(先日セッティングした自鯖に入れるつもり)。
#!/usr/bin/env python
# coding: utf-8
#
# Please Note it.
# Python-twitter od the trunk version(r137 or higher)in necessary.
# svn checkout http://python-twitter.googlecode.com/svn/trunk/ python-twitter
#
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate
import twitter
from datetime import *
TWITTER_USER = "TWITTER_USER"
TWITTER_PASSWD = "TWITTER_PASSWARD"
GMAIL_USER = "GMAIL_ACCOUNT"
GMAIL_PASSWD = "GMAIL_PASSWARD"
api = twitter.Api(TWITTER_USER, TWITTER_PASSWD)
FRIENDS_LIST = "friends.txt"
FOLLOWERS_LIST = "followers.txt"
def get_allfriends(): #friendを取得
friends, cnt = [], 1
while not len(friends) % 100:
friends += api.GetFriends(page=cnt)
cnt += 1
friend = []
for i in friends:
user = i.screen_name
user = user + "\n"
friend.append(user)
return friend
def get_allfollowers(): #followerを取得
followers, cnt = [], 1
while not len(followers) % 100:
followers += api.GetFollowers(page=cnt)
cnt += 1
follower = []
for i in followers:
user = i.screen_name
user = user + "\n"
follower.append(user)
return follower
def flw_list_open(FOLLOWERS_LIST): #前回のfollowerリスト読込
flw = open(FOLLOWERS_LIST, "r")
flw_list = flw.readlines()
flw.close()
return flw_list
def frd_list_open(FRIENDS_LIST): #前回のfriendリスト読込
frd = open(FRIENDS_LIST, "r")
frd_list = frd.readlines()
frd.close()
return frd_list
def set_followers(): #followerリストのマッチング
FLW, RMV = "%(flws)s", "%(rmv)s"
follower = get_allfollowers()
flw_list = flw_list_open(FOLLOWERS_LIST)
fl = open(FOLLOWERS_LIST, "w")
new_flw = []
for flws in follower:
if flws not in flw_list:
new_flw.append(FLW % locals())
fl.write(flws)
rm_flw = []
for rmv in flw_list:
if rmv not in follower:
rm_flw.append(RMV % locals())
return new_flw, rm_flw, follower
def set_friends(): #friendリストのマッチング
FRD, RMV = "%(frds)s", "%(rmv)s"
friend = get_allfriends()
frd_list = frd_list_open(FRIENDS_LIST)
fl = open(FRIENDS_LIST, "w")
new_frd = []
for frds in friend:
if frds not in frd_list:
new_frd.append(FRD % locals())
fl.write(frds)
rm_frd = []
for rmv in frd_list:
if rmv not in friend:
rm_frd.append(RMV % locals())
return new_frd, rm_frd, friend
def create_message(from_addr, to_addr, subject, body, encoding):
msg = MIMEText(body.encode(encoding), "plain", encoding)
msg["Subject"] = Header(subject, encoding)
msg["From"] = from_addr
msg = MIMEText(body.encode(encoding), "plain", encoding)
msg["Subject"] = Header(subject, encoding)
msg["From"] = from_addr
msg["To"] = to_addr
msg["Date"] = formatdate()
return msg
def send_via_gmail(from_addr, to_addr, msg):
s = smtplib.SMTP("smtp.gmail.com", 587)
s.ehlo()
s.starttls()
s.ehlo()
s.login(GMAIL_USER, GMAIL_PASSWD)
s.sendmail(from_addr, to_addr, msg.as_string())
s.close()
def main():
DATETIME = datetime.now()
YESTERDAY = DATETIME + timedelta(hours=-24)
DATESTR = DATETIME.strftime("%Y/%m/%d% %H:%M:%S")
STR_YESTERDAY = YESTERDAY.strftime("%Y/%m/%d")
subject = "Logwatch for %s's Twitter" % TWITTER_USER
from_addr = GMAIL_USER
to_addr = GMAIL_USER
new_flw, rm_flw, follower = set_followers()
new_frd, rm_frd, friend = set_friends()
"""
メールの本文にあたるところ
もうちょっとうまく書けないものか
あとそもそも英語があやしい
"""
body = "################ Logwatch for %s's Twitter ################" % TWITTER_USER + "\n"
body += "Processing Initiated:%s" % DATESTR + "\n"
body += "Date Range Processed:%s" % STR_YESTERDAY + "\n"
body += "Period is day." + "\n"
body += "\n"
body += "--------------------- Followers Begin ---------------------" + "\n"
body += "%s Users Followers" % len(follower) + "\n"
body += "Followed by ..." + "\n"
if new_flw == []:
body += "Nobody followed you yesterday." + "\n"
else:
for nfl in new_flw:
body += "%s is followed you yesterday" % nfl + "\n"
body += "Rmoved by ..." + "\n"
if rm_flw == []:
body += "Nobody Removed you yesterday." + "\n"
else:
for rfl in rm_flw:
body += "%s is Removed you yesterday" % rfl + "\n"
body += "---------------------- Followers End ---------------------" + "\n"
body += "\n"
body += "--------------------- Friends Begin ---------------------" + "\n"
body += "%s Users Friends" % len(friend) + "\n"
body += "Following ..." + "\n"
if new_frd == []:
body += "No follow yesterday" + "\n"
else:
for nfr in new_frd:
body += "following %s yesterday" % nfr + "\n"
body += "Rmoving ..." + "\n"
if rm_frd == []:
body += "No Remove yesterday." + "\n"
else:
for rfr in rm_frd:
body += "Removing %s yesterday" % rfr + "\n"
body += "---------------------- Friends End ---------------------" + "\n"
body += "\n"
body += "############## Logwatch for %s's Twitter End ##############" % TWITTER_USER + "\n"
msg = create_message(from_addr, to_addr, subject, body, "utf-8")
send_via_gmail(from_addr, to_addr, msg)
if __name__ == "__main__":
main()
[2009年5月6日追記]
送られてきたメールを確認すると、改行されたくないところで改行されてたりするので、時間見つけて修正します。
[追記ここまで]
[2009年6月20日追記]
最近Follower数がかなり少なくカウントされていると思っていて、時間がとれたので調べてみたんだけど、page=1が97になっていてカウントが止まってしまっている。100で割り切れなくなるまでカウントされるロジックなので、本当に97ならしかたがないのだけど、page=2にもFollowerがちゃんとある。調べた結果がこちら。うーん変だなあ・・
[root@centos ~]# python
Python 2.6.2 (r262:71600, May 14 2009, 20:12:16)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import twitter
>>> api = twitter.Api('ACCOUNT', 'PASSWORD')
>>> f = api.GetFollowers(page=2)
>>> print len(f)
58
>>> f = api.GetFollowers(page=1)
>>> print len(f)
97
>>> f = api.GetFollowers(page=3)
>>> print len(f)
0
>>>
[追記ここまで]
- Newer: [WordPress]WPtouch iPhone Themeを導入した
- Older: 魚貝食事処 おがわ
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://aoshiman.net/weblog/2009/05/05/twitter_logwatch/trackback/
- Listed below are links to weblogs that reference
- [Python]Twitter版LogWatchのようなもの from “南船北馬”

