STAL 比赛邮箱提醒系统 v1

· · 科技·工程

经过 10 天的调整与测试,STAL 比赛邮箱提醒系统 v1 正式推出。

在测试阶段,许多同仁帮助我发现并修复了诸多问题,在此向所有提出问题的人士致以最诚挚的敬意和最衷心的感谢!

三大特点

原理说明

简单阐述一下实现原理。

当脚本启动时,它会向 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 进行润色。