基于腾讯云云函数和API网关实现的企业微信应用消息推送服务

Overview

基于腾讯云Serverless实现的企业微信应用消息推送服务

Serverless 云函数目前每月有免费资源使用量40万GBs、免费调用次数100万次

API网关目前开通即送时长12个月100万次免费额度

个人或者低频率使用完全够了,可以通过 GET、POST 方式调用发消息。

对于有服务器、域名资源,通过简单修改也可以直接部署到服务器上。

消息效果

不用安装企业微信App,直接通过微信App关注微信插件即可实现在微信App中接收应用消息,还可以选择消息免打扰。

消息限制

目前发送的应用消息类型为图文消息(mpnews),消息内容支持html标签,不超过666K个字节。

每企业消息发送不可超过帐号上限数*30人次/天(注:若调用api一次发给1000人,算1000人次;若企业帐号上限是500人,则每天可发送15000人次的消息)

每应用对同一个成员不可超过30条/分,超过部分会被丢弃不下发

默认已启用重复消息推送检查5分钟内同样内容的消息,不会重复收到,可修改 EnableDuplicateCheck DuplicateCheckInterval 调整是否开启与时间间隔。

部署方式

首先注册企业微信

创建应用

登录企业微信web管理

进入 应用管理创建应用 ,完成后复制下 AgentId Secret

进入 管理工具素材库图片添加图片 (这个图片是图文消息的展示图),上传成功后在图片下载按钮上复制下载地址

把url的 media_id 值复制下备用

进入 我的企业 ,把 企业ID 复制下,进入 微信插件 ,用微信APP扫 邀请关注 的二维码码即可在微信App中查看企业微信消息。

注册腾讯云账号

腾讯云

新建云函数

云函数

如果想要绑定域名的话可以选择香港地区,免备案。

下载本仓库代码至本地,解压缩。

选择 自定义创建运行环境 Go1提交方法 选择 本地上传文件夹 选择刚才的代码目录。

高级配置 中增加 环境变量

  • CORP_ID 企业微信 企业id
  • CORP_SECRET 企业微信 应用Secret
  • AGENT_ID 企业微信 应用AgentId
  • MEDIA_ID 企业微信 图片素材的media_id

触发器 配置选择 自定义配置 ,触发方式选择 API网关触发

点击 完成 开始创建

设置API网关

Api网关

进入 API网关 服务列表,选择 配置管理 ,然后 管理API编辑

增加 参数配置 ,参数名 SECRET ,参数位置 path,类型 string

路径修改为 /你的云函数名称/{SECRET}

然后点 立即完成 发布服务

基础配置 中复制 公网访问地址 ,想要绑定域名可以在 自定义域名 中绑定,CNAME指到API网关的二级域名,自定义路径映射 / 路径 到 发布 环境。

使用方法

GET方式

https://你的Api网关域名/你的云函数名称/CORP_SECRET?title=消息标题&content=消息内容

POST方式

$ curl --location --request POST 'https://你的Api网关域名/你的云函数名称/CORP_SECRET' \
--header 'Content-Type: application/json;charset=utf-8' \
--data-raw '{"title":"消息标题","content":"消息内容"}'

发送成功状态码返回200,"Content-Type":"application/json" body {"errorCode":0,"errorMessage":""}

其它

发送失败问题排查:

  • 请检查云函数环境变量是否正确
  • 请检查发送url中CORP_SECRET是否正确
  • 请检查Api网关SECRET参数是否设置
  • 进入云函数后台查看请求日志的具体错误原因
Issues
  • 请教一下部署返回错误问题

    请教一下部署返回错误问题

    您好,按照您在readme中的说明,我部署到了云函数上。各项设置都是正确的,但是操作: https://api网址/项目名称/CORP_SECRET?title=%22title%22&content=%22none%22&type=text 返回的结果是: ‘{"errorCode":-1,"errorMessage":"user code exception caught","requestId":"2cf5f58e3d29d72350dcc4ba096","stackTrace":"invoke function failed with err: {\"Message\":\"Request check fail \",\"Type\":\"errorString\",\"StackTrace\":null,\"ShouldExit\":false}","statusCode":430} 云函数日志显示: `START RequestId:23d279d4c6b04007bb2bc07136c40230

    2021/07/06 03:12:21 event: map[headerParameters:map[] headers:map[accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 accept-encoding:gzip, deflate, br accept-language:zh-CN,zh;q=0.9 connection:keep-alive endpoint-timeout:15 host:service-xxxx-1258946465.hk.apigw.tencentcs.com requestsource:APIGW sec-ch-ua:" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91" sec-ch-ua-mobile:?0 sec-fetch-dest:document sec-fetch-mode:navigate sec-fetch-site:none sec-fetch-user:?1 upgrade-insecure-requests:1 user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 x-api-requestid:23d279dxxxxbb2bc07136c40230 x-api-scheme:https x-b3-traceid:23d279d4cxxxxbb2bc07136c40230 x-qualifier:$DEFAULT] httpMethod:GET isBase64Encoded:false path:/golang-wxpush01/CORP_SECRET pathParameters:map[SECRET:CORP_SECRET] queryString:map[content:"none" title:"title1" type:text] queryStringParameters:map[] requestContext:map[httpMethod:ANY identity:map[] path:/xxx/{SECRET} serviceId:service-olcz8t56 sourceIp:222.218.124.37 stage:release]]

    2021/07/06 03:12:21 request: {GET map[content:"none" title:"title1" type:text] map[SECRET:CORP_SECRET]} json error:

    2021/07/06 03:12:21 Request check fail

    ERROR RequestId:23d279d4xxxxxxx07136c40230 Result:{"errorCode":1,"errorMessage":"user code exception caught","stackTrace":"invoke function failed with err: {"Message":"Request check fail ","Type":"errorString","StackTrace":null,"ShouldExit":false}","statusCode":430}

    END RequestId:23d279d4c6b04007bb2bc07136c40230

    Report RequestId:23d27xxxxxxxbc07136c40230 Duration:83ms Memory:128MB MemUsage:33.628906MB`

    opened by tamakyi 0
Releases(v0.0.5)
Owner
since20l8
since20l8