使用SCF自动拉取各大OJ的比赛日程并导入日历软件
Misaka2298 · · 科技·工程
我的博客:自动拉取各大 OJ 的比赛日程并导入日历软件
参考文章:使用日历 app 轻松订阅各大 OJ 平台上的比赛(ics 格式)
::::info[AI 使用说明] 本文章使用代码为 Grok3 生成得来,能跑。 ::::
过去看比赛日期的方式都弱爆了!需要自己手动打开各 OJ 的网页,有时忘看了还会错过比赛,而现在我们再也不需要担心这个问题了。
已修复洛谷比赛显示提前 8h 的问题。
预览
正文
使用我的链接
如果你不想自己部署,可以使用我的订阅链接。但维护有成本(SCF 云函数,域名,对象存储等),我或许不会维护很久。
Win 电脑与 Android 手机
在 Outlook 注册一个 Outlook 账号,如果已经有就登录,手机用户需要下载 Outlook 软件。
登入后,在左边点击日历按钮,点击左侧的“添加日历”,点击“Web 订阅”,填入我的订阅链接:
https://oss.misaka2298.icu/oss/calendar.ics
点击导入,电脑端的操作到这里就结束了,注意上方的可视范围从默认的“工作周”切换为“周”,不然看不到周末的比赛。
手机端需要多一步操作:在 Outlook 的设置里找到“日历”设置,勾选“同步日历”,并同意 Outlook 申请的日历访问权限,然后手机日历就会自动同步了。
iPhone
我手头没有 iPhone 机器,这里引用我参考文章里的步骤:
- 打开 ios 日历,点击添加日历 - 添加订阅日历
- 粘贴链接
- 进行自定义设置,完成
链接同:
https://oss.misaka2298.icu/oss/calendar.ics
自己部署
可能产生的费用
腾讯云 SCF 函数:个人标准版函数套餐 12.8 元/月。
域名:冷门顶级域名(如我的 .icu)约 100 / 年,首年优惠。当然也可以选用网上公益的二级域名服务,请自行搜索。
对象存储:
- CloudFlareR2(本文使用):基本免费,但需要一张银行卡(支持银联)
- 其他对象存储:按量收费,如果访问量大可能产生较高的费用。
如果可以接受的话,下面是教程。
环境安装
首先,需要 Python3.9 的环境(截止到本文发布),安装时记得勾选“Add to PATH”,安装后重启。
找个空文件夹,打开 cmd ,执行下面的命令:
mkdir layer
cd layer
python -m pip install requests==2.28.2 beautifulsoup4==4.12.3 ics==0.7.1 boto3==1.34.149 urllib3==1.26.18 tatsu==5.7.4 -t .
把 layer 文件夹压缩成 zip,备用。
对象存储
打开 CloudFlare 控制台,没有账号就注册一个,在左侧选项卡找到R2 对象存储,按提示初始化,注意需要银行卡。
当然如果你要用其他对象存储服务商的话可以自行研究。
点击{}API,点击管理 API 令牌,然后创建 UserAPI 令牌,权限为管理员读写,名称自己取,然后记住你的访问密钥 ID和机密访问密钥,注意这两个东西只会出现一次。
返回 R2 控制台,创建新的存储桶,名称自己起,位置选亚太,除非你在外国。
进入存储桶,在设置中添加自定义域,这里不再赘述,网上也有很多公益的二级域名供使用,请自行搜索教程。
SCF 自动拉取
打开腾讯云 SCF 控制台,没注册的话注册一个。
点击左侧“函数服务”,点击新建。
点击“从头开始”,函数类型选事件函数,名称自己起,地域无所谓,运行环境 python3.9,时区 UTC。
在下方粘贴我的代码:
使用SCF自动拉取各大OJ的比赛日程并导入日历软件 - 代码
(这个代码是实时更新的)
在 12\~17 行填写你 CloudFlare 存储桶的信息:
R2_ACCESS_KEY:APIKey 的访问密钥 IDR2_SECRET_KEY:APIKey 的机密访问密钥R2_ENDPOINT_URL:你的存储桶 - 设置 - S3API 的那一串链接R2_BUCKET_NAME:存储桶名R2_OBJECT_NAME:保存的文件名,扩展名为.ics
拉到最底下,在触发器配置中勾选自定义创建,触发别名/版本中选择版本:$LATEST,触发周期选择每一天。
然后,在高级配置中把执行超时时间改为 10 秒。
同意协议,点击完成。
返回 SCF 控制台,在左侧进入层的配置页面。
点击新建,层名称随便写,层代码为你前面打包的 layer.zip ,运行环境添加 Python3.9 ,点击确定。
在左侧进入函数服务的配置界面,进入你刚创建的函数,在上方进入层管理,点击绑定,绑定你刚创建的层。
点击上方的函数代码,点击下方的测试,观察执行摘要中的返回结果,如果一切顺利,这里应该是
{"statusCode": 200, "body": "{\"message\": \"ICS 文件生成并上传成功\"}"}
看看部署结果
返回 CloudFlareR2 控制台,进入存储桶,寻找你生成的calender.ics。
如果存在的话,复制它的自定义域。
复制后在浏览器打开你复制的链接,如果可以下载就是成功了,导入教程同上。
以后或许会实现的功能
- 更多 OJ 的拉取(我自己常用的就这三个了)
- 在标题上标注是否 Rated
- 成本更低的部署
- MacOS 的导入(当然应该是支持的,可以自己摸索)