|
|
不太会写js的浏览器脚本 但是会写py的 放青龙用还可以- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- =============================================================
- 3gbizhi.com 自动签到脚本(支持多账号)
- =============================================================
- 用法:
- 1. 安装依赖:pip install requests beautifulsoup4
- 2. 设置账号密码(任选一种):
- a) 环境变量方式:
- Windows: set 3gbizhi=账号1#密码1&账号2#密码2
- Mac/Linux: export 3gbizhi="账号1#密码1&账号2#密码2"
- b) 直接修改本脚本最下方的 accounts 列表。
- 3. 运行脚本:python 3gbizhi_sign.py
- =============================================================
- """
- import requests
- from bs4 import BeautifulSoup
- import os
- import sys
- def login_and_sign(username, password):
- """
- 单个账号:登录 + 签到 + 查询签到详情
- 参数:username (str) 用户名
- password (str) 密码
- 返回:True 成功,False 失败
- """
- # 创建一个会话,自动管理 cookie
- session = requests.Session()
- # 设置通用的请求头,伪装成浏览器
- session.headers.update({
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:153.0) Gecko/20100101 Firefox/153.0",
- "Accept": "application/json, text/javascript, */*; q=0.01",
- "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.5",
- "Origin": "https://www.3gbizhi.com",
- })
- print(f"\n>> 开始处理账号:{username}")
- # ---------- 第1步:获取登录用的 __token__ ----------
- print(" [1/4] 正在获取登录令牌...")
- token = None
- try:
- # 尝试从登录页面或首页提取 __token__
- for url in ["https://www.3gbizhi.com/user/login.html", "https://www.3gbizhi.com/"]:
- try:
- resp = session.get(url, timeout=10)
- resp.encoding = "utf-8" # 避免乱码
- soup = BeautifulSoup(resp.text, "html.parser")
- # 先找表单隐藏域
- token_input = soup.find("input", {"name": "__token__"})
- if token_input and token_input.get("value"):
- token = token_input["value"]
- break
- # 再找 meta 标签
- meta_token = soup.find("meta", {"name": "__token__"})
- if meta_token and meta_token.get("content"):
- token = meta_token["content"]
- break
- except Exception:
- continue
- except Exception as e:
- print(f" [错误] 网络请求失败:{e}")
- return False
- if not token:
- print(" [错误] 无法获取登录令牌,网站可能改版或网络不通。")
- return False
- print(" [成功] 登录令牌获取成功。")
- # ---------- 第2步:发送登录请求 ----------
- print(" [2/4] 正在登录...")
- login_url = "https://www.3gbizhi.com/api/user/login"
- login_data = {
- "__token__": token,
- "account": username,
- "password": password,
- }
- login_headers = {
- "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
- "Referer": "https://www.3gbizhi.com/user/login.html",
- "X-Requested-With": "XMLHttpRequest",
- }
- try:
- resp = session.post(login_url, data=login_data, headers=login_headers, timeout=10)
- result = resp.json()
- except Exception as e:
- print(f" [错误] 登录请求失败:{e}")
- return False
- if result.get("code") != 1:
- print(f" [失败] 登录失败:{result.get('msg', '未知错误')}")
- return False
- # 保存服务器返回的用户信息和 token
- userinfo = result["data"]["userinfo"]
- user_id = userinfo["user_id"]
- auth_token = userinfo["token"]
- nickname = userinfo.get("nickname", username)
- # 将认证信息写入 cookie(关键步骤)
- session.cookies.set("uid", str(user_id), domain="www.3gbizhi.com", path="/")
- session.cookies.set("token", auth_token, domain="www.3gbizhi.com", path="/")
- print(f" [成功] 登录成功!昵称:{nickname}")
- # ---------- 第3步:签到 ----------
- print(" [3/4] 正在签到...")
- sign_url = "https://www.3gbizhi.com/api/user/setUserSignin"
- sign_headers = {
- "Referer": f"https://www.3gbizhi.com/user/{username}/sign.html",
- "X-Requested-With": "XMLHttpRequest",
- }
- try:
- resp = session.post(sign_url, headers=sign_headers, timeout=10)
- sign_result = resp.json()
- except Exception as e:
- print(f" [错误] 签到请求失败:{e}")
- return False
- if sign_result.get("code") == 1:
- print(f" [成功] {sign_result.get('msg')}")
- data = sign_result["data"]
- print(f" - 本次获得积分:{data.get('points')}")
- print(f" - 当前总积分:{data.get('current_score')}")
- print(f" - 连续签到天数:{data.get('continuous_days')} 天")
- else:
- print(f" [提示] 签到结果:{sign_result.get('msg', '可能今天已经签过了')}")
- # 即使返回非1,也不代表完全失败(可能是重复签到),继续查询详情
- # ---------- 第4步:查询签到详情 ----------
- print(" [4/4] 正在查询签到详情...")
- info_url = "https://www.3gbizhi.com/api/user/getUserSignin"
- info_headers = {
- "Referer": f"https://www.3gbizhi.com/user/{username}/sign.html",
- }
- try:
- resp = session.get(info_url, headers=info_headers, timeout=10)
- info = resp.json()
- if info.get("code") == 1:
- d = info["data"]
- print(f" - 本周已签到:{d.get('week_signin_days')} 天")
- print(f" - 本月已签到:{d.get('month_signin_days')} 天")
- print(f" - 明日预计积分:{d.get('next_day_points')}")
- else:
- print(" [提示] 查询详情返回异常,但签到可能已成功。")
- except Exception as e:
- print(f" [警告] 查询签到详情失败:{e}")
- return True
- def parse_accounts_from_env(env_str):
- """
- 解析环境变量中的账号字符串
- 格式:user1#pass1&user2#pass2
- 返回:[(user, pass), ...]
- """
- accounts = []
- if not env_str:
- return accounts
- for pair in env_str.split("&"):
- pair = pair.strip()
- if "#" in pair:
- user, pwd = pair.split("#", 1)
- accounts.append((user.strip(), pwd.strip()))
- return accounts
- def main():
- # 打印欢迎信息
- print("=" * 60)
- print(" 3gbizhi.com 自动签到脚本 v1.0")
- print("=" * 60)
- print("正在检查账号配置...\n")
- # 优先从环境变量读取(变量名:3gbizhi)
- env_str = os.environ.get("3gbizhi", "")
- accounts = []
- if env_str:
- print("[配置] 检测到环境变量 '3gbizhi',将使用环境变量中的账号。")
- accounts = parse_accounts_from_env(env_str)
- if not accounts:
- print("[错误] 环境变量格式不正确!")
- print(" 正确格式:账号1#密码1&账号2#密码2")
- print(" 例如:zhangsan#123456&lisi#abcdef")
- sys.exit(1)
- else:
- print("[配置] 未检测到环境变量,将使用脚本内硬编码的账号。")
- # ==============================================
- # !!!请在这里修改成你自己的账号密码!!!
- # ==============================================
- accounts = [
- ("你的账号1", "你的密码1"), # 替换成真实的账号密码
- ("你的账号2", "你的密码2"), # 不需要多个账号就删掉这一行
- ]
- # 检查是否还是默认的示例值
- if len(accounts) == 1 and accounts[0][0] == "你的账号1":
- print("\n[重要提醒] 你还没有修改硬编码的账号密码!")
- print("请打开本脚本,找到 accounts 列表,把里面的 '你的账号1' '你的密码1' 改成真实的账号密码。")
- print("或者使用环境变量方式设置账号(更推荐),详细说明见脚本顶部注释。")
- sys.exit(1)
- # 开始逐个处理
- success_count = 0
- total = len(accounts)
- for i, (user, pwd) in enumerate(accounts, 1):
- print(f"\n{'='*30} 账号 {i}/{total} {'='*30}")
- try:
- if login_and_sign(user, pwd):
- success_count += 1
- except Exception as e:
- print(f"[严重错误] 处理账号 {user} 时发生未捕获异常:{e}")
- # 最终总结
- print("\n" + "=" * 60)
- print(f"处理完成!成功 {success_count} 个,失败 {total - success_count} 个。")
- print("=" * 60)
- if __name__ == "__main__":
- main()
复制代码 |
|