Github Actions的服务器在国外,访问国内的资源可能会受到影响。联通签到脚本的会经常性的出现“接口防刷策略”,导致奖励领取失败,一直也不知道是什么原因,在本地测试运行时,却没有出现状况,猜测是由于网络的问题。

因此,就在寻找Github Actions的替代品,单独为此去购买服务器不太值得,本地化每天还需手动运行,现今,各大厂商的云函数具有免费额度,仅仅需将程序适配,是用来跑脚本的不二之选。

云函数,宣传的是所谓无服务器架构,创建web项目无需关注环境问题,开发者可将更多的时间着眼于业务的实现,将整个项目化解为一个个小的函数,再拼接到一起,项目就做成了。

因为这个是Python项目,就要寻找Python项目部署到云函数的解决方案。所幸,之前接触过BiliExp这个项目,最早版本就是腾讯云函数,而且也是Python写的,前人栽树,后人乘凉,只需照搬过来即可,然而,也不是那么的容易。

通常项目是有一个主函数,每次程序都从主函数开始运行,在云函数中,需要有一个叫做入口函数的东西,除了go外,每一个云函数都要包括入口函数,Python的入口函数大约是这样:

import json
def main_handler(event, context):
    print("Received event: " + json.dumps(event, indent = 2)) 
    print("Received context: " + str(context))
    return("Hello World")

我的做法是,将以前主函数内的代码放到这个入口函数中,以后本地运行主函数,再调用这个入口函数就能适配平台不同的问题了。这里主要注意的是,主函数中若使用了全局变量,那就是全局变量,而在普通函数中可能会新建一个同名变量。如下面这样的情况:

n = 10
def run():
    n = 5
    print('run:' + str(n))
if __name__ == '__main__':
    run()
    print('main:' + str(n))

这种情况下,在run()函数中的n = 5会新创建一个变量n,在Java中也是如此。如果需要使用全局变量,需要在全局变量上面添加global关键字。

n = 10
def run():
    global n
    n = 5
    print('run:' + str(n))
if __name__ == '__main__':
    run()
    print('main:' + str(n))

若项目中,涉及到读写文件,要极其注意,俺就是在这个坑里呆了很久。我将项目的日志记录输出到了文件,却总是在报这个文件的错误,起初我以为是路径的问题,这里得吐槽一下腾讯云函数控制台的报错信息,黑压压一堆,还有乱码,恰巧看到一个关键词OSError,大概是这个吧,我意识到可能是文件的读写出毛病了。

上网一搜,有一篇文章是关于腾讯自家的小程序的,内容是关于小程序只可读文件,不可写文件,只有/tmp目录下可以临时读写文件,修正这个错误后,就正式从坑里爬起来了。