好友
阅读权限 10
听众
最后登录 1970-1-1
因为百度异地登陆有诸多限制,所以使用了cookie登录,实现一键签到所有关注贴吧,效果如下图
python3 使用到的第三方库 有 requests ,bs4
只需要输入自己的cookie值就可以使用,挂在自己的服务器上,每天自动签到美滋滋,
cookie有效期很久,我自己的已经使用了四十多天了,依然有效# -*- coding:utf-8 -*-
import requests,datetime,re,os,sys,time
from bs4 import BeautifulSoup
def match_bar_name(soup):
'''
获取 #### 当前页 ### 关注贴吧名字 和 链接,返回列表数据,格式[{'name':'abc','link':'www.asdfaf.asdfasdf'},'name':'abc','link':'www.asdfaf.asdfasdf'}],
这里关注的贴吧名字隐藏在了html中,无法直接访问获取json返回值,用到了bs4处理网页数据
'''
list=[]
for i in soup.find_all('a'):
if i.has_attr('href') and not i.has_attr('class') and i.has_attr('title'):
if i.string != 'lua':
list.append({'name':i.string,'link':'http://tieba.baidu.com/'+i.get('href')})
return list
# url='http://tieba.baidu.com/f/like/mylike?v=%d'%int(float(time.time())*1000)
def get_bar_link():
'''
获取 ##### 所有页 ####关注贴吧 名字 和 链接,遍历所有页,直到最后一页
'''
url=r'http://tieba.baidu.com/f/like/mylike?pn=%d'
pg=1
l = []
while 1:
res=s.get(url%pg,headers=headers)
soup=BeautifulSoup(res.text,'html.parser')
l.extend(match_bar_name(soup))
if '下一页' in str(soup):
pg+=1
else:
return l
def check(name,link):
'''
name: 贴吧名字
link:贴吧链接
利用正则表达式 获取每个关注贴吧 提交数据tbs
然后签到,并返回签到结果
'''
try:
res=s.get(link)
tbs=re.compile('\'tbs\': "(.*?)"')
find_tbs=re.findall(tbs,res.text)
if not find_tbs: ###### 没有查找到tbs 跳过这个吧的签到 ##################
return -1
data={
'ie':'utf-8',
'kw':name,
'tbs':find_tbs[0],
}
url='http://tieba.baidu.com/sign/add'
res=s.post(url,data=data,headers=headers) ######## 签到 post
print(datetime.datetime.now(),' ',name,' ',res.json())
return int(res.json()['no']) #########返回提交结果
except:
return -1
s=requests.session()
cookie='BAIDUID=A3043B35EDF6***********************************47991882' #########类似于这样的一段代码########### 浏览器提取 ########等会附上提取教程
headers={
'Cookie':cookie,
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
}
for i in get_bar_link():
'''
根据签到的返回值 处理结果
'''
try:
res=check(i['name'], i['link'])
if res==0:
with open(os.path.join(sys.path[0], '1.log'), 'a+') as f: ###############这边使用sys.path 是为了在linux 后台启动时识别路径 ################
f.write(str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + ' ' + i['name'] + ' 签到成功\n')
elif res==1101:
with open(os.path.join(sys.path[0], '1.log'), 'a+') as f:
f.write(str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + ' ' + i['name'] + ' 亲,你之前已经签过到了\n')
elif res==1102:
with open(os.path.join(sys.path[0], '1.log'), 'a+') as f:
f.write(str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + ' ' + i['name'] + ' 签到太快,重新签到本吧\n')
time.sleep(10)
check(i['name'], i['link'])
else:
print('未知返回值,重新签到本吧')
check(i['name'], i['link'])
time.sleep(2) ########防止签到太快
except :
print('未知报错 重新签到本吧')
check(i['name'], i['link'])
'''
附上 3种 签到返回json
签到太快 {'no': 1102, 'error': '您签得太快了 ,先看看贴子再来签吧:)', 'data': ''}
已经签过到 {'no': 1101, 'error': '亲,你之前已经签过了', 'data': ''}
成功签到的 {'no': 0, 'error': '', 'data': {'errno': 0, 'errmsg': 'success', 'sign_version': 2, 'is_block': 0, 'finfo': {'forum_info': {'forum_id': 548717, 'forum_name': 'katana'}, 'current_rank_info': {'sign_count': 966}}, 'uinfo': {'user_id': 774850436, 'is_sign_in': 1, 'user_sign_rank': 966, 'sign_time': 1548040220, 'cont_sign_num': 1, 'total_sign_num': 1, 'cout_total_sing_num': 1, 'hun_sign_num': 0, 'total_resign_num': 0, 'is_org_name': 0}}}
'''
免费评分
查看全部评分