使用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同步消息

2009年9月2日11:21
  • 2009年9月2日17:44 | #1

    一、不是我最先想到的,是 @zuola 。
    二、我的博客地址改为 .com 结尾啦。
    三、思路更不错,看来同步就快啦。

  • 2009年11月7日09:43 | #2

    你好楼主!感谢你的思路。。
    http://bbs.phpchina.com/viewthread.php?tid=163269

  • ZaaC
    2010年1月25日14:51 | #3

    我用ruby 在实现LZ的代码,登陆似乎不是问题,不过问题出现在.当我发布新的文章时,response会返回的body,不解。特请赐教

  • ZaaC
    2010年1月25日14:54 | #4

    返回html code : M00003 这应该是个报错但是不知错在哪,LZ的blog输入框不能打尖括号…

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">