博客,从sina搬到csdn的过程

非常ft的一件事,我刚在正常的网页里写的一篇博客,一点提交,yyd,全没了!!回退也不管用!这不逼得我要在本地写好,再hack上去吗?!

原先的博客是在sina上面,一直想搬过来,前两天写了个脚本,终于完成了这件事情,记录如下:

使用的开发环境: geetoo+bash,使用的命令: awk,sed,wget,curl等,附带用到了一点js。
需要web服务器,如apache,最终生成的dblog_*.html文件,需要放在可以被自己访问的域名下(临时的都可以)。

主要步骤:
1、获取sina上我所有博客url
2、根据这些url,获取博客内容
3、获取csdn登录情况下的cookie,抓取发表博客所需的加密串
4、获取csdn发表博客的页面,并修改
5、利用sina博客内容、加密串、博客发表页面,生成可访问的html文件
6、批量打开本地html文件,上传博客

这里没有试过,如果不要web服务器,直接把html文件放在windows机器上,本地打开,估计也可以。



1、获取sina上我所有博客url
    wget http://blog.sina.com.cn/s/articlelist_*.html
利用这个命令获取文章列表,考虑到分页问题,该命令可能需要执行多次。从而生成几个articlelist_*.html文件。

    for file in articlelist_*.html
    do
        awk '/<div class="articleTitle">/{getline;print}' $file > tmp
        awk 'BEGIN{RS="/""} /http:////[^"]+/ {print}' tmp >> url.txt
    done
利用这些语句,获取到每篇博客的url,存储在url.txt中。


2、根据这些url,获取博客内容
    遍历url.txt中的url,使用wget命令,获取对应的blog_*.html文件。

以上这些文件都是可以反复使用的,可以设置一些检验条件,如果已经生成了对应的文件,则可以跳过这一步。


3、获取csdn登录情况下的cookie,抓取发表博客所需的加密串
由于csdn登录需要验证码,而curl命令的-b选项仅可以使用用户名和密码进行登录,所以我的做法是,使用浏览器登录,然后查看cookie,自己组成cookie文件。
    curl --cookie-jar cookiecsdn.txt http://passport.csdn.net/UserLogin.aspx
使用这个命令,生成未登录情况下的cookiecsdn.txt。然后将刚才查看所得的cookie按照格式写入进去。这里由于cookie的过期问题,可能会需要经常修改此文件,而这里面关系到是否过期的字段是:TestCookie,.DottextCookie。所以,一般仅修改这两个字段就可以了。

    curl --cookie cookiecsdn.txt http://writeblog.csdn.net/PostEditPlain.aspx
批量执行该语句,从而获取一批PostEditPlain.aspx,可以看出里面仅有一些加密串是不同的,所以,我们需要的就是这样加密串:
    viewstate=$(curl --cookie cookiecsdn.txt http://writeblog.csdn.net/PostEditPlain.aspx 2>/dev/null| egrep "__EVENTVALIDATION|__VIEWSTATE" | awk '{match($0, /value=/"([^"]+)/"/, arr);print arr[1]}')
这一步,我们生成了一堆加密串,存储在tag.txt文件中。


4、获取csdn发表博客的页面,并修改
我需要生成一些包含我原有博客内容的网页,并使它们可以自动提交给csdn。所以,首先:
    curl --cookie cookiecsdn.txt http://writeblog.csdn.net/PostEditPlain.aspx
使用该命令获取空的发表博客的页面,存储为csdn.html文件。利用TOBETITLE,TOBECONTENT,TOBESTRING1,TOBESTRING2,来分别标示里面的标题、内容、2个加密串。这样,后面我们只需要替换这4个关键字就可以了。

并且在csdn.html的页面尾部加上自动提交的js代码,使用click函数。使其打开之后自动上传博客。

ps:csdn的安全做的很好,我看了好久,也没能突破防线,直接post数据。


5、利用sina博客内容、加密串、博客发表页面,生成可访问的html文件
抓取到blog_*.html文件中的博客标题、内容,依次使用tag.txt中的加密串,分别替换到csdn.html的拷贝中,生成对应的dblog_*.html文件。这些文件需要存储在web服务器的目录下面,使其可以被自己访问到。


6、批量打开本地html文件,上传博客
由于我使用的没有图形界面的linux,而我不知道怎样让js在非浏览器环境下运行,所以,我生成了windows下批量执行的bat文件,使用explorer打开网页:
    ls dblog_*.html > finalUrl.txt
    sed 's/^/explorer http:////test-cy.myspace.cn//getBlog//final///g' finalUrl.txt > tmp.bat

如果担心一下打开的网页过多,可以限制bat的行数,分开执行。
将bat文件上传到windows下,双击打开即可。

这样就搬家完毕了!我的100+文章就是这么整过来的。但是这里还存在一些问题:
1、由于原来博客中可能存在一些特殊字符,在使用awk和sed的时候,会出现问题。这个很容易解决,就使用:
    btitle=$(echo $btitle| sed 's//////&/g')转义一下类似的特殊字符就可以了。
2、由于没有考虑到顺序问题,我搬来的博客基本上是倒序了。解决的方法:生成bat文件后,用tac命令倒序一下,应该基本上可以解决。
3、我的bat文件行数是50,同时在windows下打开50个网页导致其中一部分执行失败,直接跳转到了空白的发表博客页面,点击回退后,自动提交成功。这个不知道为啥,但是刚才我正常的发表博客的时候,也是这样跳转了,而且回退也没用!!
4、格式没有调整。这个,应该是需要css等功底,我比较差,就将就了。

ps:听说有一些博客搬家工具,但是试了几个,不好用。所以,只有这样了,请csdn的大拿们莫怪!

你可能感兴趣的:(博客,从sina搬到csdn的过程)