好长时间没有更新博客了,正好前天做了一个自动打卡脚本在腾讯云函数上的适配,中间遇到了一些问题,于是写篇文章来记录一下。

获取用户信息

之前的脚本是在Github Actions上定时运行的,获取用户信息的方案是从项目的Secrets中读取。中间其实还有写入到命令行然后再从命令行中读取字符等过程,目的只是保护用户信息不泄露。

命令行:

1
2
3
python3 main.py <<EOF
${{secrets.USERS}}
EOF

读取:

1
2
3
4
5
6
7
8
9
while True:  
try:
users = input()
info = users.split(',')
phone.append(info[0])
password.append(info[1])
sckey.append(info[2])
except:
break

对于腾讯云函数,我采用的方法是将SCKEY和用户的信息都放入环境变量,这样别人在使用脚本的时候就只需要添加环境变量即可,不用修改代码。

修改之后的读取操作:

1
2
3
4
5
6
7
8
9
10
while True:  
try:
user = os.environ.get('user' + str(i))
if user is None:
break
phone.append(user.split(',')[0])
password.append(user.split(',')[1])
i+=1
except:
break

添加依赖

这是最麻烦的地方,腾讯云函数的运行环境并不是啥依赖都有,查询文档后得知没有的依赖需要和代码包一同打包上传。

  1. 在 requirements.txt 中配置依赖信息。
  2. 通过 pip install -r requirements.txt -t . 命令安装依赖包。
  3. 上传代码库时请将依赖库一同打包上传。

于是尝试把pycrytodome的Cryto模块打包直接上传,结果并不能运行。

查询文档:

函数运行的系统是 CentOS 7,您需要在相同环境下进行安装。若环境不一致,则可能导致上传后运行时出现找不到依赖的错误。您可参考云函数容器镜像进行依赖安装。

看了一下关于容器镜像的文档,好家伙还要用到Docker,但我之前连Docker是干啥的都不知道。。

没办法,硬着头皮下了一个Docker Desktop,升级了下wsl子系统环境(虽然并没有用到wsl2),让后用命令docker pull ccr.ccs.tencentyun.com/scf-repo/runtime-python3:latest拉取容器镜像,把项目文件夹挂载到镜像容器内,然后使用下面的命令安装依赖:

pip3 install pipreqs
pipreqs ./
pip install -r requirements.txt -t ./

其中pipreqs把urllib和requests这两个依赖也放进了requirements.txt,但腾讯云函数的运行环境已经有这两个依赖了,手动去掉即可。

安装完依赖后打包上传,部署并测试,终于能够正常运行了。