首页 编程学习

声明:本文章参考ghosxtieba代码仓库。
希望我的文章能给你带来帮助。

1. 手把手教你配置Github Actions,实现百度贴吧自动签到

  1. Fork 本仓库然后点击你的仓库右上角的 Settings,找到 Secrets 这一项,添加一个秘密环境变量。其中 BDUSS 存放你的 BDUSS 。支持同时添加多个帐户,BDUSS 之间用#隔开即可。

    • 添加仓库秘密变量
      添加仓库秘密变量.png
    • 点击New repository secret后,在弹出的窗口中,按照下图进行填写。
      填写BDUSS变量.png
    • 如果你不知道如何获取你的 BDUSS,请把文章往下翻一下,文章的后半部分会教你获取你的 BDUSS。
  2. 设置好环境变量后点击你的仓库上方的 Actions 选项,第一次打开需要点击I understand...按钮,确认在 Fork 的仓库上启用 GitHub Actions。
  3. 任意发起一次 commit,可以参考下面流程修改 README.md 文件。

    • 打开 README.md,点击编辑按钮
      点击编辑按钮.png
    • 修改任意内容,比如在末尾插入了空格。将页面滑动到最下面,点击提交更改
      修改README.png
  4. 至此自动签到就搭建完毕了,可以再次点击Actions查看工作记录,如果有Baidu Tieba Auto Sign则说明workflow创建成功了。点击右侧记录可以查看详细签到情况。
    查看运行日志.png

2. 如何获取 BDUSS

  1. 首先,新建标签页打开 www.baidu.com,如果没有登录,请自行登录,否则无法获取你的 BDUSS。
  2. 登录成功之后,只需在浏览器中点击几次按键就可以找到 BDUSS 所在的位置。接下来分别以 火狐浏览器 和 谷歌浏览器 为例进行讲解。

    • 从火狐浏览器获取 BDUSS,直接上图
      火狐浏览器获取BDUSS.png
    • 从谷歌浏览器获取 BDUSS,直接上图,再
      谷歌浏览器获取BDUSS.png

代码作者:ghosx
作者的Github仓库传送门

主程序代码,点击这里可以展开代码

# -*- coding:utf-8 -*-
import os
import requests
import hashlib
import time
import copy
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# API_URL
LIKIE_URL = "http://c.tieba.baidu.com/c/f/forum/like"
TBS_URL = "http://tieba.baidu.com/dc/common/tbs"
SIGN_URL = "http://c.tieba.baidu.com/c/c/forum/sign"

HEADERS = {
    'Host': 'tieba.baidu.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
}
SIGN_DATA = {
    '_client_type': '2',
    '_client_version': '9.7.8.0',
    '_phone_imei': '000000000000000',
    'model': 'MI+5',
    "net_type": "1",
}

# VARIABLE NAME
COOKIE = "Cookie"
BDUSS = "BDUSS"
EQUAL = r'='
EMPTY_STR = r''
TBS = 'tbs'
PAGE_NO = 'page_no'
ONE = '1'
TIMESTAMP = "timestamp"
DATA = 'data'
FID = 'fid'
SIGN_KEY = 'tiebaclient!!!'
UTF8 = "utf-8"
SIGN = "sign"
KW = "kw"

s = requests.Session()


def get_tbs(bduss):
    logger.info("获取tbs开始")
    headers = copy.copy(HEADERS)
    headers.update({COOKIE: EMPTY_STR.join([BDUSS, EQUAL, bduss])})
    try:
        tbs = s.get(url=TBS_URL, headers=headers, timeout=5).json()[TBS]
    except Exception as e:
        logger.error("获取tbs出错" + e)
        logger.info("重新获取tbs开始")
        tbs = s.get(url=TBS_URL, headers=headers, timeout=5).json()[TBS]
    logger.info("获取tbs结束")
    return tbs


