import requests
# !!!请替换为你的真实凭证 !!!
CORP_ID = "ww0f823a7d70454e5d" # 你的企业ID
CORP_SECRET = "8fXV8sQM58RittRgfIkFG1wuEONc-jxW0GtID9xL7aU" # 具有“客户联系”权限的应用Secret
def get_wecom_token(corp_id, corp_secret):
"""
获取企业微信 access_token
"""
url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
params = {
"corpid": corp_id,
"corpsecret": corp_secret
}
try:
resp = requests.get(url, params=params).json()
if resp.get("errcode") == 0:
print(f"✅ Token 获取成功 (有效期 {resp['expires_in']} 秒)")
print(f"access_token: {resp['access_token']}")
return resp['access_token']
else:
print(f"❌ 获取失败 [{resp.get('errcode')}]: {resp.get('errmsg')}")
return None
except Exception as e:
print(f"🚨 请求异常: {e}")
return None
if __name__ == "__main__":
token = get_wecom_token(CORP_ID, CORP_SECRET)import requests
import json
import logging
import time
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 你的固定 Token
FIXED_TOKEN = "GEqSXVi54nTynmaJ4q5VC09aOEbhppNj0_-8-1Ce0J_tQrfoGmJdE47xJXw9cKHbxdKYrRVy_6pnjRwCcGXUTIJtxi6ppHjGFV2pu9CV1N8rrCCXthQtE_EOgnoQrGeb0-9ujo88OklHC0JuYj0aXCaIa5NIeHthABbtpuTBDGAlFxU2E7cbf9V8vHuz0mqCuVl9kDHj1sik8Wu0DdyEmg"
class WeComAPI:
def __init__(self, fixed_token=FIXED_TOKEN):
"""
使用固定 Token 初始化
:param fixed_token: 你的固定 Token
"""
self.fixed_token = fixed_token
self.base_url = "https://qyapi.weixin.qq.com/cgi-bin" # 修正基础URL
logger.info("✅ 使用固定 Token 初始化成功")
def get_external_groupchat_list(self, owner_userid_list=None, limit=100, cursor=""):
"""
获取客户群列表
:param owner_userid_list: 群主ID列表,例如 ["userid1", "userid2"]
:param limit: 分页大小,建议 100
:param cursor: 分页游标,首次调用传空字符串
:return: 群聊列表和下一页游标
"""
url = f"{self.base_url}/externalcontact/groupchat/list"
params = {"access_token": self.fixed_token} # 直接使用固定 Token
# 构建请求体
request_body = {
"limit": limit,
"cursor": cursor,
"status_filter": 0
}
# 如果有指定群主,则添加 owner_filter
if owner_userid_list:
request_body["owner_filter"] = {
"userid_list": owner_userid_list
}
try:
resp = requests.post(url, params=params, json=request_body, timeout=10).json()
logger.info(f"调用 groupchat/list 返回: {json.dumps(resp, ensure_ascii=False)}")
if resp.get("errcode") == 0:
group_chat_list = resp.get("group_chat_list", [])
next_cursor = resp.get("next_cursor", "")
logger.info(f"✅ 成功获取到 {len(group_chat_list)} 个客户群,下一页游标: '{next_cursor}'")
return group_chat_list, next_cursor
else:
logger.error(f"❌ 接口调用失败 [{resp.get('errcode')}]: {resp.get('errmsg')}")
return None, None
except Exception as e:
logger.error(f"🚨 请求异常: {e}")
return None, None
def send_to_external_group(self, chat_id, content):
"""
向指定的外部群(客户群)发送文本消息
注意:这是"代办任务"模式,需群主在手机端确认后才会真正发送
"""
url = f"{self.base_url}/externalcontact/groupchat/send"
params = {"access_token": self.fixed_token}
request_body = {
"chat_id": chat_id,
"msgtype": "text",
"text": {"content": content}
}
try:
# 1. 先打印请求信息(用于调试)
logger.info(f"请求URL: {url}")
logger.info(f"请求参数: {params}")
logger.info(f"请求体: {json.dumps(request_body, ensure_ascii=False)}")
# 2. 发送请求,捕获原始响应
response = requests.post(url, params=params, json=request_body, timeout=10)
raw_text = response.text
logger.info(f"接口返回原始文本: {raw_text}") # 关键调试信息
# 3. 尝试解析JSON
try:
resp = response.json()
except json.JSONDecodeError as e:
logger.error(f"JSON解析失败: {e}")
# 如果不是空响应,打印前200个字符
if raw_text:
logger.error(f"原始响应内容: {raw_text[:200]}")
return None
# 4. 处理解析后的响应
if resp.get("errcode") == 0:
msgid = resp.get("msgid")
logger.info(f"✅ 消息发送任务创建成功,msgid: {msgid}")
logger.info("⚠️ 请提醒群主在企业微信「群发助手」中确认发送")
return msgid
else:
logger.error(f"❌ 发送失败 [{resp.get('errcode')}]: {resp.get('errmsg')}")
return None
except requests.exceptions.Timeout:
logger.error("🚨 请求超时,请检查网络或增加超时时间")
return None
except requests.exceptions.ConnectionError:
logger.error("🚨 网络连接错误,请检查网络设置")
return None
except Exception as e:
logger.error(f"🚨 请求发送接口异常: {e}")
return None
# ====================== 使用示例 ======================
if __name__ == "__main__":
# 初始化客户端(使用固定Token)
client = WeComAPI()
# 1. 获取客户群列表
TEST_OWNER_USERID = ["HuJing"] # 测试用的群主ID
logger.info("正在获取客户群列表(第一页)...")
group_list, next_cursor = client.get_external_groupchat_list(
owner_userid_list=TEST_OWNER_USERID,
limit=100,
cursor=""
)
if group_list is not None:
# 打印获取到的群聊信息
for idx, group in enumerate(group_list, 1):
print(f"{idx}. chat_id: {group.get('chat_id')}, status: {group.get('status')}")
# 2. 向第一个群发送消息
if group_list:
test_chat_id = group_list[0].get('chat_id')
order_content = "【酒店新订单】\n订单号:201111111111\n酒店:XX温泉酒店\n房型:xxxxx房\n入住时间:2026-55-55"
print(f"\n正在向群 {test_chat_id} 发送消息...")
msgid = client.send_to_external_group(test_chat_id, order_content)
if msgid:
print(f"✅ 消息任务已创建,任务ID: {msgid}")
print("⚠️ 重要:请通知群主在企业微信手机端的「群发助手」中确认发送")
else:
print("❌ 消息发送失败")
else:
logger.error("获取客户群列表失败,请检查配置。")客户与上下游---客户联系---客户---企业全部客户数
可以看到。所有的外部联系人。点--已服务的外部联系人 可以看到列表。
客户与上下游---客户联系---客户(客户 --成员可用企业微信添加客户的微信,并在这里与他们联系,企业可统一管理这些客户。)
这个地方有个api 小字,点开 可以配置我的应用。(可调用接口的应用)
配置到这一步,我们可以获取 微信群了。
INFO:__main__:调用 groupchat/list 返回: {"errcode": 0, "errmsg": "ok", "group_chat_list": [{"chat_id": "wrG3K7QAAAlWZybyF3ZZ47lqPrJI0PLA", "status": 0}]}


站长微信:xiaomao0055
站长QQ:14496453