里面的bdLogin在“http://blog.youkuaiyun.com/qq506657335/article/details/18924731”里面
"""
02/19/14
今天挂在bae上面的自动签到失效了,所以打开自己做的这个进行签到,发现运行后只有一部分贴吧签到了,进入http://tieba.baidu.com/f/like/mylike发现原来自己的贴吧太多了,被分成了3页(做这个的时候用的是小号,没几个关注的贴吧,所以不知道有分页这种事),于是修改了下。。。
将下面代码里面的def getList(opener)函数换成下面这个就Ok了。。。
reg_likePageNum = re.compile('<a href="[^&]*&pn=(\d+)">尾页</a>');
def getList(opener):
def getPageNum(opener):
try:
return reg_likePageNum.findall(opener.open(GETLIKE_URL).read().decode("gbk"))[0];
except:
return 1;
pageNum = getPageNum(opener);
list = [];
for i in range(1, int(pageNum) + 1):
list += reg_likeUrl.findall(opener.open(GETLIKE_URL + "?&pn={0}".format(i)).read().decode("gbk"));
return list;
"""
import bdLogin
import re;
import urllib;
import urllib.request;
import multiprocessing;
import json;
import pickle;
from urllib.parse import urlencode;
TIEBA_URL = "http://tieba.baidu.com";
GETLIKE_URL = "http://tieba.baidu.com/f/like/mylike";
SIGN_URL = "http://tieba.baidu.com/sign/add";
reg_likeUrl = re.compile("<a href=\"([^\"]+)\" title=\"([^\"]+)\">");
reg_getTbs = re.compile("PageData.tbs = \"(\w+)\"");
def getTbTbs(opener, url):
return reg_getTbs.findall(opener.open(TIEBA_URL + url).read().decode("gbk"))[0];
#获取喜欢的贴吧列表
def getList(opener):
return reg_likeUrl.findall(opener.open(GETLIKE_URL).read().decode("gbk"));
signHeaders = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36 LBBROWSER",
"Host":"tieba.baidu.com",
"Origin":"http://tieba.baidu.com",
"Referer":"http://tieba.baidu.com",
}
#要post的表格
signData = {
"ie":"utf-8",
"kw":"",
"tbs":"",
}
class autoSign:
def __init__(self, user = "", psw = ""):
login = bdLogin.tbLogin();
self._opener = login.login(user, psw);
def getList(self, update = 1):
if(update): #update为1时会更新签到表,为0时则只从文件中加载
file = open("list.data", "wb");
self._likeList = getList(self._opener);
pickle.dump(self._likeList, file);
file.close();
else:
file = open("list.data", "rb");
self._likeList = pickle.load(file);
file.close();
def sign(self):
pool = multiprocessing.Pool(processes = 4);
list = [];
for url in self._likeList: #多进程执行
list.append(pool.apply_async(self._signProcess, args = (url, )));
for ret in list: #取回结果
print(ret.get());
def _signProcess(self, url):
signData["kw"] = url[1];
signData["tbs"] = getTbTbs(self._opener, url[0]); #获取tbs
signHeaders["Referer"] = signHeaders["Origin"] + url[0];
request = urllib.request.Request(SIGN_URL, headers = signHeaders);
result = json.loads(self._opener.open(request, urlencode(signData).encode("utf-8")).read().decode("utf-8"));
if(result["no"] == 0): #签到成功
return "{0}吧签到成功,今天是第{1}个签到!".format(url[1], result["data"]["uinfo"]["user_sign_rank"])
elif(result["no"] == 1101): #已签过
return "{0}吧之前已经签到过了哦!".format(url[1]);
else: #出错
return "未知错误!" + "\n" + url + "\n" + result;
def main():
asRobot = autoSign("", ""); #传入用户名和密码
asRobot.getList(); #先获取列表再进行签到
asRobot.sign();
if(__name__ == "__main__"):
main();
图。。。。