|
经常玩贴吧,刚学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/([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">([^ ]*)', index_open)
133
134 if Tieba != []:
135 for i in range(len(Tieba)):
136 Tieba_Url = "http://tieba.baidu.com/f?kw=" + Tieba[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[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[0]).decode("gb18030").encode("utf-8")
163 #print Tieba_Name
164 #print unquote(Tieba[0])
165 #print Tieba[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[0]), user_sign_rank, cont_sign_num, cout_total_sing_num)
171 else :
172 print "%d.%s" %(i,unquote(Tieba[0])) # print "%d.%s %s" %(i,unquote(Tieba[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,编码要规范
|
|