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()
浙公网安备 33010602011771号