lmwtzw6u5l0 发表于 2015-4-20 10:55:33

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\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/(*)\?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\\/(*)\\/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=(*)&fr=itb_favo&fp=favo" target="_blank">([^ ]*)', index_open)
133      
134         if Tieba != []:
135             for i in range(len(Tieba)):
136               Tieba_Url = "http://tieba.baidu.com/f?kw=" +Tieba
137               Tieba_Open = urllib2.urlopen(Tieba_Url).read()
138
139               #获取tbs
140               Get_Tbs = re.search(r'PageData.tbs = "(*)";',Tieba_Open).group(1)
141
142               #贴吧名字编码
143               Tieba_Name = urllib.unquote(Tieba).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).decode("gb18030").encode("utf-8")
163               #print Tieba_Name
164               #print unquote(Tieba)
165               #print Tieba
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), user_sign_rank, cont_sign_num, cout_total_sing_num)
171               else :
172                     print "%d.%s" %(i,unquote(Tieba))            # print "%d.%s %s" %(i,unquote(Tieba),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,编码要规范
  
  
  
  
  
  
  
页: [1]
查看完整版本: python版 百度签到