AtCoder API 的简单应用:使用桌面通知系统显示特定比赛最近一次提交记录

· · 科技·工程

效果展示

好看吗,赛时罚时换的。事实证明在不是手速场的前提下这个工具对于我这种学 OI 四年都没把 DP 搞明白的菜鸡来说毛用没有。

前言

Codeforces API 的简单应用:使用桌面通知系统显示特定比赛最近一次提交记录

这篇文章的评论区出现了一位高人 xiaofu15191,ta 指点我去油叉查阅提醒脚本。

于是,在脚本中,我发现了这个东西:

https://atcoder.jp/contests/abc416/submissions/me/status/json

该链接会返回自己在赛时的所有提交。

如果在 GET 请求里塞进用户的 cookie,这个链接的作用等同于 Codeforces API。但是由于这个 API 里有一部分返回值是 HTML 形式,所以我花了半个多小时自学 BeautifulSoup 后勉强搞出来了这个程序,能用。

代码

完整代码如下:

from bs4 import BeautifulSoup
import requests, sys, os, time

REVEL_SESSION = ''
cookies = {'REVEL_SESSION': REVEL_SESSION}
contestId = sys.argv[1]
cur = ''

while True:
    try:
        response = requests.get(f'https://atcoder.jp/contests/{contestId}/submissions/me/status/json', cookies = cookies)
        lst = tuple(response.json()['Result'])
        tmp = lst[-1]
        if tmp == cur:
            continue
        soup = BeautifulSoup(response.json()['Result'][tmp]['Html'], 'html.parser')
        # print(soup)
        tst = tuple(i.text for i in soup.find_all('td'))
        # print(tst)
        if soup.find('td').find('span')['title'] == 'Waiting for Judging' or soup.find('td').find('span')['title'] == 'Judging' or str(tst[0]).find('/') != -1:
            time.sleep(5)
            continue
        cur = tmp
        os.system(f'notify-send --urgency={'normal' if tst[0] == 'AC' else 'critical'} \"{soup.find('td').find('span')['title']}\" \"Submission ID: {tmp}\\nResource usage: {tst[1]} / {tst[2]}\\nScore: {response.json()['Result'][tmp]['Score']}\"')
    except:
        pass
    time.sleep(5)

你需要自行填入你访问 atcoder.jp 时使用的 cookie REVEL_SESSION 的值。

以上代码依赖于 Python 库 beautifulsoup4。官方提供的下载方式为

pip install beautifulsoup4

但对于某些 Linux 发行版,如 Arch Linux,为了避免污染系统环境,软件包仓库提供了打包好的 Python 库,需要使用系统自带包管理器下载。在 Arch Linux 上的下载方式为

pacman -S python-beautifulsoup4

使用方法

该脚本需要一个参数,即该比赛的编号。编号从访问比赛界面时的地址栏提取。

调用例:

$ python script.py abc416

随后保持该脚本运行即可。该脚本在正常运行情况下不会在终端输出任何内容。

不推荐通过在命令后加 & 字符来使该程序在后台运行,因为该程序每隔 5 秒向 atcoder.jp 发送一次请求,若连续时间过长可能会导致意料之外的后果。

后记

现在两个平台都有 notifier 了。但有什么用呢?就算有了它们我不还是一样上不了黄名?