学了一周的python 写了这些应用,得到了几位大牛的帮助,在此不提名感谢啦~
实现效果:
一.以twitter为中心散布出去
二.必须要有ssh
三.读取twitter的xml然后散布
四.目前可以散布到饭否,ping.fm
五.可以借鉴ping.fm散布到豆瓣广播
六.可以把饭否有人@你id 发消息提示回twitter
现在twitter已经成为主力 IM + 提醒 + 应用 了,只开twitter的客户端即可,以twitter为中心散布出去,有实时提醒功能,比如大家可以利用twitterfeed.com之类的来做一个rss的订阅提醒,或者自己写一个python的自动订阅更新提醒
待考虑功能:既然有bot就可以做出来一些bot功能
http://twitter.pbwiki.com/Bots
这有一些bot应用
前期准备
1.发twitter消息到ping.fm,需要 http://code.google.com/p/pyngfm/
2.需要python2.6以上版本 因为五 中 那个format代码实现的问题 lol 俺实在没啥好办法鸟
二.必须要有ssh
主要是用crontab的每隔多久执行一次程序的功能
我是用2分钟一次的,至今还没被饭否和twitter封ip.
解决办法:
1.自己有机器挂着最好
2.如果有dreamhost账户的话,可以用dreamhost的ssh……不过小心被封……
四.发twitter消息到饭否的代码
last.txt 需要手动建立,然后编辑添加某条消息的id值 这样以后更新只会更新至此,然后把最新的id写入last.txt
#!/usr/bin/python
from xml.dom.minidom import parseString
import urllib2
import urllib
import sys
def post_to_fanfou(msg):
url = 'http://api.fanfou.com/statuses/update.xml'
data = urllib.urlencode({'status':msg})
req = urllib2.Request(url,data)
username = 'jimey'
password = 'password'
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
response = urllib2.urlopen(req)
def main():
f = open('last.txt','r')
maxid = int(f.read())
f.close()
if maxid < 1166717326:
print 'error'
sys.exit(-1)
params = urllib.urlencode({'since_id':maxid})
url = ";http://twitter.com/statuses/user_timeline/jimey.xml?%s";
username = 'jimey'
password = 'password'
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
f = urllib2.urlopen(url % params)
xmltext = f.read()
dom = parseString(xmltext)
statuses = dom.childNodes[0]
messages = []
s = 0
for node in statuses.childNodes:
if node.nodeName == 'status':
status = node
for snode in status.childNodes:
if snode.nodeName == 'id':
n = int(snode.childNodes[0].nodeValue)
if n > maxid:
maxid = n
elif snode.nodeName == 'text' and snode.childNodes[0].nodeValue[0:2] != 'RT' and snode.childNodes[0].nodeValue[0] != '@':
messages.append(snode.childNodes[0].nodeValue.encode('utf-8'))
while len(messages) > 0:
post_to_fanfou(messages.pop())
s = s + 1
f = open('last.txt','w')
f.write(str(maxid))
f.close()
if __name__ == ";__main__";:
main()
四.2 发twitter消息到饭否+ping.fm的代码
需要在ping.fm申请2个API KEY 分别是
pfm.setApiKey(‘************************’) = Application API Key
pfm.setUserAppKey(‘*********************************’) = own Ping.fm Application Key.
#!/usr/bin/python
from xml.dom.minidom import parseString
import urllib2
import urllib
import sys
from pyngfm import PyngFM
def post_to_fanfou(msg):
pfm = PyngFM()
pfm.setApiKey('************************')
pfm.setUserAppKey('*********************************')
pfm.user_post('default','%s'%msg)
url = 'http://api.fanfou.com/statuses/update.xml'
data = urllib.urlencode({'status':msg})
req = urllib2.Request(url,data)
username = 'jimey'
password = 'password'
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
response = urllib2.urlopen(req)
def main():
f = open('last.txt','r')
maxid = int(f.read())
f.close()
if maxid < 1166717326:
print 'error'
sys.exit(-1)
params = urllib.urlencode({'since_id':maxid})
url = ";http://twitter.com/statuses/user_timeline/jimey.xml?%s";
username = 'jimey'
password = 'password'
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
f = urllib2.urlopen(url % params)
xmltext = f.read()
dom = parseString(xmltext)
statuses = dom.childNodes[0]
messages = []
s = 0
for node in statuses.childNodes:
if node.nodeName == 'status':
status = node
for snode in status.childNodes:
if snode.nodeName == 'id':
n = int(snode.childNodes[0].nodeValue)
if n > maxid:
maxid = n
elif snode.nodeName == 'text' and snode.childNodes[0].nodeValue[0:2] != 'RT' and snode.childNodes[0].nodeValue[0] != '@':
messages.append(snode.childNodes[0].nodeValue.encode('utf-8'))
while len(messages) > 0:
post_to_fanfou(messages.pop())
s = s + 1
f = open('last.txt','w')
f.write(str(maxid))
f.close()
if __name__ == ";__main__";:
main()
五 . 发ping.fm消息到豆瓣广播
http://www.douban.com/group/topic/4604950/
六.如果有人在饭否回复你,在twitter注册个马甲帐号然后把饭否回复人的id和饭否回复的内容一块发到twitter去,由于你真身帐号已经加了这个马甲帐号的好友,所以在那马甲帐号发消息的时候会有 @饭否id 如果你饭否id和twitter的id是一样的话,比如我用twhirl会有声音提示,如果含有@id 这样的消息出现的话
#!/usr/bin/python2.6
# -*- coding: utf-8 -*-
'''
Created on 2009-4-2
@author: jimey
'''
from xml.dom.minidom import parseString
import urllib2
import urllib
import sys
import twitter
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def main():
f = open('/home/jimey/fanfou/fanfoulast.txt','r')
maxid = str(f.read())
params = urllib.urlencode({'since_id':maxid})
url = ";http://api.fanfou.com/statuses/replies.xml?%s";
username = 'jimey'
password = 'password'
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
f = urllib2.urlopen(url % params)
xmltext = f.read()
dom = parseString(xmltext)
statuses = dom.childNodes[0]
id = []
messages = []
name = []
content = []
for node in statuses.childNodes:
if node.nodeName == 'status':
status = node
for snode in status.childNodes:
if snode.nodeName == 'id':
id.append(snode.childNodes[0].nodeValue)
elif snode.nodeName == 'text':
messages.append(snode.childNodes[0].nodeValue)
elif snode.nodeName == 'user':
for unode in snode.childNodes:
if unode.nodeName == 'name':
name.append(unode.childNodes[0].nodeValue)
for q, a in zip(name,messages):
content.append('{0} says {1}'.format(q,a))
while len(content) > 0:
api = twitter.Api(username='jimeybot', password='password')
status = api.PostUpdate(";%s"; %content.pop())
f = open('fanfoulast.txt','w')
print id
maxid = id[0]
f.write(str(maxid))
f.close()
if __name__ == ";__main__";:
main()
标签:ANSCII, API, bot, Ping.fm, Python, Python2.6, simplejson, Twitter, Unicode, XML, 同步, 微博客, 饭否


有了 cron job 支持之后 Google App Engine 似乎是个比 dreamhost 更加好的选择了
至少 GAE 要比 dreamhost 更加稳定吧
不过 GAE 的 python 似乎有些限制 不知道具体能否实现~
回复本留言
jimey Reply:
四月 16th, 2009 at 13:02
暂时我自己的机器还是比较稳定的
top – 13:02:19 up 29 days, 11:20, 3 users, load average: 2.00, 2.00, 2.00
GAE上应该是是可以实现的
可以参考豆瓣那个 http://www.douban.com/group/topic/4604950/ 只是好像缺了conf.py ……我运行GAE直接500错误…
由于那个代码貌似是记录log的……所以想来想去,还是自己写一个豆瓣的Oauth然后继续在这个python上一块更新好了
回复本留言
raptium —— 2009-04-16 @11:49