diff --git a/go-scf/README.md b/go-scf/README.md index e1cd643..986e802 100644 --- a/go-scf/README.md +++ b/go-scf/README.md @@ -19,7 +19,7 @@ > 老用户注意: > -> 目前已更新到2.0版本,2.0版本不需要 `config.yaml` 文件,配置改为从云函数的环境变量中读取,请直接下载 `main.zip` 上传至云函数并且设置环境变量即可。 +> 自 2.0 版本之后,不再需要 `config.yaml` 文件,配置改为从云函数的环境变量中读取,请直接下载 `main.zip` 上传至云函数并且设置环境变量即可。 ## 👋 使用方法 @@ -31,7 +31,7 @@ 下载文件 [版本发布页面](https://github.com/riba2534/wecomchan/releases): -- [main.zip](https://github.com/riba2534/wecomchan/releases/download/2.0/main.zip) :云函数可执行二进制文件,不用改动,等会直接上传即可。 +- [main.zip](https://github.com/riba2534/wecomchan/releases/download/2.1/main.zip) :云函数可执行二进制文件,不用改动,等会直接上传即可。 ### 3. 在腾讯云中创建云函数 & 配置环境变量 @@ -51,14 +51,14 @@ 环境变量配置说明 -| key | value | 备注 | -| :------------: | :----------------------------------------------------------: | :----------------------------------------------------------- | -| `FUNC_NAME` | 填你在上面配置的函数说明 | | -| `SEND_KEY` | 最终调用HTTP接口时校验是否是本人调用的密钥,随意设置,最终发起HTTP请求携带即可 | | -| `WECOM_CID` | 企业微信公司ID | | -| `WECOM_SECRET` | 企业微信应用Secret | | -| `WECOM_AID` | 企业微信应用ID | | -| `WECOM_TOUID` | `@all` | 此处指推送消息的默认发送对象,填 `@all`,则代表向该企业的全部成员推送消息(如果是个人用的话,一个企业中只有你自己,直接填 `@all` 即可),如果想指定具体发送的人,后面会说明怎么发。 | +| key | value | 备注 | +| :------------: | :----------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `FUNC_NAME` | 填你在上面配置的函数说明 | | +| `SEND_KEY` | 最终调用HTTP接口时校验是否是本人调用的密钥,随意设置,最终发起HTTP请求携带即可 | | +| `WECOM_CID` | 企业微信公司ID | | +| `WECOM_SECRET` | 企业微信应用Secret | | +| `WECOM_AID` | 企业微信应用ID | | +| `WECOM_TOUID` | `@all` | 此处指推送消息的默认发送对象,填 `@all`,则代表向该企业的全部成员推送消息(如果是个人用的话,一个企业中只有你自己,直接填 `@all` 即可),如果想指定具体发送的人,后面会说明怎么发。 | 6. 在 `触发器配置` 中,新增 `API网关触发`,保持默认配置即可。 7. 点击完成 @@ -77,7 +77,9 @@ ## 👌 发起HTTP请求测试是否成功 -> 当发送的文本中存在有换行符或其他字符时,请把 msg 参数进行 url 编码 +现已支持 `GET`、`POST` 方法进行请求。 + +> 当发送的文本中存在有换行符或其他字符时,请把 msg 参数进行 url 编码(使用 GET 方法注意,POST不需要) ### 简单使用: @@ -101,16 +103,31 @@ > 成员的 ID 在企业微信后台,`通讯录`,点开指定成员资料,有个 `账号` 字段,该字段即为该成员的ID. +### 使用 `POST` 进行请求 + +大部分情况下,`GET` 请求已经可以很好的满足发送一些短消息的需求,但是当消息体过长时,云函数可能报参数过长错误,故在 `V2.1` 版本加入 `POST` 请求支持。 + +与 `GET` 请求不同的是,`POST` 请求不从 [Query string](https://en.wikipedia.org/wiki/Query_string) 获取参数,所有参数改为从 [HTTP message body](https://en.wikipedia.org/wiki/HTTP_message_body) 中获取,这里要求 Body 中必须是 `JSON` 格式,参数字段名称仍与 `GET` 请求的名称保持一致,且 `json` 的 `key` 和 `value` 必须是 `string` 类型,Body 格式例如: + +```json +{ + "sendkey": "123456", + "msg_type": "text", + "msg": "这是一条POST消息", + "to_user": "User1|User2" +} +``` + ### 参数说明: -下表为 GET 请求的参数说明: +下表为请求的参数说明(`GET` 与 `POST` 字段名相同): -| 参数名称 | 说明 | 是否可选 | -| ---------- | ------------------------------------------------------------ | -------- | -| `sendkey` | 校验是否是本人调用的密钥,随意设置,最终发起HTTP请求携带即可 | 必须 | -| `msg_type` | 消息类型,目前只有纯文本一种类型,值为 `text` | 必须 | +| 参数名称 | 说明 | 是否可选 | +| ---------- | --------------------------------------------------------------------------------------------------------------- | -------- | +| `sendkey` | 校验是否是本人调用的密钥,随意设置,最终发起HTTP请求携带即可 | 必须 | +| `msg_type` | 消息类型,目前只有纯文本一种类型,值为 `text` | 必须 | | `msg` | 消息内容,支持多行和UTF8字符,在程序中构建字符串时加上**换行符**即可,如果有特殊符号,记得使用 `urlencode` 编码 | 必须 | -| `to_user` | 如果需要给企业内指定成员发消息,可在此参数中指定成员。如果不传本参数,默认所有成员。 | 可选 | +| `to_user` | 如果需要给企业内指定成员发消息,可在此参数中指定成员。如果不传本参数,默认所有成员。 | 可选 | 👇👇👇 diff --git a/go-scf/service/wecomchan.go b/go-scf/service/wecomchan.go index b372c3f..6557dba 100644 --- a/go-scf/service/wecomchan.go +++ b/go-scf/service/wecomchan.go @@ -18,16 +18,16 @@ import ( ) func WeComChanService(ctx context.Context, event events.APIGatewayRequest) map[string]interface{} { - sendKey := getQuery("sendkey", event.QueryString) - msgType := getQuery("msg_type", event.QueryString) - msg := getQuery("msg", event.QueryString) + sendKey := getQuery("sendkey", event) + msgType := getQuery("msg_type", event) + msg := getQuery("msg", event) if msgType == "" || msg == "" { return utils.MakeResp(-1, "param error") } if sendKey != consts.SEND_KEY { return utils.MakeResp(-1, "sendkey error") } - toUser := getQuery("to_user", event.QueryString) + toUser := getQuery("to_user", event) if toUser == "" { toUser = consts.WECOM_TOUID } @@ -74,10 +74,17 @@ func postWechatMsg(accessToken, msg, msgType, toUser string) error { return nil } -func getQuery(key string, query events.APIGatewayQueryString) string { - value := query[key] - if len(value) > 0 && value[0] != "" { - return value[0] +func getQuery(key string, event events.APIGatewayRequest) string { + switch event.Method { + case "GET": + value := event.QueryString[key] + if len(value) > 0 && value[0] != "" { + return value[0] + } + return "" + case "POST": + return jsoniter.Get([]byte(event.Body), key).ToString() + default: + return "" } - return "" }