<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>润物无声 &#187; 百度空间</title>
	<atom:link href="http://blog.zhourunsheng.com/tag/%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zhourunsheng.com</link>
	<description>天空一朵雨做的云</description>
	<lastBuildDate>Sat, 08 May 2021 05:17:21 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>PHP 发送博文到百度空间</title>
		<link>http://blog.zhourunsheng.com/2013/05/php-%e5%8f%91%e9%80%81%e5%8d%9a%e6%96%87%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</link>
		<comments>http://blog.zhourunsheng.com/2013/05/php-%e5%8f%91%e9%80%81%e5%8d%9a%e6%96%87%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/#comments</comments>
		<pubDate>Sun, 19 May 2013 03:59:31 +0000</pubDate>
		<dc:creator><![CDATA[润物无声]]></dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[百度空间]]></category>

		<guid isPermaLink="false">http://blog.zhourunsheng.com/?p=1673</guid>
		<description><![CDATA[<p>昨天，测试了PHP方式登录百度空间，可以参见博文《PHP 登录百度空间》，今天通过抓包工具的分析，分析了博文的 [&#8230;]</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2013/05/php-%e5%8f%91%e9%80%81%e5%8d%9a%e6%96%87%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/">PHP 发送博文到百度空间</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>昨天，测试了PHP方式登录百度空间，可以参见博文《<a title="PHP 登录百度空间" href="http://blog.zhourunsheng.com/2013/05/php-%E7%99%BB%E5%BD%95%E7%99%BE%E5%BA%A6%E7%A9%BA%E9%97%B4/" target="_blank">PHP 登录百度空间</a>》，今天通过抓包工具的分析，分析了博文的发布过程，实现了博文的自动发布。<span id="more-1673"></span></p>
<p><strong>参照代码如下：</strong></p>
<pre>private function postArticle($baiduzoneurl, $title, $content, $category, $blogpower)
{
$post_data = array();
$post_data["title"] = $title;
$post_data["tags[]"] = $category;
$post_data["content"] = $content;
$post_data["private"] = $blogpower == 0? "" : "1";
$post_data["imgnum"] = "0";
$post_data["bdstoken"] = $this-&gt;bdstoken;
$post_data["qbid"] = "";
$post_data["refer"] = "http://hi.baidu.com/home";
$post_data["multimedia[]"] = "";
$post_data["private1"] = $post_data["private"];
$post_data["synflag"] = "";
$post_data["qing_request_source"] = "new_request";

$this-&gt;doHttpPost("http://hi.baidu.com/pub/submit/createtext", $post_data, "http://hi.baidu.com/pub/show/createtext");
}</pre>
<p>接下来再进行wordpress插件的更新，哈哈，这个就快多了！！！</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2013/05/php-%e5%8f%91%e9%80%81%e5%8d%9a%e6%96%87%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/">PHP 发送博文到百度空间</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zhourunsheng.com/2013/05/php-%e5%8f%91%e9%80%81%e5%8d%9a%e6%96%87%e5%88%b0%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 登录百度空间</title>
		<link>http://blog.zhourunsheng.com/2013/05/php-%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</link>
		<comments>http://blog.zhourunsheng.com/2013/05/php-%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/#comments</comments>
		<pubDate>Sat, 18 May 2013 14:00:20 +0000</pubDate>
		<dc:creator><![CDATA[润物无声]]></dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[百度空间]]></category>

		<guid isPermaLink="false">http://blog.zhourunsheng.com/?p=1667</guid>
		<description><![CDATA[<p>前几天，先测试了利用Python脚本登录百度空间，问题已解决，可以参照我的博文《python 脚本登录百度空间 [&#8230;]</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2013/05/php-%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/">PHP 登录百度空间</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>前几天，先测试了利用Python脚本登录百度空间，问题已解决，可以参照我的博文《<a title="python 脚本登录百度空间" href="http://blog.zhourunsheng.com/2013/05/python-%e8%84%9a%e6%9c%ac%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/" target="_blank">python 脚本登录百度空间</a>》，今天完善了php方式的登录过程，原理同python脚本的登录。<span id="more-1667"></span></p>
<h3>代码如下:</h3>
<p><strong>登录代码</strong></p>
<pre>private function loginBaiduZone($user,$password)
{
//get Cookie
$ret = $this-&gt;doHttpPost("https://passport.baidu.com/v2/api/?getapi&amp;class=login&amp;tpl=mn&amp;tangram=false", "", "");

//get token
$ret = $this-&gt;doHttpPost("https://passport.baidu.com/v2/api/?getapi&amp;class=login&amp;tpl=mn&amp;tangram=false", "", "");
preg_match_all('/login_token=\'(.+)\'/', $ret, $tokens);
$login_token = $tokens[1][0];

//login
$post_data = array();
$post_data['username'] = $user;
$post_data['password'] = $password;
$post_data['token'] = $login_token;
$post_data['charset'] = "UTF-8";
$post_data['callback'] = "parent.bd12Pass.api.login._postCallback";
$post_data['index'] = "0";
$post_data['isPhone'] = "false";
$post_data['mem_pass'] = "on";
$post_data['loginType'] = "1";
$post_data['safeflg'] = "0";
$post_data['staticpage'] = "https://passport.baidu.com/v2Jump.html";
$post_data['tpl'] = "mn";
$post_data['u'] = "http://www.baidu.com/";
$post_data['verifycode'] = "";

$ret = $this-&gt;doHttpPost("http://passport.baidu.com/v2/api/?login", $post_data, "https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F");
}</pre>
<p><strong>Http请求的工具函数</strong></p>
<pre>private function doHttpPost($url, $post_data, $referef)
{
$mcurl = curl_init();
curl_setopt($mcurl, CURLOPT_URL, $url);

if ($post_data != "")
{
curl_setopt($mcurl, CURLOPT_POST, 1);
curl_setopt($mcurl, CURLOPT_POSTFIELDS, $post_data);
}

if ($referef != "")
{
curl_setopt($mcurl, CURLOPT_REFERER, $referef);
}

curl_setopt($mcurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($mcurl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($mcurl, CURLOPT_HEADER, 1);
curl_setopt($mcurl,    CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.92 Safari/537.1 LBBROWSER");

if ($this-&gt;cookie != "")
{
curl_setopt($mcurl, CURLOPT_COOKIE, $this-&gt;cookie);
}

$data = curl_exec($mcurl);
curl_close($mcurl);

preg_match_all('/Set-Cookie:((.+)=(.+))$/m ', $data, $cookies);
if(is_array($cookies) &amp;&amp; count($cookies) &gt; 1 &amp;&amp; count($cookies[1]) &gt; 0)
{
foreach($cookies[1] as $i =&gt; $k)
{
$cookieinfos = explode(";", $k);
if(is_array($cookieinfos) &amp;&amp; count($cookieinfos) &gt; 1)
{
$this-&gt;cookie .= $cookieinfos[0];
$this-&gt;cookie .= "; ";
}
}
}

return $data;
}</pre>
<p>接下来再测试博文的发布代码。</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2013/05/php-%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/">PHP 登录百度空间</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zhourunsheng.com/2013/05/php-%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>python 脚本登录百度空间</title>
		<link>http://blog.zhourunsheng.com/2013/05/python-%e8%84%9a%e6%9c%ac%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/</link>
		<comments>http://blog.zhourunsheng.com/2013/05/python-%e8%84%9a%e6%9c%ac%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/#comments</comments>
		<pubDate>Wed, 15 May 2013 13:48:18 +0000</pubDate>
		<dc:creator><![CDATA[润物无声]]></dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[百度空间]]></category>

		<guid isPermaLink="false">http://blog.zhourunsheng.com/?p=1657</guid>
		<description><![CDATA[<p>最近半年的时间，百度空间进行了多次变更，自从去年的wordpress百度空间博文同步插件不可用之后，就一直没有 [&#8230;]</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2013/05/python-%e8%84%9a%e6%9c%ac%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/">python 脚本登录百度空间</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>最近半年的时间，百度空间进行了多次变更，自从去年的wordpress百度空间博文同步插件不可用之后，就一直没有维护更新，最近百度空间基本稳定了，通过抓包对比分析，发现和以前的登录过程很不一样，先利用python脚本进行登录过程的模拟，然后再利用php实现，来维护更新同步插件。<span id="more-1657"></span></p>
<h3>大体的登录原理如下：</h3>
<p>1. 首先获取登录的cookie文件，没有cookie的话，百度空间不能正常登录，访问如下网址获取cookie</p>
<p>https://passport.baidu.com/v2/api/?getapi&#038;class=login&#038;tpl=mn&#038;tangram=false</p>
<p>2. 获取登录过程的token，同样再次请求上面的网址，但是这一次需要携带第1步中server返回的cookie信息</p>
<p>https://passport.baidu.com/v2/api/?getapi&#038;class=login&#038;tpl=mn&#038;tangram=false</p>
<p>3. 发送登录账号信息（用户名，密码等）到如下网址，同样需要携带步骤2中server返回的cookie信息</p>
<p>http://passport.baidu.com/v2/api/?login</p>
<p>4. 至此，登录过程完毕</p>
<h3>代码示例：</h3>
<p>下面的示例代码会登录百度空间，然后把所有的博文自动备份到本地，其中登录的过程就如上面的原理所讲。</p>
<pre>#!/usr/bin/python

#coding:utf8

import cookielib, urllib2, urllib

import os,sys,socket,re

#解析有多少页博客

pageStr = """var PagerInfo = {\s*allCount\s*:\s*'(\d+)',\s*pageSize\s*:\s*'(\d+)',\s*curPage\s*:\s*'\d+'\s*};"""

pageObj = re.compile(pageStr, re.DOTALL)

#获取登陆token

login_tokenStr = '''bdPass.api.params.login_token='(.*?)';'''

login_tokenObj = re.compile(login_tokenStr,re.DOTALL)

#获取博客标题和url

blogStr = r'''&lt;div&gt;&lt;a href=".*?" target=_blank&gt;.*?&lt;/a&gt;&lt;/div&gt;&lt;a href="(.*?)" target=_blank&gt;(.*?)&lt;/a&gt;&lt;/div&gt;'''

blogObj = re.compile(blogStr,re.DOTALL)

class Baidu(object):

    def __init__(self,user = '', psw = '', blog = ''):

        self.user = user

        self.psw  = psw

        self.blog = blog

        if not user or not psw or not blog:

            print "Plz enter enter 3 params:user,psw,blog"

            sys.exit(0)

        if not os.path.exists(self.user):

            os.mkdir(self.user)

        self.cookiename = 'baidu%s.coockie' % (self.user)

        self.token = ''

        self.allCount  = 0

        self.pageSize  = 10

        self.totalpage = 0

        self.logined = False

        self.cj = cookielib.LWPCookieJar()

        try:

            self.cj.revert(self.cookiename)

            self.logined = True

            print "OK"

        except Exception, e:

            print e

        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))

        self.opener.addheaders = [('User-agent','Opera/9.23')]

        urllib2.install_opener(self.opener)

        socket.setdefaulttimeout(30)

    #登陆百度

    def login(self):

        #如果没有获取到cookie，就模拟登陆

        if not self.logined:

            print "logon to baidu ..."

            #第一次先访问一下，目的是为了先保存一个cookie下来

            qurl = '''https://passport.baidu.com/v2/api/?getapi&amp;class=login&amp;tpl=mn&amp;tangram=false'''

            r = self.opener.open(qurl)

            self.cj.save(self.cookiename)

            #第二次访问，目的是为了获取token

            qurl = '''https://passport.baidu.com/v2/api/?getapi&amp;class=login&amp;tpl=mn&amp;tangram=false'''

            r = self.opener.open(qurl)

            rsp = r.read()

            #print rsp

            self.cj.save(self.cookiename)

            #通过正则表达式获取token

            matched_objs = login_tokenObj.findall(rsp)

            if matched_objs:

                self.token = matched_objs[0]

                print 'token =', self.token

                #然后用token模拟登陆

                post_data = urllib.urlencode({'username':self.user,

                                              'password':self.psw,

                                              'token':self.token,

                                              'charset':'UTF-8',

                                              'callback':'parent.bd12Pass.api.login._postCallback',

                                              'index':'0',

                                              'isPhone':'false',

                                              'mem_pass':'on',

                                              'loginType':'1',

                                              'safeflg':'0',

                                              'staticpage':'https://passport.baidu.com/v2Jump.html',

                                              'tpl':'mn',

                                              'u':'http://www.baidu.com/',

                                              'verifycode':'',

                                            })

                #path = 'http://passport.baidu.com/?login'

                path = 'http://passport.baidu.com/v2/api/?login'

                self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))

                self.opener.addheaders = [('User-agent','Opera/9.23')]

                urllib2.install_opener(self.opener)

                headers = {

                  "Accept": "image/gif, */*",

                  "Referer": "https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F",

                  "Accept-Language": "zh-cn",

                  "Content-Type": "application/x-www-form-urlencoded",

                  "Accept-Encoding": "gzip, deflate",

                  "User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",

                  "Host": "passport.baidu.com",

                  "Connection": "Keep-Alive",

                  "Cache-Control": "no-cache"

                }

                req = urllib2.Request(path,

                                post_data,

                                headers=headers,

                                )

                rsp = self.opener.open(req).read()

                #print rsp

                self.cj.save(self.cookiename)

                #for login test

                #qurl = '''http://hi.baidu.com/pub/show/createtext'''

                #rsp = self.opener.open(qurl).read()

                #file_object = open('login.txt', 'w')

                #file_object.write(rsp)

                #file_object.close()

            else:

                print "Login Fail"

                sys.exit(0)

    #获取博客一共有多少页，如果有私有博文的话，登陆和不登陆获取的是不一样的

    def getTotalPage(self):

        #获取博客的总页数

        req2 = urllib2.Request(self.blog)

        rsp = urllib2.urlopen(req2).read()

        if rsp:

            rsp = rsp.replace('\r','').replace('\n','').replace('\t','')

            matched_objs = pageObj.findall(rsp)

            if matched_objs:

                obj0,obj1 = matched_objs[0]

                self.allCount = int(obj0)

                self.pageSize = int(obj1)

                self.totalpage = (self.allCount / self.pageSize) + 1

                print 'allCount:%d, pageSize:%d, totalpage:%d' % (self.allCount,self.pageSize,self.totalpage)

    #获取每一页里的博客链接

    def fetchPage(self,url):

        req = urllib2.Request(url)

        rsp = urllib2.urlopen(req).read()

        if rsp:

            rsp = rsp.replace('\r','').replace('\n','').replace('\t','')

            matched_objs = blogObj.findall(rsp)

            if matched_objs:

                for obj in matched_objs:

                    #这里可以用多线程改写一下,单线程太慢

                    self.download(obj[0],obj[1])

    def downloadBywinget(self,url,title):

        #比如使用wget之类的第三方工具，自己填参数写

        pass

    #下载博客

    def download(self,url,title):

        path = '%s/%s.html' % (self.user,title.decode('utf-8'))

        url = 'http://hi.baidu.com%s' % (url)

        print "Download url %s" % (url)

        nFail = 0

        while nFail &lt; 5:

            try:

                sock = urllib.urlopen(url)

                htmlSource = sock.read()

                myfile = file(path,'w')

                myfile.write(htmlSource)

                myfile.close()

                sock.close()

                return

            except:

                nFail += 1

        print ('download blog fail:%s' % (url))

    def dlownloadall(self):

        for page in range(1,self.totalpage+1):

            url = "%s?page=%d" % (self.blog,page)

            #这里可以用多线程改写一下,单线程太慢

            self.fetchPage(url)

def main():

    user = 'runsheng2005'       #你的百度登录名

    psw  = 'password'  #你的百度登陆密码,不输入用户名和密码，得不到私有的文章

    blog = "http://hi.baidu.com/zhourunsheng" #你自己的百度博客链接

    baidu = Baidu(user,psw,blog)

    baidu.login()

    baidu.getTotalPage()

    baidu.dlownloadall()

if __name__ == '__main__':

    main()</pre>
<p>例如，我的用户名是<strong><em>runsheng2005</em></strong>，则会在工作目录建立一个名为<strong><em>baidurunsheng2005.coockie</em></strong>的文件用来保存cookie信息，</p>
<p>其中的内容如下：</p>
<pre>#LWP-Cookies-2.0
Set-Cookie3: BAIDUID="25B820FB17B13E5F4F7C9836FB465C96:FG=1"; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2043-05-07 14:28:07Z"; version=0
Set-Cookie3: BDUSS=mJjbjFrZmp3WXNNbUhIQUxkWDJIMjFaR2dSZjdLaHdwcnhhRDBRLVNxcjQxcmxSQVFBQUFBJCQAAAAAAAAAAAEAAABv9HAAcnVuc2hlbmcyMDA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPhJklH4SZJRW; path="/"; domain=".baidu.com"; path_spec; expires="2021-07-31 14:28:08Z"; version=0
Set-Cookie3: HOSUPPORT=1; path="/"; domain=".passport.baidu.com"; path_spec; expires="2021-07-31 14:28:07Z"; httponly=None; version=0
Set-Cookie3: PTOKEN=2bb1ab99373dbeeeec6b69af75e6a4c6; path="/"; domain=".passport.baidu.com"; path_spec; expires="2021-07-31 14:28:08Z"; version=0
Set-Cookie3: SAVEUSERID=a00277ba04dba8956259a5c4dfec4d40; path="/"; domain=".passport.baidu.com"; path_spec; expires="2021-07-31 14:28:08Z"; version=0
Set-Cookie3: STOKEN=1f4790267126b2e7dddb1f735f29074f; path="/"; domain=".passport.baidu.com"; path_spec; expires="2021-07-31 14:28:08Z"; version=0</pre>
<p>在名为<strong><em>runsheng2005</em></strong>的子目录下面，会下载所有的博文<br />
例如 <em>打造个人的云端笔记本（CareyDiary）.html</em>等等</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2013/05/python-%e8%84%9a%e6%9c%ac%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/">python 脚本登录百度空间</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zhourunsheng.com/2013/05/python-%e8%84%9a%e6%9c%ac%e7%99%bb%e5%bd%95%e7%99%be%e5%ba%a6%e7%a9%ba%e9%97%b4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
