python版 百度簽到


經常玩貼吧,剛學python ,所以自己弄了一個python版的簽到程序。自己的東西總是最好的。

登陸模塊參考的http://www.crifan.com/emulate_login_website_using_python/。簽到模塊自己找百度瞎糊弄的,寫的很爛,代碼一點都不規范。有什么建議可以提

 

  1 # 594595116@qq.com
  2 
  3 import re
  4 import urllib
  5 import urllib2
  6 import cookielib
  7 import json
  8 import sys
  9 import time
 10 from urllib import quote,unquote
 11 from urllib2 import HTTPError
 12 from urllib2 import URLError
 13 
 14 def t():
 15     print "按(Y/y)繼續,其他退出!"
 16     t = raw_input(">>")
 17     if (t=="y" or t=="Y"):
 18         Login()
 19     else :
 20         print "感謝您的使用。"
 21         print "email:594595116@qq.com"
 22         time.sleep(5)  
 23 
 24 
 25 #登陸模塊
 26 def Login():
 27     
 28     ID = raw_input("百度賬號(暫不支持手機和郵箱登陸) :")
 29     ID1 = ID.decode("gb18030").encode("utf-8") #--注意編碼,可能網站會識別不了而導致登陸失敗
 30     PassWord = raw_input("密碼 :")    
 31     
 32     try :
 33         cj = cookielib.CookieJar();
 34         opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj));
 35         urllib2.install_opener(opener); 
 36         
 37         #打開百度獲得 cookie
 38         baidu_URL = "http://www.baidu.com"
 39         staticpage = "http://www.baidu.com/cache/user/html/jump.html";
 40         baidu_Login_URL = "https://passport.baidu.com/v2/api/?login";     
 41         baidu_OPEN = urllib2.urlopen(baidu_URL)
 42         
 43         #獲得所需的數據 token
 44         getapiUrl = "https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true";
 45         getapiResp = urllib2.urlopen(getapiUrl);
 46         getapiRespHtml = getapiResp.read();
 47         
 48         foundTokenVal = re.search("bdPass\.api\.params\.login_token='(?P<tokenVal>\w+)';", getapiRespHtml);    
 49         tokenVal = foundTokenVal.group("tokenVal");
 50         
 51         #生成要發送的數據
 52         if(foundTokenVal):
 53             LoginData = {
 54                 'staticpage':staticpage,#'http://www.baidu.com/cache/user/html/v3Jump.html',
 55                 'charset':'UTF-8',
 56                 'token':tokenVal,
 57                 'tpl':'mn',
 58                 #'apiver':'v3',
 59                 #'tt':'1375838455898',
 60                 #'codestring':'',
 61                 'isPhone':'false',
 62                 #'safeflg':'0',
 63                 #'u':'http://www.baidu.com/',
 64                 #'quick_user':'0',
 65                 'username':ID1,
 66                 'password':PassWord,
 67                 #'verifycode':'',
 68                 'mem_pass':'on',
 69                 #'ppui_logintime':'11211',
 70                 'callback':'parent.bdPass.api.login._postCallback',
 71                 }; 
 72             
 73             
 74             
 75             #把發送數據轉換格式
 76             LoginData = urllib.urlencode(LoginData);    
 77             
 78             #生成請求數據
 79             baidu_Login_Request = urllib2.Request(baidu_Login_URL, LoginData);
 80             
 81             #添加數據頭部
 82             baidu_Login_Request.add_header('Content-Type', "application/x-www-form-urlencoded");
 83             baidu_Login_Request.add_header('User-Agent', "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31");
 84            
 85             #發送請求,嘗試登陸
 86             baidu_Login_Open = urllib2.urlopen(baidu_Login_Request);
 87             
 88             #驗證登陸是否成功
 89             #tt = urllib2.urlopen(baidu_URL).read().encode("gb18030")
 90             #print tt
 91             #ttt = re.search(r'href="/p/([0-9A-Za-z%]*)\?from=super"',tt).grop(1)
 92             #print ttt
 93             yanzheng_url = "http://www.baidu.com/p/" + ID1
 94             yanzheng_open = urllib2.urlopen(yanzheng_url)
 95             yanzheng_open = yanzheng_open.read().encode("gb18030")
 96             yanzheng = re.search(r"'sexTitle' : '([^ ]*)'", yanzheng_open).group(1)
 97             
 98             if(yanzheng == ""):
 99                 print "%s  成功登陸, ^_^" %ID
