三语言实现企微外部群消息推送

QiWe开放平台提供了后台直登功能,登录成功后获取相关参数,快速Apifox在线测试,所有登录功能都是基于QiWe平台API自定义开发。


核心逻辑:企微外部群发送的两种路径

在开始写代码前,必须明确企业微信发送消息到"外部群"的两种主流方式,因为它们的 API 权限完全不同:

  1. 应用消息(最常用): 通过自建应用,调用 externalcontact/send_by_groupchat 接口。这需要群主开启了应用权限。

  2. 群机器人(最简单): 如果你只是想往自己管理的群里发通知,直接在群设置里添加"机器人",获取 webhook 地址即可。

本篇重点介绍第一种:通过自建应用主动推送。


1. Python 实现:简洁直观

Python 非常适合快速验证逻辑。我们使用 requests 库。

python 复制代码
import requests
import json

def send_external_group_msg(access_token, chat_id, content):
    url = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_by_groupchat?access_token={access_token}"
    
    payload = {
        "chat_id": chat_id,
        "msgtype": "text",
        "text": {
            "content": content
        }
    }
    
    response = requests.post(url, data=json.dumps(payload))
    return response.json()

# 调用示例
# res = send_external_group_msg("YOUR_TOKEN", "EXTERNAL_CHAT_ID", "Hello from Python!")

2. Go 实现:高并发与工程化

Go 语言由于其原生支持并发,适合在大规模推送场景下使用。

Go 复制代码
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

type MsgBody struct {
	ChatID  string `json:"chat_id"`
	MsgType string `json:"msgtype"`
	Text    struct {
		Content string `json:"content"`
	} `json:"text"`
}

func SendMsg(accessToken string, chatId string, content string) {
	url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_by_groupchat?access_token=%s", accessToken)
	
	body := MsgBody{
		ChatID:  chatId,
		MsgType: "text",
	}
	body.Text.Content = content

	jsonData, _ := json.Marshal(body)
	resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
	
	if err != nil {
		fmt.Println("发送失败:", err)
		return
	}
	defer resp.Body.Close()
	fmt.Println("发送成功")
}

3. Java 实现:企业级集成

Java 开发者通常会配合 RestTemplate 或 OkHttp。这里展示基于普通 HTTP 处理的逻辑。

java 复制代码
public class WecomService {
    private static final String API_URL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_by_groupchat?access_token=";

    public void sendMessage(String accessToken, String chatId, String content) {
        // 构建请求体(推荐使用 Jackson 或 Gson)
        Map<String, Object> text = new HashMap<>();
        text.put("content", content);

        Map<String, Object> body = new HashMap<>();
        body.put("chat_id", chatId);
        body.put("msgtype", "text");
        body.put("text", text);

        // 使用你熟悉的 Http 客户端发送 Post 请求
        // String response = HttpUtils.post(API_URL + accessToken, JSON.toJSONString(body));
    }
}

关键避坑指南

1. chat_id 从哪来?

外部群的 chat_id 不是群名,也不是随便生成的。你需要先通过 externalcontact/groupchat/list 接口获取客户群列表,从而拿到对应的 chat_id。

2. 权限问题(最重要)

  • 自建应用权限: 必须在企业微信后台,将该应用的可信域名、IP 白名单配置好。

  • 配置群: 只有当应用在外部群的"可使用范围"内,且该群属于企业微信的"客户群"范畴时,API 才会生效。

3. Token 缓存机制

千万不要每次发消息都去调用 get_token 接口!access_token 有 2 小时有效期,建议存入 Redis 并设置过期时间,否则会触发频率限制。


总结

  • Python 适合做运维脚本或简单的消息通知。

  • Go 适合需要处理大量群消息推送的后端微服务。

  • Java 适合集成在大型 ERP 或 CRM 系统中。

相关推荐
天远数科5 小时前
零信任架构实战:基于天远企业股权变更构建自动化商业银行对公授信存续期股权异动与资产抽逃预警网关
运维·人工智能·架构·自动化
车软学堂5 小时前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化
车软学堂6 小时前
CANoe自动化:跑起第一个测试用例
运维·车载系统·自动化·汽车·测试用例
虎鲸不是鱼9 小时前
AI 自动化逆向(三十三)换一个「驱动器」,覆盖率跳了一个量级
人工智能·自动化·大模型·逆向·ai逆向
虎鲸不是鱼10 小时前
AI 自动化逆向(三十四)自建指令缓存:把分钟级查询压到秒级
人工智能·自动化·大模型·逆向·ai逆向
X1A0RAN11 小时前
自动化流水线的“最后一公里“:任务监听与报告通知服务
自动化·流水线·效率工具
4SAPI12 小时前
会议智能处理大模型 API 生产选型指南:4SAPI、硅基流动与 OpenRouter 的架构权衡
人工智能·架构·自动化·gateway·php
云飞云共享云桌面13 小时前
机械制造研发部门:一台SolidWorks云主机替代 10 台传统图形工作站
运维·服务器·网络·3d·自动化·制造
QYR-分析13 小时前
20.58 亿→41.41 亿美元,CAGR 10.5%|机器人机器视觉:柔性自动化的感知核心正在迭代
机器人·自动化·智能电视