使用curl+post向新浪微博提交更新
rex注:本文以介绍思路为主,并没有提出完整的解决方案。
前两天,奶瓶同学发邮件问我能否做一个简单的应用,将twitter的内容同步到新浪微博。
他提供的思路是这样的:
做一个网页包含一个RSS链接,新浪会识别到这个RSS地址当成一个博客抓过来.
直接抓twitter是不行,需要写脚本抓下来放到自己的服务器上。
要用到的命令有 crontab -e 这个是用来定时执行 down.sh 的脚本,或直接定时执行curl:
curl “http://twitter.com/statuses/user_timeline/5397942.rss” > t.xml
个人的思路是,从twitter上抓下来不是什么难事,因为twitter的API很好用,抓twitter更新的应用已经很成熟,只要有一台能够上墙外之网的服务器,抓取上面的消息不是问题。问题的难点在于,如何向闭关锁国的、油盐不进的新浪微博同步输入消息。当然,Netputer建议使用rss的方式。这种方法我没有进行尝试,不过据Netputer同学所说,手动实践证明,发现新浪不抓他的地址。因此,我想能否分析新浪的微博页面,进而使用curl+post这对坚船利炮,打开新浪的大门。
在调试过程中,得到饭友那个谁的大力协助,非常感谢。那个谁对于使用FireBug以及httpFox调戏调试javascript极其熟练。在他的指导下,终于将隐藏在javascript后面的php页面地址给揪出来了。
使用curl更新新浪微博的方法
1. 模拟登录,取得cookie:
curl -k -D ck.txt “https://login.sina.com.cn/sso/login.php?
username=YOURSINAUSERNAME&password=YOURSINAPASSWORD&returntype=TEXT”
命令中,-D ck.txt,是将登录所得的cookie信息存储在ck.txt中;
-k选项是在windows下根据提示添加的。
2. 利用第1步得到的cookie信息,发布消息:
curl -e “http://t.sina.com.cn/” -b ck.txt -d “content=some%20content” “http://t.sina.com.cn/mblog/publish.php”
命令中,-e “http://t.sina.com.cn/” 是告诉新浪服务器,本条命令是自己人发来的,请按要求更新就是。如果没有这一条,就会得到难看的NULL返回值。
-b ck.txt,是调用步骤1生成的cookie内容,以便验证登录信息。
-d “content=some%20content”:使用curl的Post语法,提交content内容。
http://t.sina.com.cn/mblog/publish.php 这是发布消息的php页面。
原理就是这样,可以在此基础上制出各种更新方法,例如,bash+curl, perl+curl, php+curl, python+curl,等等。我以python为例,写出一个完整的发布函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import urllib import urllib2,cookielib def send_sina_msgs(username,password,msgs): cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) data = 'username=%s&password=%s&returntype=TEXT'%(username,password) request = urllib2.Request( url = 'https://login.sina.com.cn/sso/login.php', data = data) ret = opener.open(request) #content = ret.read() for msg in msgs: data = 'content=%s'%(msg) request = urllib2.Request( url = 'http://t.sina.com.cn/mblog/publish.php', headers = {'Referer':'http://t.sina.com.cn'}, data = data) ret = opener.open(request) #content = ret.read() #print content |
使用方法很简单,只要调用函数send_sina_msgs(username,password,msgs)就可以了。为有效利用登录信息,避免每次发布消息都要登录一次,我将send_sina_msgs的msgs参数规定为列表形式,以便批量提交。即,从twitter或别处得到的消息列表(已经格式化好的),直接作为参数提交。一次登录,多条更新。
另外,目标是将本函数修改可在GAE环境下可用,但是看了文档,GAE好像不太支持自定义Referer参数。因此暂时还没有办法利用GAE平台+cron功能作成全自动的机器人。如果您凑巧知道如何修改,请指点一二。谢谢。
关于如何从twitter上面抓取消息,并去除”@”消息,请参考本博客文章:《从twitter到9911同步消息》


一、不是我最先想到的,是 @zuola 。
二、我的博客地址改为 .com 结尾啦。
三、思路更不错,看来同步就快啦。
你好楼主!感谢你的思路。。
http://bbs.phpchina.com/viewthread.php?tid=163269
我用ruby 在实现LZ的代码,登陆似乎不是问题,不过问题出现在.当我发布新的文章时,response会返回
的body,不解。特请赐教返回html code : M00003 这应该是个报错但是不知错在哪,LZ的blog输入框不能打尖括号…