命令行更新 cnblog 博客主页副标题,可同步发到闪存或随笔评论

事情是这样的:

我喜欢把博客的副标题当作 qq 的个人签名那样用,没事把心情发到副标题上。并且可以查看以前发表的心情。

但是网页操作需要设置好些步,太麻烦。

先是打算把心情同步发到某篇随笔的评论上(cnblog 的日记不支持评论),然后发现自己的评论会把最新评论给刷了。

随后发现 cnblog 的闪存,同步到这上面不错,http://home.cnblogs.com/ing/,还能即时收到网友的评论。

 

使用示例:

➜  ~  cnblog "超级塞亚人 孙悟空"

login cnblog successfully.

update subtitle successfully.

post shancun successfully.

➜  ~  

查看博客副标题、闪存,会发现已经更新。

 

源代码如下:

linux / python 2.7 / 2012:11:12 15:00 update

  1 #!/usr/bin/env python

  2 #encoding=utf-8

  3 

  4 import sys

  5 import codecs

  6 import urllib

  7 import httplib2

  8 #httplib2.debuglevel = 1

  9 import re

 10 import inspect

 11 

 12 h = httplib2.Http()

 13 user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4"

 14 

 15 #{{{-----------------------------------------------------

 16 #模拟登录,得到带有登录信息的cookie

 17 def cnblog_login(username, password):

 18     login_url = 'http://passport.cnblogs.com/login.aspx'

 19     headers_base = {

 20         "User-Agent":user_agent

 21     }

 22     resp, content = h.request(login_url, headers=headers_base)

 23     #print content

 24 

 25     pat_args = re.compile(r'<input type="hidden" name="(.*?)".*?value="(.*?)" />', re.S)

 26     args = pat_args.findall(content)

 27     if not args:

 28         print 'can not find the arguments of login, check the regex!'

 29     else:

 30         args = dict(args)

 31 

 32     args.update({

 33         "tbUserName":username,

 34         "tbPassword":password,

 35         "btnLogin":"登  录",

 36         "txtReturnUrl":"http://www.cnblogs.com/"

 37     })

 38     #print args

 39 

 40     headers_form = {

 41         "User-Agent":user_agent,

 42         "Content-Type":"application/x-www-form-urlencoded"

 43     }

 44     resp, content = h.request(login_url, method='POST', body=urllib.urlencode(args), headers=headers_form)

 45     #print resp

 46     cookie = resp.get('set-cookie')

 47 

 48     if not cookie:

 49         print 'fail in %s!' % inspect.getframeinfo(inspect.currentframe())[2]

 50         exit()

 51     else:

 52         print 'login cnblog successfully.'

 53 

 54     return cookie

 55 #}}}--------------------------------------------------------------

 56 

 57 def cnblog_get_config(url, headers):

 58     #cookie 错误,也返回200

 59     resp, content = h.request(url, headers=headers)

 60     #print content

 61 

 62     pat_args = re.compile(

 63         r'''

 64         name="__VIEWSTATE".*?value="(.*?)".*?

 65         name="Edit$txbTitle".*?value="(.*?)".*?.*?

 66         name="Edit$txbSubtitle".*?>(.*?)</textarea>.*?

 67         name="Edit$ReplyNotifyMail".*?value="(.*?)".*?

 68         name="Edit$ddlTimezone".*?selected.*?value="(.*?)".*?

 69         name="Edit$ddlLangLocale".*?selected.*?value="(.*?)".*?

 70         name="Edit$ddlSkin".*?selected.*?value="(.*?)".*?

 71         name="Edit$txbSecondaryCss".*?>(.*?)</textarea>.*?

 72         name="Edit$ckbIsDisableMainCss"(.*?)>.*?               #8 checked

 73         name="Edit$txbEditorCss".*?>(.*?)</textarea>.*?

 74         name="Edit$EditorBody".*?>(.*?)</textarea>.*?

 75         name="Edit$txbPageBeginHtml".*?>(.*?)</textarea>.*?

 76         name="Edit$txbPageEndHtml".*?>(.*?)</textarea>.*?

 77         name="Edit$ckbAllowServiceAccess"(.*?)>.*?             #13 checked

 78         name="Edit$lkbPost".*?value="(.*?)"

 79         '''.replace('$', '\$'), re.S | re.X)

 80     args = pat_args.findall(content)

 81     if not args:

 82         print 'can not find the arguments of config!'

 83         exit()

 84     else:

 85         args = list(args[0])

 86 

 87     for index, arg in enumerate(args):

 88         args[index] = arg.strip()

 89         if index == 8 or index == 13:

 90             if arg.find('checked') == -1:

 91                 args[index] = ''

 92             else:

 93                 args[index] = 'on'

 94     #print args

 95 

 96     keys = [

 97         "__VIEWSTATE",

 98         "Edit$txbTitle",

 99         "Edit$txbSubtitle",

100         "Edit$ReplyNotifyMail",

101         "Edit$ddlTimezone",

102         "Edit$ddlLangLocale",

103         "Edit$ddlSkin",

104         "Edit$txbSecondaryCss",

105         "Edit$ckbIsDisableMainCss",

106         "Edit$txbEditorCss",

107         "Edit$EditorBody",

108         "Edit$txbPageBeginHtml",

109         "Edit$txbPageEndHtml",

110         "Edit$ckbAllowServiceAccess",

111         "Edit$lkbPost",

112     ]

