通过shell登录OSC并备份博文

想要批量定时备份osc的所有文章,最简单的办法就是利用博客导出功能了。

当然鼠标一点也不是什么难事,甚至可以通过浏览器插件录制一个宏动作来实现自动点击链接…

先看看有没有现成的资源,找了一圈,发现有python版本的:python模拟登录开源中国,嗯,稍微有点麻烦;

还有Java版本的:HttpClient 登录 oschina。这个版本不太好,居然用jjs去运行js…

(吐槽:你输入的内容包含敏感文字:zuidaima,这是打压竞争对手嘛?以上链接中的“最代码”更改为拼音后访问)

好八,我觉得还是shell比较简单,看代码:

email=$1
pwd=$(echo -n "$2" | sha1sum | cut -d' ' -f1)
username=$3
wget -qO - --user-agent Mozilla --post-data="email=$email&pwd=$pwd" --keep-session-cookies --save-cookies cookies.txt https://www.oschina.net/action/user/hash_login
wget -mkEpP os --user-agent Mozilla --load-cookies cookies.txt http://my.oschina.net/$username/blog-export

就这样完了?

核心代码不过两行便把登录和备份都完成了。当然,照着python版本的做法,当然其他操作也是可以的。

  • 发动态:
eval $(wget -qO - --user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64)" --load-cookies cookies.txt http://www.oschina.net/ | egrep -o "name='(user_code|user)' value='.*'/>" | awk -F\' '{print $2"="$4}')
wget -qO /dev/null --user-agent Mozilla --load-cookies cookies.txt --post-data="user_code=$user_code&user=$user&msg=test" http://www.oschina.net/action/tweet/pub

msg 中的内容就是发出的动弹信息。

  • 发评论:
j=-
for i in `seq 1 100`; do
    msg=$("%-${i}s\n" "$j" | sed "s/ /$j/g")
    wget -qO /dev/null --user-agent Mozilla --load-cookies cookies.txt --post-data="content=$msg" http://www.oschina.net/action/news/comment?news=67399
done

最后数字为新闻ID。


备注:

  • 第一段代码中的 -mkEpP 为以下参数的简写:
  1. 【 –m, --mirror 】递归下载,与 -r 有区别嘛?
  2. 【 -k, --convert-links 】把远程链接转换为本地地址,如:file:///a.jpg...
  3. 【 -E, --adjust-extension 】根据文档类型添加后缀名,也是用于本地加载
  4. 【 -p, --page-requisites 】下载图片和CSS等用于离线浏览
  5. 【 -np, --no-parent 】递归时不上升到父目录,以防下载过量,亦可用 --domains 指定
  6. 【 -P 】指定保存目录前缀

更多参数见:HTTP Options、Make Offline Mirror of a Site using `wget`、

Learn the Wget Command with 20 Practical Examples

虽然加了这么大一堆参数,但是好像并没有递归下载所有url,还是得单独执行:

wget -qO os.html --user-agent=Mozilla --load-cookies cookies.txt http://my.oschina.net/$username/blog-export
# 找出所有图片后并发下载到images目录
egrep -o 'http://static.oschina.net[^"]*.(jpg|gif|png)' os.html | xargs -rL 1 -n 1 -P 10 wget -nc -qP images
# 替换备份文件中的图片链接为本地路径
sed -i -re 's/http:\/\/static.oschina.net\/uploads\/[^"]*\/(.*\.(jpg|gif|png))/images\/\1/g' os.html

so easy!

  • 如果登录失败,可以尝试用更多头部信息请求:
wget -qO - --user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" -A '*' --header="Accept-Language: zh-CN,zh;q=0.8" --header="Content-Type: application/x-www-form-urlencoded" --post-data="email=$email&pwd=$pwd" --keep-session-cookies --save-cookies cookies.txt https://www.oschina.net/action/user/hash_login

测试发现有时 user-agent 只写Mozilla会请求失败,但是用完整的标识信息就没问题。

  • 如果系统中没有自带 sha1sum 程序,使用 openssl 亦可:
echo -n 'pwd' | openssl dgst -sha1 -hex | cut -d' ' -f2

最后,备份文件中使用了 SyntaxHighlighter 来做代码高亮(其实highlight.js 更简单),所以还要引入它:

fs='syntaxhighlighter.zip'
[ -d ${fs%.*} ] || rm -rf ${fs%.*}
wget 'http://alexgorbatchev.com/SyntaxHighlighter/download/download.php?sh_current' -qo $fs
unzip -q $fs && rm -f $fs
# 注意一定要先加载 core.js 后引入语法文件
echo '<script type="text/javascript" src="syntaxhighlighter/scripts/shCore.js"></script>' >> os.html
egrep -o 'brush:[a-z]*' os.html | cut -d: -f2 | sort -u | sed -e '/^$/d' -e 's/\w/\U&/' -e 's/.*/<script type="text\/javascript" src="syntaxhighlighter\/scripts\/shBrush&.js"><\/script>/' >> os.html
echo '<link type="text/css" rel="stylesheet" href="syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript">SyntaxHighlighter.all();</script>' >> os.html

推荐使用 curl 替换wget,优点有DNS解析更快、参数更多等。

eof.


你可能感兴趣的:(shell)