Serverless 写 Telegram Bot? 白嫖 IBM Cloud (3)
2023-11-18 update: 三年后 IBM Cloud 砍了云函数业务,本文可以不用看了
最后来一些豆知识收尾。
9. 使用 Cloud Function 可能会遇到的问题
- 如果依赖里有需要编译二进制
.so
的 packages,务必在与 Cloud Function 容器相同的环境下安装到 virtualenv。 (否则会遇到诸如ModuleNotFoundError
这种问题[1])
1 | # ’python:3.7‘ 环境目前是: |
针对 Python 版本问题,一个解决方法是:
安装 pyenv;
安装编译 Python 所需依赖[2];
安装对应版本的 Python(从 python.org 下载安装包太慢的话,自行下载放至 pyenv 的
cache
目录下即可);安装 virtualenv(
pyenv-virtualenv
插件生成的 virtualenv 没有bin/active_this.py
);按照之前的步骤创建 virtualenv.
或者用 Docker 的解决方法,这里还有写默认环境有哪些 packages。
因为只需要
active_this.py
,所以virtualenv/bin/
下python*
的二进制软链接其实没用。 在zip
打包时可以加-y
参数,只打包软链接而不是二进制文件。(可减少 10MB+ 体积)Cloud Function 上传 zip 包最大限制为 50MB。(fyi, numpy 就超了)
通过公开 RESTful API 执行函数,出错时客户端得到的代码并不是 「激活标志」,需要到日志查看。
通过公开 RESTful API 执行函数,传给
main
的dict
里还有__ow_body
,__ow_query
等内容,详见这里。
10. 写 Telegram Bot 时可能会遇到的问题
如果 Webhook 接口返回 HTTP 4xx 错误(
main
有未处理异常)的话,Telegram 会一直重试;而 Cloud Function 是按调用次数计费的...发送时间超过 48h 的消息是没法撤回的,尝试撤回的话
python-telegram-bot
会丢出异常。Telegram 的 Markdown/MarkdownV2 都不支持表格,HTML 标签也只支持给定的几个。 (可以试试只用 Pillow 把表格画成图片,matplotlib 什么的就不要想了)
11. 调用其他 Function,再嫖个 NoSQL
调用其他 Function 其实也是用 HTTP API,一个示例:
1 | APIHOST = os.environ.get('__OW_API_HOST') |
加上个 NoSQL,基本上已经可以解决大部分写 Bot 的需求了。
Cloudant 是基于 Apache CouchDB 的 NoSQL 数据库,用 RESTful API 访问,JSON 输出。免费层送 1GB 空间。
这是 CouchDB 的 API,Cloudant 因为要用 IBM Cloud 的认证,所以有所不同。
12. 尾声
IBM Cloud 用了很多 Apache 的东西,Cloud Function 用的也是 Apache Openwhisk。
如果基础云服务都有通用的协议的话,可能才会真的会有全部「上云」的那天吧。
本文参考了:
[1] https://stackoverflow.com/questions/58698406/aws-lambda-python-so-module-modulenotfounderror-no-module-named-regex-rege
[2] https://github.com/pyenv/pyenv/issues/240