手把手教你用 FunctionGraph 零成本搭建定时消息推送机器人
手把手教你用 FunctionGraph 零成本搭建定时消息推送机器人(Serverless极简实战)
前言:
作为个人开发者或学生党,我们经常有一些定时执行轻量小任务的需求,比如:每日早安/天气提醒、节日倒计时、定时签到、个人服务器简易巡检通知等。
如果为此特意租一台 24 小时开机的云服务器(ECS),不仅每个月要花费几十上百元,而且服务器 99% 的时间都在空载。
其实,华为云的 FunctionGraph(函数工作流) 为每个用户每月提供了 100 万次免费调用 + 40 万 GB-秒执行时间 的免费额度!对于个人小工具来说,完全就是零成本“白嫖”。今天这篇短文,我就带大家花 5 分钟时间,使用 Python 原生代码写一个自动推送到企业微信/飞书/钉钉的群机器人,无需打包任何依赖包,直接在网页控制台就能搞定!
一、准备工作
整个流程极其轻量,你只需要准备好:
- 一个已实名认证的华为云账号(新老用户均有免费 FunctionGraph 额度)。
- 一个群机器人 Webhook 地址:
- 企业微信:群聊右上角 -> 添加群机器人 -> 复制 Webhook 地址。
- 飞书 / 钉钉:群设置 -> 机器人 -> 自定义机器人 -> 复制 Webhook 地址。
(本文以通用的 Webhook POST 请求为例演示)
二、第一步:创建 FunctionGraph 函数
- 登录华为云控制台,顶部搜索框直接搜 FunctionGraph(或在左侧导航进入【计算】->【函数工作流】)。
- 点击右上角的 【创建函数】。
- 按照如下配置填写(非常简单):
- 函数类型:选择 事件函数(默认项)。
- 区域(Region):建议选择离自己最近的区域(如华北-北京四、华东-上海一)。
- 函数名称:例如
daily-notify-robot。 - 委托:选择
无。 - 运行语言(Runtime):选择 Python 3.9(或 Python 3.10)。
- 企业项目:default。
- 点击右下角的 【创建函数】,进入在线代码编辑界面。
三、第二步:编写推送脚本(零依赖,直接复制)
很多同学在用云函数时最头疼的就是“怎么装 requests 库”。其实 Python 自带的 urllib.request 就能直接发送网络请求,完全不需要打包依赖,代码拷进去就能跑!
在函数代码编辑框中,将 index.py 的内容全部替换为以下代码:
# -*- coding:utf-8 -*-
import json
import urllib.request
import urllib.error
from datetime import datetime, timezone, timedelta
def send_wechat_robot(webhook_url: str, message_text: str):
"""
发送消息至企业微信群机器人 (企业微信支持 markdown 格式)
"""
payload = {
"msgtype": "markdown",
"markdown": {
"content": message_text
}
}
headers = {"Content-Type": "application/json; charset=utf-8"}
req = urllib.request.Request(
url=webhook_url,
data=json.dumps(payload).encode("utf-8"),
headers=headers,
method="POST"
)
try:
with urllib.request.urlopen(req, timeout=10) as response:
result = json.loads(response.read().decode("utf-8"))
print(f"[*] 推送响应结果: {result}")
return result
except urllib.error.HTTPError as e:
print(f"[!] HTTP 请求失败: {e.code} - {e.reason}")
raise e
except Exception as e:
print(f"[!] 网络异常: {e}")
raise e
def handler(event, context):
"""
FunctionGraph 入口函数
"""
# 1. 替换成你自己的群机器人 Webhook 地址
# (更推荐在右侧【配置】->【环境变量】中添加 WEBHOOK_URL,从 context/os.environ 中读取)
WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# 2. 获取北京时间 (UTC+8)
utc_now = datetime.now(timezone.utc)
beijing_now = utc_now + timedelta(hours=8)
today_str = beijing_now.strftime("%Y年%m月%d日 %H:%M")
# 3. 组织提醒文案 (支持企业微信 Markdown 语法,如高亮字体、加粗)
content = (
f"### ☀️ 早上好!今日提醒已送达\n\n"
f"> **播报时间**:<font color=\"info\">{today_str}</font>\n"
f"> **任务状态**:华为云 FunctionGraph Serverless 自动调度执行成功!\n\n"
f"💼 **今日待办建议**:\n"
f"- [ ] 查收邮件并处理高优先级任务\n"
f"- [ ] 记得适量饮水、久坐起来活动一下\n"
f"- [ ] 保持好心情,效率翻倍!💪\n\n"
f"—— 来自 [华为云 FunctionGraph](https://www.huaweicloud.com/product/functiongraph.html) 自动化服务"
)
# 4. 执行推送
print("[*] 正在执行自动消息推送...")
send_wechat_robot(WEBHOOK_URL, content)
return {
"statusCode": 200,
"headers": {"Content-Type": "application/json"},
"body": json.dumps({"status": "success", "time": today_str})
}
小贴士(安全建议):
如果不想在代码中硬编码 Webhook 链接,可以点击页面上方的 【配置】->【环境变量】,添加键值对WEBHOOK_URL,然后在代码中通过import os; WEBHOOK_URL = os.getenv("WEBHOOK_URL")动态读取,既规范又安全!
四、第三步:在线配置与测试运行
-
调整超时时间与内存(防止偶发网络慢超时):
- 点击代码编辑界面上方的 【配置】->【基本配置】。
- 内存:默认
128 MB即可(非常轻量,完全足够)。 - 超时时间:默认是
3秒,建议改成10秒。 - 点击 【保存】。
-
在线测试:
- 回到代码页面,点击上方的 【配置测试事件】。
- 测试事件类型选默认的
blank-test(空白事件即可),点击确定。 - 点击 【测试】 按钮。
- 看到控制台底部输出
执行成功: 200,且你的群聊里收到了这条来自机器人的提醒卡片,就说明推送成功了!
五、第四步:添加定时触发器(让它每天准时跑)
我们要的是“每天定时自动播报”,不需要每次手动点测试。
- 在当前函数页面,切换到 【触发器】 选项卡。
- 点击 【创建触发器】:
- 触发器类型:选择 定时触发器(Timer)。
- 触发器名称:填
morning_trigger。 - 触发规则:选择 Cron 表达式。
- Cron 表达式:比如希望每天早上 08:30 触发:
(注:华为云 FunctionGraph 定时触发器默认是按系统标准时间匹配,如果你的控制台显示为 UTC 时区,将 8 点减去 8 小时写成0 30 8 * * ?0 30 0 * * ?即可,页面上方会有贴心的下一次触发时间预览,核对一下北京时间即可)。
- 点击 【确定】,触发器即刻生效!
六、个人进阶小技巧(混分加分项)
学会了这个基础模版,你还可以轻松拓展以下小功能:
- 爬取免费天气 API:
在代码里增加一个通过公共免 Key 天气接口获取当日温度与下雨预警,拼接到消息内容中。 - 节日/发薪日倒计时:
用 Python 的datetime计算离下一个假期(比如元旦、春节、国庆)还有多少天,每天自动更新。 - 个人博客/网站存活监控:
每天定时urllib.request.urlopen("https://yourblog.com"),如果返回不是 200,立刻发群消息告警。
七、总结
通过本篇实战,我们没有花一分钱,也没有租用任何云服务器,仅利用华为云 FunctionGraph + 定时触发器 + 纯内置 Python 库,就轻轻松松搭建起了一个稳定可靠的每日消息提醒助手。
Serverless 技术的魅力就在于:无需运维服务器、按需计费(平时闲置不花一分钱)、高可靠且开箱即用。
大家如果在配置触发器或时区转换时遇到疑问,欢迎在评论区留言交流!觉得有用的小伙伴欢迎点赞、收藏支持一下~
- 点赞
- 收藏
- 关注作者
评论(0)