def get_favorite(bduss):
    logger.info("获取关注的贴吧开始")
    # 客户端关注的贴吧
    returnData = {}
    i = 1
    data = {
        'BDUSS': bduss,
        '_client_type': '2',
        '_client_id': 'wappc_1534235498291_488',
        '_client_version': '9.7.8.0',
        '_phone_imei': '000000000000000',
        'from': '1008621y',
        'page_no': '1',
        'page_size': '200',
        'model': 'MI+5',
        'net_type': '1',
        'timestamp': str(int(time.time())),
        'vcode_tag': '11',
    }
    data = encodeData(data)
    try:
        res = s.post(url=LIKIE_URL, data=data, timeout=5).json()
    except Exception as e:
        logger.error("获取关注的贴吧出错" + e)
        return []
    returnData = res
    if 'forum_list' not in returnData:
        returnData['forum_list'] = []
    if res['forum_list'] == []:
        return {'gconforum': [], 'non-gconforum': []}
    if 'non-gconforum' not in returnData['forum_list']:
        returnData['forum_list']['non-gconforum'] = []
    if 'gconforum' not in returnData['forum_list']:
        returnData['forum_list']['gconforum'] = []
    while 'has_more' in res and res['has_more'] == '1':
        i = i + 1
        data = {
            'BDUSS': bduss,
            '_client_type': '2',
            '_client_id': 'wappc_1534235498291_488',
            '_client_version': '9.7.8.0',
            '_phone_imei': '000000000000000',
            'from': '1008621y',
            'page_no': str(i),
            'page_size': '200',
            'model': 'MI+5',
            'net_type': '1',
            'timestamp': str(int(time.time())),
            'vcode_tag': '11',
        }
        data = encodeData(data)
        try:
            res = s.post(url=LIKIE_URL, data=data, timeout=5).json()
        except Exception as e:
            logger.error("获取关注的贴吧出错" + e)
            continue
        if 'forum_list' not in res:
            continue
        if 'non-gconforum' in res['forum_list']:
            returnData['forum_list']['non-gconforum'].append(res['forum_list']['non-gconforum'])
        if 'gconforum' in res['forum_list']:
            returnData['forum_list']['gconforum'].append(res['forum_list']['gconforum'])

    t = []
    for i in returnData['forum_list']['non-gconforum']:
        if isinstance(i, list):
            for j in i:
                if isinstance(j, list):
                    for k in j:
                        t.append(k)
                else:
                    t.append(j)
        else:
            t.append(i)
    for i in returnData['forum_list']['gconforum']:
        if isinstance(i, list):
            for j in i:
                if isinstance(j, list):
                    for k in j:
                        t.append(k)
                else:
                    t.append(j)
        else:
            t.append(i)
    logger.info("获取关注的贴吧结束")
    return t


def encodeData(data):
    s = EMPTY_STR
    keys = data.keys()
    for i in sorted(keys):
        s += i + EQUAL + str(data[i])
    sign = hashlib.md5((s + SIGN_KEY).encode(UTF8)).hexdigest().upper()
    data.update({SIGN: str(sign)})
    return data


def client_sign(bduss, tbs, fid, kw):
    # 客户端签到
    logger.info("开始签到贴吧:" + kw)
    data = copy.copy(SIGN_DATA)
    data.update({BDUSS: bduss, FID: fid, KW: kw, TBS: tbs, TIMESTAMP: str(int(time.time()))})
    data = encodeData(data)
    res = s.post(url=SIGN_URL, data=data, timeout=5).json()
    return res


def main():
    b = os.environ['BDUSS'].split('#')
    for n, i in enumerate(b):
        logger.info("开始签到第" + str(n) + "个用户")
        tbs = get_tbs(i)
        favorites = get_favorite(i)
        for j in favorites:
            client_sign(i, tbs, j["id"], j["name"])
        logger.info("完成第" + str(n) + "个用户签到")
    logger.info("所有用户签到结束")


if __name__ == '__main__':
    main()

3. 参考

  1. 贴吧签到Github Action版

如果你从这里学会了如何配置Github Actions,请为我的文章点个赞!谢谢!
当然,如果文章中有错误,希望你能告诉我,谢谢!



文章评论

目录