【实用工具】全国大学生电子设计竞赛网自动签到助手

众所周知,在“全国大学生电子设计竞赛培训网”通过每日签到可以领取“赫兹币”,用于兑换礼品等等。

作为白嫖党,肯定不能错过啦(呃,虽然只靠签到集币会很慢)。

自己动手,丰衣足食。这不,博主自己搓了一个自动签到小助手。

源码分析

抓包发现,签到仅仅是用了一个 Get 请求,同时采用了 Cookie 鉴别身份。那接下来就简单啦,首先就是构造请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests
hea = {
"Host": url_parse.netloc,
"Connection": "keep-alive",
"charset": "utf-8",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded",
"Accept-Encoding": "gzip,compress,br,deflate",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Referer": "https://www.nuedc-training.com.cn/index/mall/index"
}
hea.update({"cookie": "xxxxxxxxxxxxxx"}) // 加入 cookie
url = "https://www.nuedc-training.com.cn/index/mall/sign"
res = requests.get(_url, data=data, params=param, headers=hea, timeout=(12.05, 72))

由于经常使用 requests,我把常用的操作封装成了一个类,内置了常见异常处理和自动重试,用起来很方便~(请见源码)

接下来是解析响应,由于返回的是 json 格式,解析起来也很方便。

这里给个大致的说明,总体上就是判断返回码,完善的还是看源码。

1
2
3
4
5
6
7
8
9
res_dict = res.json()
if res_dict["status"] == 0:
Avalon.info("签到成功-今天已经签到过啦")
elif res_dict["status"] == 1:
Avalon.info("签到成功-今天首次签到")
elif res_dict["status"] == 2:
Avalon.warning("签到失败 需要登陆")
else:
Avalon.warning("签到可能失败 未定义返回码")

最后再进行一些细节上的处理:

  • 美化终端文字输出

    使用了一个开源工具: avalon

    1
    2
    3
    4
    5
    6
    7
    8
    from avalon import Avalon

    Avalon.info("xxx")
    Avalon.warning("xxx")
    Avalon.error("xxx")
    Avalon.debug("xxx")
    Avalon.debug_info("xxx")
    Avalon.ask("Xxx")

    这个工具还有很多实用的用法,推荐看看去。另:我的项目里面,对源码可能有些许改动。

  • 接入 push_plus 推送

    我还是封装了一个类,这里是简单版本,更完善的请见源码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    # -*- coding: UTF-8 -*-
    # @Time : 2022/1/1 17:05
    # @Author : Hui-Shao

    import json
    import requests

    class PushPlus:
    @staticmethod
    def send(_token: str, _title: str, _content: str, _template: str = "html", _topic: str = "") -> bool:
    """
    :param _token: 用户令牌
    :param _title: 消息标题
    :param _content: 消息正文
    :param _template: 消息模板 可选 html txt markdown json
    :param _topic: 消息推送群组名称 用于一对多推送 不填则只推送给自己
    :return: bool
    """
    if len(_token) <= 5:
    return False
    url_send = "https://www.pushplus.plus/send"
    hea = {"Content-Type": "application/json"}
    data = {
    "token": _token,
    "title": _title,
    "content": _content,
    "template": _template,
    }
    if _topic:
    data.update({"topic": _topic})
    body = json.dumps(data).encode(encoding="utf-8")
    res = requests.post(url=url_send, data=body, headers=hea)
    if res.text:
    msg_back = json.loads(res.text)
    if msg_back["code"] == 200:
    print("[PushPlus] 请求推送消息成功!")
    return True
    else:
    print("[PushPlus] 请求推送可能失败 返回值:%s" % (msg_back["msg"]))
    return False
    else:
    print("[PushPlus] 请求推送失败 res.text 为空!")
    return False
  • 使用 toml 解析配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    def read_config() -> MutableMapping[str, Any]:
    Avalon.info("读取配置文件中...")
    config_file = sys.argv[1] if len(sys.argv) > 1 else "config.toml"
    try:
    with open(config_file, "r", encoding="utf-8") as f:
    config = toml.load(f)
    except IOError:
    Avalon.error(f"无法加载 {config_file}, 请检查文件是否存在, 文件名是否正确")
    return {}
    except toml.TomlDecodeError:
    Avalon.error(f"载入 {config_file}错误, 请检查配置文件内容是否规范无误")
    Avalon.error(traceback.format_exc(3))
    return {}
    except Exception:
    Avalon.error(f"无法加载 {config_file}, 其他错误\n")
    Avalon.error(traceback.format_exc(3))
    return {}
    else:
    Avalon.info("配置文件读取成功")
    return config
  • 当然,中间要加上各种异常捕获,防止奔溃。

完美, 大功告成。

食用方式

前期配置

  1. 安装 python 后,切换到项目目录,用下列命令安装依赖。

    1
    pip install -r requirements.txt
  2. config.toml.example 复制一份并重命名为 config.toml

  3. 编辑 config.toml 文件,在相应位置的引号里边填写从网站上获取的 cookie

    如何获取 cookie 呢?登陆网页后按下 F12,切换到 Network 标签,刷新下网页,随便点开下面一个请求,在右侧点击 Headers , 下拉在 Request Headers 里面找到 cookie ,右键 Copy Value就行啦。

  4. push_tokenpush_plus 的推送 token,可不填。

  5. 运行一次试试看。

    1
    python main.py

上线部署

  • Crontab
  • Github Action
  • 腾讯云函数(待测试)
  • Etc....

选择你喜欢的方式就行。这里博主给出一个 Crontab 的示例:

1
15 9 * * * python3 -u "/root/nuedc_sign/main.py" >> /root/nuedc_sign/log.txt 2>&1

开源地址

本项目是开源的,请勿滥用或者商用欢迎 Issue ,PR,也可以点个 Star 支持下~

地址:Github >>> 以及 Gitee >>>