百度贴吧登陆、签到、回帖(要验证码的失败)

Posted on 2013-09-08 23:23  sylar少侠  阅读(1497)  评论(0)    收藏  举报
  1 # -*- coding: utf8 -*- 
  2 
  3 import cookielib, urllib2, urllib
  4 import os,sys,socket,re,json,time
  5 reload(sys)
  6 sys.setdefaultencoding('utf-8')
  7 
  8 
  9 
 10 #获取登陆token
 11 login_tokenStr = '''bdPass.api.params.login_token='(.*?)';'''
 12 login_tokenObj = re.compile(login_tokenStr,re.DOTALL)
 13 
 14 class Baidu(object):
 15     def __init__(self,user = '', psw = ''):
 16         self.user = user#暂未考虑中文ID
 17         self.psw  = psw
 18         
 19         if not user or not psw:
 20             print "Plz enter enter 2 params:user,psw"
 21             sys.exit(0)
 22  
 23         self.cookiename = 'baidu%s.coockie' % (urllib.quote(self.user))#'baidulog.cookie'#
 24         self.token = '' 
 25 
 26         self.logined = False
 27         self.cj = cookielib.LWPCookieJar()
 28         
 29         try:
 30             self.cj.revert(self.cookiename)
 31             self.logined = True
 32             print "OK"
 33         except Exception,e:
 34             print e
 35          
 36         self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))
 37         self.opener.addheaders = [('User-agent','Opera/9.23')]
 38         urllib2.install_opener(self.opener)
 39 
 40         socket.setdefaulttimeout(30)
 41 
 42     #登陆百度
 43     def login(self):
 44         #如果没有获取到cookie,就模拟登陆一下
 45         if not self.logined:
 46             print "need logon"
 47             #第一次访问一下,目的是为了先保存一个cookie下来
 48             qurl = '''https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=false'''
 49             r = self.opener.open(qurl)
 50             self.cj.save(self.cookiename)
 51 
 52             #第二次访问,目的是为了获取token
 53             qurl = '''https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=false'''
 54             r = self.opener.open(qurl)
 55             rsp = r.read()
 56             print r
 57             print '*************'
 58             
 59             self.cj.save(self.cookiename)
 60             f=open('qurl.txt','w')
 61             f.write(rsp)
 62             f.close()
 63             #通过正则表达式获取token
 64             matched_objs = login_tokenObj.findall(rsp)
 65             if matched_objs:
 66                 self.token = matched_objs[0]
 67                 print self.token
 68                 #然后用token模拟登陆
 69                 post_data = urllib.urlencode({'username':self.user,
 70                                               'password':self.psw,
 71                                               'token':self.token,
 72                                               'charset':'UTF-8',
 73                                               'callback':'parent.bd12Pass.api.login._postCallback',
 74                                               'index':'0',
 75                                               'isPhone':'false',
 76                                               'mem_pass':'on',
 77                                               'loginType':'1',
 78                                               'safeflg':'0',
 79                                               'staticpage':'https://passport.baidu.com/v2Jump.html',
 80                                               'tpl':'mn',
 81                                               'u':'http://www.baidu.com/',
 82                                               'verifycode':'',
 83                                               'isPhone':'false',
 84                                               'safeflg':0,
 85                                               'splogin':'rate',
 86                                               'quick_user':0
 87                                             })
 88                 #path = 'http://passport.baidu.com/?login'
 89                 path = 'http://passport.baidu.com/v2/api/?login'
 90                 self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))
 91                 self.opener.addheaders = [('User-agent','Opera/9.23')]
 92                 urllib2.install_opener(self.opener)
 93                 headers = {
 94                   "Accept": "image/gif, */*",
 95                   "Referer": "https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F",
 96                   "Accept-Language": "zh-cn",
 97                   "Content-Type": "application/x-www-form-urlencoded",
 98                   "Accept-Encoding": "gzip, deflate",
 99                   "User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",
100                   "Host": "passport.baidu.com",
101                   "Connection": "Keep-Alive",
102                   "Cache-Control": "no-cache"
103                 }
104                 req = urllib2.Request(path,
105                                 post_data,
106                                 headers=headers,
107                                 )
108                 rsp = self.opener.open(req).read()
109                 #如果觉得有必要的话,在这里自己读一下rsp判断一下是否登陆OK,我打印过登陆没问题
110                 f=open('log.txt','w')
111                 f.write(rsp)
112                 f.close()
113                 print rsp
114                 self.cj.save(self.cookiename)
115             else:
116                 print "Login Fail"
117                 sys.exit(0)
118     def Sign(self):
119         #try:
120         Signurl = "http://tieba.baidu.com/sign/add"
121         Tiebaurl = "http://www.baidu.com/p/" + urllib2.quote(self.user) + "?from=tieba" 
122         content = self.opener.open(Tiebaurl).read()
123         self.cj.save(self.cookiename)
124         
125         itieba_id = re.search(r'i\\/([0-9]*)\\/others\?from=princess', content).group(1)
126         
127 
128         Tieba = re.findall(r'f\?kw=(.*?)&from=prin\\x22 target=_blank title=\\x22(.*?)\\x22>', content)
129        
130         for i in range(len(Tieba)):
131           Tieba_Url = "http://tieba.baidu.com/f?kw=" +  Tieba[i][0] 
132           Tieba_Open = self.opener.open(Tieba_Url).read()
133           self.cj.save(self.cookiename)
134           Get_Tbs = re.search(r'PageData.tbs = "([0-9a-z]*)";',Tieba_Open).group(1)
135           Tieba_Name = urllib.unquote(Tieba[i][0]).decode('gbk').encode('utf8')
136           print Tieba_Name
137           kw = Tieba_Name
138           
139           post_data={'ie':'utf-8','kw':kw,'tbs':Get_Tbs}
140           post_data = urllib.urlencode(post_data)
141           headers = {
142                   "Accept": "image/gif, */*",
143                   "Referer": Tieba_Url+"&from=prin",
144                   "Accept-Language": "zh-cn",
145                   "Content-Type": "application/x-www-form-urlencoded",
146                   "Accept-Encoding": "gzip, deflate",
147                   "User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",
148                   "Host": "tieba.baidu.com",
149                   "Connection": "Keep-Alive",
150                   "Cache-Control": "no-cache"
151                 }
152           req = urllib2.Request(Signurl,
153                                 post_data,
154                                 headers=headers,
155                                 )
156           rsp = self.opener.open(req).read()
157 
158           '''print rsp
159           Response = json.loads(rsp)
160           Tieba_Name = urllib.unquote(Tieba[i][0]).decode("gbk").encode("utf-8")
161           print Tieba_Name
162           if(Response['error']=="") :
163             user_sign_rank = int(Response['data']['uinfo']['user_sign_rank'])
164             cont_sign_num = int(Response['data']['uinfo']['cont_sign_num'])
165             cout_total_sing_num = Response['data']['uinfo']['cout_total_sing_num']
166             print "%d..%s             签到成功,第%d个签到,连续签到%d天,累计签到%d天" %(i, unquote(Tieba[i][0]), user_sign_rank, cont_sign_num, cout_total_sing_num)
167           else :
168             print "%d.%s" %(i,unquote(Tieba[i][0]))
169             print "--------------------%s"  %Response['error'] 
170           '''
171           time.sleep(3)
172           #break;
173         #except:
174         #  print 'error'
175     def Post(self,postid,text): 
176       Commiturl='http://tieba.baidu.com/f/commit/post/add'
177       Posturl='http://tieba.baidu.com/p/'+postid;
178       content = self.opener.open(Posturl).read()
179       self.cj.save(self.cookiename)
180       PageData=re.findall(r'var PageData={[^}]+};',content)[0]
181       tbs=re.findall(r"'tbs'  : \"([0-9a-z]*)\",",content)[0]
182      
183       f=open('get.txt','w')
184       f.write(PageData)
185       f.close()
186       kw=re.findall(r'forum_name:\"(.*?)\"',PageData)[0]
187       fid=re.findall(r'forum_id:([\d]+),',PageData)[0]
188       floor_num=re.findall(r'total_post_num:([\d]+),',PageData)[0]
189 
190       print floor_num
191       post_data = urllib.urlencode({'kw':kw,
192                                     'ie':'UTF-8',
193                                     'fid':fid,
194                                     'tid':postid,                               
195                                     'rich_text':'1',
196                                     'floor_num':floor_num,
197                                     'lp_type':'0',
198                                     'lp_sub_type':'0',
199                                     'content':text,
200                                     'anonymous':'0',
201                                     'tbs':'',
202                                     'tag':'11', 
203                                     'new_vcode':'1',
204                                     'tbs':tbs
205                                     })       
206       headers = {
207                   "Accept": "image/gif, */*",
208                   "Referer": Posturl,
209                   "Accept-Language": "zh-cn",
210                   "Content-Type": "application/x-www-form-urlencoded",
211                   "Accept-Encoding": "gzip, deflate",
212                   "User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",
213                   "Host": "tieba.baidu.com",
214                   "Connection": "Keep-Alive",
215                   "Cache-Control": "no-cache"
216                 }
217       req = urllib2.Request(Commiturl,
218                             post_data,
219                             headers=headers,
220                             )
221       time.sleep(1)
222       rsp = self.opener.open(req).read()
223       self.cj.save(self.cookiename)
224       print rsp
225       f=open('post.txt','w')
226       f.write(rsp)
227       f.close()
228     
229 
230 
231 
232 
233     def getAllPost(self,tbid):
234       tbid=urllib.quote(tbid)
235       Tburl='http://tieba.baidu.com/f?kw='+tbid
236       r = self.opener.open(Tburl).read()
237       self.cj.save(self.cookiename) 
238       S= re.findall(r'<div class=\"threadlist_text threadlist_title j_th_tit  notStarList \">[\s]*?<a href=\"/p/([\d]+)\" title=\"(.*?)\"', r)
239       for i in range(len(S)):
240         print S[i][1].decode('gbk').encode('utf8')
241 def main():
242     user = '***'       #你的百度登录名
243     psw  = '***'  # 
244     baidu = Baidu(user,psw)
245     baidu.login()
246     #baidu.Sign()
247     #baidu.getAllPost('李毅')
248     baidu.Post('2583333253','hello world\nPython Test')
249 if __name__ == '__main__':
250     main()

 

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3