cnblog 闪存刷星星,每一条闪存都是星星

使用示例:

➜  ~  shancun 天亮说晚安
1: post shancun successfully.
2: post shancun successfully.
3: post shancun successfully.
4: post shancun successfully.
Has become lucky star!~ 

ps:闪存若包含空格,加双引号。

 

查看闪存:

 

源代码如下:

linux / python 2.7 / 2012:11:15 03:44 update

为求简单,出错即退出。玩具程序,娱乐即可。

  1 #!/usr/bin/env python
  2 #encoding=utf-8
  3 
  4 import sys
  5 import urllib
  6 import httplib2
  7 #httplib2.debuglevel = 1
  8 import re
  9 from lxml import etree
 10 import codecs
 11 import inspect
 12 
 13 h = httplib2.Http()
 14 user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4"
 15 
 16 #{{{-----------------------------------------------------
 17 #模拟登录,得到带有登录信息的cookie
 18 def cnblog_login(username, password):
 19     login_url = 'http://passport.cnblogs.com/login.aspx'
 20     headers_base = {
 21         "User-Agent":user_agent
 22     }
 23     resp, html = h.request(login_url, headers=headers_base)
 24     #print html
 25 
 26     pat_args = re.compile(r'<input type="hidden" name="(.*?)".*?value="(.*?)" />', re.S)
 27     args = pat_args.findall(html)
 28     if not args:
 29         print 'can not find the arguments of login, check the regex!'
 30     else:
 31         args = dict(args)
 32 
 33     args.update({
 34         "tbUserName":username,
 35         "tbPassword":password,
 36         "btnLogin":"登  录",
 37         "txtReturnUrl":"http://www.cnblogs.com/"
 38     })
 39     #print args
 40 
 41     headers_form = {
 42         "User-Agent":user_agent,
 43         "Content-Type":"application/x-www-form-urlencoded"
 44     }
 45     resp, html = h.request(login_url, method='POST', body=urllib.urlencode(args), headers=headers_form)
 46     #print resp
 47     cookie = resp.get('set-cookie')
 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_post_shancun(headers, shancun):
 58     url = 'http://home.cnblogs.com/ajax/ing/Publish'
 59     #body = '{"html":"%s","publicFlag":1}' % shancun
 60     body = '{"content":"%s","publicFlag":1}' % shancun
 61     resp, html = h.request(url, method='POST', body=body, headers=headers)
 62     if resp['status'] != '200':
 63         print 'fail in %s!' % inspect.getframeinfo(inspect.currentframe())[2]
 64         print resp
 65         exit()
 66 
 67 def get_shancun_html(headers):
 68     url = 'http://home.cnblogs.com/ing/'
 69     resp, html = h.request(url, headers=headers)
 70     if resp['status'] != '200':
 71         print 'fail in %s!' % inspect.getframeinfo(inspect.currentframe())[2]
 72         print resp
 73         exit()
 74     #print 'get shancun html successfully.'
 75     return html
 76 
 77 def get_shancun_content(html):
 78     expr = '//*[@id="feed_list"]'
 79     html = html.decode("utf-8", 'ignore')
 80     content = etree.HTML(html)
 81     content = content.xpath(expr)
 82     if not content:
 83         print 'get shancun content fail, check xpath!'
 84         exit()
 85     content = etree.tostring(content[0], encoding="utf-8")
 86     #print content[:600]
 87     #print 'get shancun content successfully.'
 88     return content
 89 
 90 def isnot_lucky_shancun(username, shancun, content):
 91     pat = re.compile(
 92         r'''
 93         href="/u/%s/"\ class="big_font\ blue".*?<span.*?id="ing_body_(.*?)">
 94         (.*?)</span>
 95         (.*?)class="ing_time"
 96         ''' % username, re.S | re.X
 97     )
 98     #<img src="http://static.cnblogs.com/images/ing_lucky.png" class="ing_icon_lucky" alt="" title="这是幸运闪">
 99     my_shancun = pat.findall(content)
100     if not my_shancun:
101         print 'can not find shancun, check the regex!'
102         exit()
103     else:
104         my_shancun = my_shancun[0]
105     shancun_id, my_lastest_shancun, about_star = my_shancun
106     #print shancun_id, my_lastest_shancun, about_star
107 
108     #XXX 发送同一闪存,或者闪存的post方法发生变化,会导致闪存不显示
109     if shancun != my_lastest_shancun:
110         # 闪存中若有http:// 或 https:// 会自动添加格式
111         if shancun.find('http://') == -1 and shancun.find('https://') == -1:
112             #print '[',shancun,']'
113             #print '[',my_lastest_shancun,']'
114             print '%s is not display correctly!' % shancun
115             exit()
116     if about_star.find('ing_icon_lucky') != -1:
117         return None
118     else:
119         return shancun_id
120 
121 def delete_shancun(headers, shancun_id):
122     url = 'http://home.cnblogs.com/ajax/ing/del'
123     body = '{ingId:%s}' % shancun_id
124     resp, html = h.request(url, method='POST', body=body, headers=headers)
125     if resp['status'] != '200':
126         print 'fail in %s!' % inspect.getframeinfo(inspect.currentframe())[2]
127         print resp
128         exit()
129     #print 'delete shancun successfully.'
130 
131 
132 def write_to_file(file_name, txt):
133     with codecs.open(file_name, "w", "utf-8") as f:
134         f.write(txt)
135 
136 def read_from_file(file_name):
137     with codecs.open(file_name, "r", "utf-8") as f:
138         txt = f.read()
139         txt = txt.encode('utf-8')
140     return txt
141 
142 
143 if __name__ == '__main__':
144     if len(sys.argv) != 2:
145         print 'Usage: shancun "要发的闪存"'
146         sys.exit()
147     else:
148         shancun = sys.argv[1].strip(''' "''')
149 
150     username = 'you username'
151     password = 'your password'
152 
153     if 1:
154         #保存cookie,但cookie失效需手动删除cookie文件
155         import os
156         cookie_txt = '/tmp/cnblog_cookie.txt'
157         if os.path.isfile(cookie_txt):
158             cookie = read_from_file(cookie_txt)
159         else:
160             cookie = cnblog_login(username, password)
161             write_to_file(cookie_txt, cookie)
162 
163     else:
164         #不保存cookie
165         cookie = cnblog_login(username, password)
166 
167     headers = {
168         "Cookie":cookie,
169         "User-Agent":user_agent
170     }
171     headers_json = {
172         "Cookie":cookie,
173         "Content-Type":"application/json; charset=UTF-8",
174         "User-Agent":user_agent
175     }
176 
177 
178     #一页里一个人最多连续5条,不能发布相同内容
179     count = 0
180     while True:
181         cnblog_post_shancun(headers_json, shancun)
182         count += 1
183 
184         html = get_shancun_html(headers)
185         content = get_shancun_content(html)
186         shancun_id = isnot_lucky_shancun(username, shancun, content)
187         print '%s: post shancun successfully.' % count
188         if not shancun_id:
189             print 'Has become lucky star!'
190             break
191         else:
192             delete_shancun(headers_json, shancun_id)
193             if count >= 33:
194                 print '人品差了点,歇一会再试吧!'
195                 break

 

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

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

 

原文:http://www.cnblogs.com/congbo/archive/2012/11/15/2770880.html

posted @ 2012-11-15 03:54  congbo  阅读(3214)  评论(7编辑  收藏  举报