redblue 发表于 2020-6-3 21:36

Python 百度贴吧自动签到

本帖最后由 redblue 于 2020-6-3 21:39 编辑

import datetime
import os
import re

import requests
import bs4


# 获取关注的所有贴吧链接
def get_tieba_link():
    url = 'http://tieba.baidu.com/f/like/mylike?&pn='
    page = 1
    links = []
    while True:
      response = requests.get(url + str(page), headers=headers)
      bs = bs4.BeautifulSoup(response.text, 'lxml')
      for a in bs.select('table tr>td:first-child>a'):
            links.append({'href': a.get('href'), 'name': a.string})
      if '下一页' not in str(bs):
            break
      page += 1
    return links


# 从贴吧链接中获取贴吧签到参数
def tieba_batch_sign():
    links = get_tieba_link()
    for link in links:
      response = requests.get('https://tieba.baidu.com/' + link['href'], headers=headers)
      tbs_reg = re.compile(r'\'tbs\':\s"(.*?)"')
      tbs = tbs_reg.search(response.text).group(1)
      if not tbs:# 如果tbs不存在则跳过本次循环
            continue
      param = {'ie': 'utf-8', 'kw': link['name'], 'tbs': tbs}
      response = requests.post('https://tieba.baidu.com/sign/add', data=param, headers=headers)
      result = response.json()
      if result['no'] == 0:
            msg = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + ' ' + link['name'] + ' 签到成功\n'
      else:
            msg = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + ' ' + link['name'] + ' ' + result[
                'error'] + '\n'
      print(msg)
      with open(os.path.join(os.getcwd(), 'sign.log'), 'a+') as loghandle:
            loghandle.write(msg)


if __name__ == '__main__':
    headers = {
      'cookie': 'xxxxxxxxxxxx'
    }
    tieba_batch_sign()

问题分析1.获取登录百度贴吧的cookie,在后面请求中都跟上这个cookie

2.获取所有关注的贴吧在百度贴吧首页(https://tieba.baidu.com/)观察发现,不能直接获取到所有的吧的链接和名称,查看更多里显示的不能直接获取

既然在首页获取不到,那就换个地方获取,经过观察在我的关注贴吧页面(http://tieba.baidu.com/i/i/forum)似乎可以获取到所有贴吧的信息,

然而写代码的时候还是找不到,打开这个页面的源码看看

源码里面这个div中时空的,说明贴吧的信息是通过另外的请求加载上的,所以我们可以去观察开发者工具里的网络请求信息

分析上图中的请求,可以发现http://tieba.baidu.com/f/like/mylike?v=1591188824982才是真正获取贴吧信息的页面
3.获取签到链接和签到参数找一个还没有签到的贴吧,签到看看

从图中可以得知请求地址、请求方式、和请求参数
4.分析签到参数在上一步中得到了请求参数,参数中前面两个还好说,最后一个tbs似乎不知道哪里来的,我们根据上图中的tbs值,在这个页面源码里查找这个值

接下来只要用正则匹配将tbs的值匹配出来就好了。
5.发送签到请求
前面的准备工作都做好了,现在就直接发送请求就好了,注意请求方式是post
6.部署到服务器上,每天零点种就开始执行签到
0 0 * * * python /tieba_batch_sign.py > /dev/null

redblue 发表于 2020-6-3 22:23

那年夏天52 发表于 2020-6-3 22:15
cookie要经常换的吧,要是能登陆就好了

百度贴吧的cookie有效期很长的,你登陆贴吧看看就知道了,只要不改密码。https://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif

lxyadobe 发表于 2020-7-2 22:39

Zeaf 发表于 2020-7-2 22:27
https://www.52pojie.cn/forum.php?mod=redirect&goto=findpost&ptid=1192841&pid=32250238

ok,多谢

Zeaf 发表于 2020-6-3 21:42

感谢,云服务器又多了一个函数{:1_926:}

Zeaf 发表于 2020-6-3 21:51

话说云服务器提示没有bs4这个库怎么办

凡凡之呗 发表于 2020-6-3 21:58

cookie是有过期时间的吧,能分析出登陆的密码加密方式吗

redblue 发表于 2020-6-3 22:00

Zeaf 发表于 2020-6-3 21:51
话说云服务器提示没有bs4这个库怎么办

使用pip install Beautifulsoup4 命令安装bs4这个库就可以了啊https://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif

Zeaf 发表于 2020-6-3 22:01

redblue 发表于 2020-6-3 22:00
使用pip install Beautifulsoup4 命令安装bs4这个库就可以了啊

哦,说错了,云函数怎么弄?

redblue 发表于 2020-6-3 22:04

Zeaf 发表于 2020-6-3 22:01
哦,说错了,云函数怎么弄?

你看这个帖子https://www.52pojie.cn/thread-1155287-1-1.htmlhttps://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif

b0y 发表于 2020-6-3 22:10

贴吧APP有一键签到功能 楼主分析一下看看

redblue 发表于 2020-6-3 22:13

b0y 发表于 2020-6-3 22:10
贴吧APP有一键签到功能 楼主分析一下看看

那个一键签到要求贴吧达到一定等级的https://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif

那年夏天52 发表于 2020-6-3 22:15

cookie要经常换的吧,要是能登陆就好了
页: [1] 2 3
查看完整版本: Python 百度贴吧自动签到