113     args = zip(keys, args)

114     args = dict(args)

115 

116     return args

117 

118 def cnblog_set_config(url, subtitle, args, headers):

119     if args['Edit$txbSubtitle'] == subtitle:

120         print "same subtitle, don't update."

121         return None

122     args['Edit$txbSubtitle'] = subtitle

123     resp, content = h.request(url, method='POST', body=urllib.urlencode(args), headers=headers)

124     if resp['status'] == '200':

125         print 'update subtitle successfully.'

126         return True

127     else:

128         print 'fail in %s!' % inspect.getframeinfo(inspect.currentframe())[2]

129         #print resp

130         return False

131 

132 #blog_id 为博客文章url中日期后的一串数字

133 def cnblog_post_comment(headers, blog_id, comment):

134     url = 'http://www.cnblogs.com/mvc/PostComment/New.aspx'

135     body = '{"postId":%s,"Body":"%s","ParentCommentID":0}' % (blog_id, comment)

136     resp, content = h.request(url, method='POST', body=body, headers=headers)

137     if resp['status'] == '200':

138         print 'post comment successfully.'

139         return True

140     else:

141         print 'fail in %s!' % inspect.getframeinfo(inspect.currentframe())[2]

142         #print resp

143         return False

144 

145 def cnblog_post_shancun(headers, shancun):

146     url = 'http://home.cnblogs.com/ajax/ing/Publish'

147     body = '{"content":"%s","publicFlag":1}' % shancun

148     resp, content = h.request(url, method='POST', body=body, headers=headers)

149     if resp['status'] == '200':

150         print 'post shancun successfully.'

151         return True

152     else:

153         print 'fail in %s!' % inspect.getframeinfo(inspect.currentframe())[2]

154         #print resp

155         return False

156 

157 

158 def write_to_file(file_name, txt):

159     with codecs.open(file_name, "w", "utf-8") as f:

160         f.write(txt)

161 

162 def read_from_file(file_name):

163     with codecs.open(file_name, "r", "utf-8") as f:

164         txt = f.read()

165         txt = txt.encode('utf-8')

166     return txt

167 

168 

169 if __name__ == '__main__':

170     if len(sys.argv) != 2:

171         print 'Usage: cnblog "update subtitle"'

172         sys.exit()

173     else:

174         subtitle = sys.argv[1].strip(''' "''')

175 

176     username = 'your username'

177     password = 'your password'

178 

179     if 0:

180         #保存cookie,但cookie失效需手动删除cookie文件

181         import os

182         cookie_txt = '/tmp/cnblog_cookie.txt'

183         if os.path.isfile(cookie_txt):

184             cookie = read_from_file(cookie_txt)

185         else:

186             cookie = cnblog_login(username, password)

187             write_to_file(cookie_txt, cookie)

188 

189     else:

190         #不保存cookie

191         cookie = cnblog_login(username, password)

192 

193     headers = {

194         "Cookie":cookie,

195         "User-Agent":user_agent

196     }

197     headers_form = {

198         "Cookie":cookie,

199         "Content-Type":"application/x-www-form-urlencoded",

200         "User-Agent":user_agent

201     }

202     headers_json = {

203         "Cookie":cookie,

204         "Content-Type":"application/json; charset=UTF-8",

205         "User-Agent":user_agent

206     }

207 

208     config_url = 'http://www.cnblogs.com/' + username +'/admin/Configure.aspx'

209     config_args = cnblog_get_config(config_url, headers)

210     flag = cnblog_set_config(config_url, subtitle, config_args, headers_form)

211     if flag:

212         cnblog_post_shancun(headers_json, subtitle)

213 

214     #cnblog_post_comment(headers_json, blog_id, subtitle)

215 

216     if 0:

217         #看到有幸运闪,刚试了下连闪10下,‘我的’里面倒是显示全了,全站里只显4下,他们说,小心进小黑屋

218         for i in range(10):

219             shancun = '' + '' * i + ''

220             print shancun

221             cnblog_post_shancun(headers_json, shancun)

将上面代码保存为 cnblog,把其中的 username,password 改成自己的,加上可执行权限,即可像示例那样使用。

将该程序添加为自定义命令使在任何地方可运行,详见 linux 添加管理自定义命令

 

原文:http://www.cnblogs.com/congbo/archive/2012/11/12/2766360.html

你可能感兴趣的:(Blog)