STAL 比赛邮箱提醒系统 v1
经过 10 天的调整与测试,STAL 比赛邮箱提醒系统 v1 正式推出。
在测试阶段,许多同仁帮助我发现并修复了诸多问题,在此向所有提出问题的人士致以最诚挚的敬意和最衷心的感谢!
三大特点
-
隐私保护——采用密送(Bcc)方式发送邮件,收件人之间互不可见,有效防止邮箱泄露
-
稳定高效——通过洛谷专用请求头直接获取 JSON 数据,无需解析 HTML 或正则匹配,单页请求响应迅速,减少网络开销。
-
信息简洁——邮件仅含比赛关键字段,无冗余内容,一目了然。
原理说明
简单阐述一下实现原理。
当脚本启动时,它会向 https://www.luogu.com.cn/contest/list 发送 HTTP GET 请求。然后我们在请求中加入 x-lentille-request: content-only 特殊字段,这样服务器就会返回 JSON 格式的原始数据,而不是完整的 HTML 页面。
接着我们使用 response.json() 将返回内容转为 Python 字典,从字典中提取 data['contests']['result'] 作为比赛列表。对所提取到的内容进行整理,得到比赛编号、名称、赛制、时间、链接等内容。
最后通过 SMTP 协议将邮件密送(Bcc)至所配置的收件人。
这是代码片段:
def fetch_contest_list():
"""获取第一页比赛列表"""
url = 'https://www.luogu.com.cn/contest/list'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'x-luogu-type': 'content-only',
'x-lentille-request': 'content-only'
}
try:
response = requests.get(url, headers=headers, timeout=15)
if response.status_code != 200:
return None
data = response.json() # 直接解析 JSON
# 提取比赛列表:data['data']['contests']['result']
contests = data.get('data', {}).get('contests', {}).get('result', [])
return contests
except Exception as e:
print(f"请求失败: {e}")
return None
使用方法
访问 www.demetri.top 注册账号后,系统将自动开启比赛提醒功能。由于前端开发时间较为仓促,目前暂不支持手动关闭提醒;若您不再需要该功能,可直接注销账号。
注册前请仔细阅读《用户协议》。另外,受限于服务器性能,如偶遇无法访问的情况,请稍后重试。若问题持续存在,欢迎向开发者反馈,我们将尽力排查。
结语
在本人能力允许的前提下,会开发更多有趣的功能(比如:爬取比赛数据?),为大家带来更便捷的体验。
您的每一次使用、反馈和转发,都是对我最大的支持与鼓励。
未来,我将持续优化系统稳定性,探索更多实用功能(如多平台提醒、自定义筛选规则等)。
感谢您的信任与陪伴,让我们一起共步前行!
致谢
感谢 Miya0823 与 ko114 提出的修改建议。
文章在完成后使用 deepseek 进行润色。