AtCoder API 的简单应用:使用桌面通知系统显示特定比赛最近一次提交记录
Redshift_Shine · · 科技·工程
效果展示
好看吗,赛时罚时换的。事实证明在不是手速场的前提下这个工具对于我这种学 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
随后保持该脚本运行即可。该脚本在正常运行情况下不会在终端输出任何内容。
不推荐通过在命令后加 & 字符来使该程序在后台运行,因为该程序每隔
后记
现在两个平台都有 notifier 了。但有什么用呢?就算有了它们我不还是一样上不了黄名?