100                 print "簽到正在進行中。。"
101                 Sign(ID)
102             else:
103                 print "%s  登陸失敗! 請稍后嘗試! " %ID
104                 Login()
105         else:
106             print "%s  登陸失敗! 請稍后嘗試! " %ID
107             Login()
108                # print "Fail to extract token value from html=",getapiRespHtml;    
109             
110     except :
111         print "登陸出錯啦!"
112         t()     
113         
114         
115 #簽到模塊      
116 def Sign(ID):
117     
118     try :
119         #簽到請求地址
120         Sign_Request_Url = "http://tieba.baidu.com/sign/add"
121     
122         #用戶的貼吧
123         ID_Tieba_Url = "http://www.baidu.com/p/" + ID + "?from=tieba" 
124         ID_Tieba_Open = urllib2.urlopen(ID_Tieba_Url).read()
125 
126         #i貼吧id
127         itieba_id = re.search(r'i\\/([0-9]*)\\/others\?from=princess', ID_Tieba_Open).group(1)
128         index = "http://tieba.baidu.com/i/" + itieba_id + "?fr=index"
129         
130         #匹配貼吧
131         index_open = urllib2.urlopen(index).read()
132         Tieba = re.findall(r'kw=([0-9A-Za-z%]*)&fr=itb_favo&fp=favo" target="_blank">([^ ]*)</a>', index_open)
133        
134         if Tieba != []:
135             for i in range(len(Tieba)):
136                 Tieba_Url = "http://tieba.baidu.com/f?kw=" +  Tieba[i][0]
137                 Tieba_Open = urllib2.urlopen(Tieba_Url).read()
138 
139                 #獲取tbs
140                 Get_Tbs = re.search(r'PageData.tbs = "([0-9a-z]*)";',Tieba_Open).group(1)
141 
142                 #貼吧名字編碼
143                 Tieba_Name = urllib.unquote(Tieba[i][0]).decode("gb18030").encode("utf-8")
144                 kw = Tieba_Name
145                    
146                 #簽構造到請求數據 和 編碼
147                 Sign_Request_Data={'ie':'utf-8','kw':kw,'tbs':Get_Tbs}
148                 Sign_Request_Data = urllib.urlencode(Sign_Request_Data)
149                    
150                 #發送簽到請求
151                 Sign_Request = urllib2.Request(Sign_Request_Url, Sign_Request_Data)
152                 Sign_Request.add_header('User-agent', "Mozilla/5.0 (X11; Linux i686)")
153                 Sign = urllib2.urlopen(Sign_Request)
154                    
155                 #獲取響應數據
156                 Response = Sign.read()
157                 
158                 #把響應轉成字典
159                 Response = json.loads(Response)
160                 #print Response
161                    
162                 Tieba_Name = urllib.unquote(Tieba[i][0]).decode("gb18030").encode("utf-8")
163                 #print Tieba_Name
164                 #print unquote(Tieba[i][0])
165                 #print Tieba[i][0]
166                 if(Response['error']=="") :
167                     user_sign_rank = int(Response['data']['uinfo']['user_sign_rank'])                      #第幾個簽到
168                     cont_sign_num = int(Response['data']['uinfo']['cont_sign_num'])                        #連續簽到
169                     cout_total_sing_num = Response['data']['uinfo']['cout_total_sing_num']                 #累計簽到
170                     print "%d..%s             簽到成功,第%d個簽到,連續簽到%d天,累計簽到%d天" %(i, unquote(Tieba[i][0]), user_sign_rank, cont_sign_num, cout_total_sing_num)
171                 else :
172                     print "%d.%s" %(i,unquote(Tieba[i][0]))            # print "%d.%s %s" %(i,unquote(Tieba[i][0]),Response['error'])   不知道為什么這樣是不行的,總是亂碼。
173                     print "--------------------%s"  %Response['error'] # print "%d.%s %s" %(i,Tieba_Name,Response['error'])             這樣卻可以,所以把他們拆分了
174                 time.sleep(3)
175         else :
176             print "你還沒有喜歡的貼吧!"
177                    
178         print "一共有%d個喜歡的吧" %(i+1)            
179         t()
180     except :
181         print "簽到出錯啦! "
182         t()
183 
184 
185 if __name__ == "__main__" :
186     Login()
187     

 

 

 

經驗總結:1,編碼問題需要注重 2,編碼要規范

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM