【实用工具】全国大学生电子设计竞赛网自动签到助手
众所周知,在“全国大学生电子设计竞赛培训网”通过每日签到可以领取“赫兹币”,用于兑换礼品等等。
作为白嫖党,肯定不能错过啦(呃,虽然只靠签到集币会很慢)。
自己动手,丰衣足食。这不,博主自己搓了一个自动签到小助手。
源码分析
抓包发现,签到仅仅是用了一个 Get
请求,同时采用了
Cookie
鉴别身份。那接下来就简单啦,首先就是构造请求:
1 | import requests |
由于经常使用 requests,我把常用的操作封装成了一个类,内置了常见异常处理和自动重试,用起来很方便~(请见源码)
接下来是解析响应,由于返回的是 json
格式,解析起来也很方便。
这里给个大致的说明,总体上就是判断返回码,完善的还是看源码。
1 | res_dict = res.json() |
最后再进行一些细节上的处理:
美化终端文字输出
使用了一个开源工具: avalon
1
2
3
4
5
6
7
8from 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:
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
20def 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当然,中间要加上各种异常捕获,防止奔溃。
完美, 大功告成。
食用方式
前期配置
安装 python 后,切换到项目目录,用下列命令安装依赖。
1
pip install -r requirements.txt
将
config.toml.example
复制一份并重命名为config.toml
编辑
config.toml
文件,在相应位置的引号里边填写从网站上获取的cookie
。如何获取 cookie 呢?登陆网页后按下
F12
,切换到Network
标签,刷新下网页,随便点开下面一个请求,在右侧点击Headers
, 下拉在Request Headers
里面找到cookie
,右键Copy Value
就行啦。push_token
为 push_plus 的推送 token,可不填。运行一次试试看。
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 >>>