six_001
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
class wecom推广二维码:
|
||||
@classmethod
|
||||
def 设置授权应用可见范围(cls):
|
||||
"""
|
||||
调用该接口前提是开启通讯录迁移,收到授权成功通知后可调用。企业注册初始化安装应用后,应用默认可见范围为根部门。
|
||||
如需修改应用可见范围,服务商可以调用该接口设置授权应用的可见范围。
|
||||
该接口只能使用注册完成回调事件或者查询注册状态返回的access_token,
|
||||
调用设置通讯录同步完成后或者access_token超过30分钟失效(即解除通讯录锁定状态)则不能继续调用该接口
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
@@ -0,0 +1,63 @@
|
||||
import dataclasses
|
||||
|
||||
import jmespath
|
||||
import pydash
|
||||
import requests
|
||||
from asgiref.sync import async_to_sync
|
||||
from channels.layers import get_channel_layer
|
||||
|
||||
from sixGuoDjango import redis_5
|
||||
from wechat_项目工具包.企业微信工具包.客户管理 import wecom客户管理
|
||||
from wechat_项目工具包.企业微信工具包.消息推送工具 import wecom消息推送
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class six企微回调业务处理方法():
|
||||
pass
|
||||
|
||||
def 添加企业客户事件(self, as_data):
|
||||
""""""
|
||||
"""
|
||||
添加企业客户事件
|
||||
参数 说明 配置了客户联系功能的成员添加外部联系人时,回调该事件
|
||||
ToUserName 企业微信CorpID
|
||||
FromUserName 此事件该值固定为sys,表示该消息由系统生成
|
||||
CreateTime 消息创建时间 (整型)
|
||||
MsgType 消息的类型,此时固定为event
|
||||
Event 事件的类型,此时固定为change_external_contact
|
||||
ChangeType 此时固定为add_external_contact
|
||||
UserID 企业服务人员的UserID
|
||||
ExternalUserID 外部联系人的userid,注意不是企业成员的账号
|
||||
State 添加此用户的「联系我」方式配置的state参数,或在获客链接中指定的customer_channel参数,可用于识别添加此用户的渠道
|
||||
WelcomeCode 欢迎语code,可用于发送欢迎语
|
||||
"""
|
||||
# 这是用户在添加企微好友成功时的回调信息;
|
||||
ToUserName = pydash.get(obj=as_data, path="xml.ToUserName") # toUser 企业微信CorpID
|
||||
FromUserName = pydash.get(obj=as_data, path="xml.FromUserName") # sys 此事件该值固定为sys,表示该消息由系统生成
|
||||
CreateTime = pydash.get(obj=as_data, path="xml.CreateTime") # 1403610513 消息创建时间 (整型)
|
||||
MsgType = pydash.get(obj=as_data, path="xml.MsgType") # event 消息的类型,此时固定为event
|
||||
Event = pydash.get(obj=as_data, path="xml.Event") # change_external_contact 事件的类型,此时固定为change_external_contact
|
||||
ChangeType = pydash.get(obj=as_data, path="xml.ChangeType") # add_external_contact 此时固定为add_external_contact
|
||||
UserID = pydash.get(obj=as_data, path="xml.UserID") # UserID 企业服务人员的UserID
|
||||
ExternalUserID = pydash.get(obj=as_data, path="xml.ExternalUserID", ) # woAJ2GCAAAXtWyujaWJHDDGi0mAAAA 外部联系人的userid,注意不是企业成员的账号
|
||||
State = pydash.get(obj=as_data, path="xml.State", ) # teststate 添加此用户的「联系我」方式配置的state参数,或在获客链接中指定的customer_channel参数,可用于识别添加此用户的渠道
|
||||
WelcomeCode = pydash.get(obj=as_data, path="xml.WelcomeCode") # WELCOMECODE 欢迎语code,可用于发送欢迎语
|
||||
# 发送欢迎语
|
||||
print("添加企业客户事件")
|
||||
|
||||
res_welcom_code = wecom消息推送.发送新客户欢迎语(CALLBACK_CODE=WelcomeCode)
|
||||
# 获取用户的 unionid (主要就是获取用户的unionid的值)
|
||||
res = wecom客户管理.获取客户详情(external_userid=ExternalUserID)
|
||||
print(res)
|
||||
unionid = jmespath.search(data=res, expression="external_contact.unionid")
|
||||
print(unionid)
|
||||
wecom_pay_data = requests.post(url="https://xiao.sixgou.com/demopay/transfer/", json={"unionid": unionid})
|
||||
# 存储数据(用户添加后的数据)
|
||||
print("打印数据类型", wecom_pay_data.json())
|
||||
print("打印数据类型", type(wecom_pay_data.json()))
|
||||
payData = wecom_pay_data.json()
|
||||
channels_name = redis_5.get(name=unionid)
|
||||
default_channel_layer = get_channel_layer(alias="default")
|
||||
async_to_sync(awaitable=default_channel_layer.send)(channel=channels_name, message={"type": "chat_subMsg", "data": payData})
|
||||
pass
|
||||
# 调用发红包的功能
|
||||
@@ -0,0 +1,168 @@
|
||||
"""客户标签管理工具"""
|
||||
import os
|
||||
|
||||
import django
|
||||
|
||||
from sixGuoDjango.settings import BASE_DIR
|
||||
from wechat_token.token工具包 import sixToken
|
||||
|
||||
os.environ.setdefault(key="DJANGO_SETTINGS_MODULE", value=f"{BASE_DIR.name}.settings")
|
||||
django.setup()
|
||||
|
||||
import datetime
|
||||
|
||||
import jmespath
|
||||
import requests
|
||||
|
||||
from requests import post
|
||||
|
||||
|
||||
class wecom管理企业标签:
|
||||
"""
|
||||
管理企业标签
|
||||
最后更新:2023/12/01
|
||||
企业客户标签是针对企业的外部联系人进行标记和分类的标签,由企业统一配置后,企业成员可使用此标签对客户进行标记。
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def 获取企业标签库(cls):
|
||||
"""
|
||||
在这里返回结果为:企业微信创建的所有的企业标签,不包含个人标签
|
||||
企业可通过此接口获取企业客户标签详情。请求方式: POST(HTTP)
|
||||
"""
|
||||
pass
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_corp_tag_list?access_token={wecom_token}"
|
||||
data = post(url=uri).json()
|
||||
print(data)
|
||||
tag_group = jmespath.search(data=data, expression="tag_group")
|
||||
for tag in tag_group:
|
||||
print(tag)
|
||||
|
||||
return data
|
||||
|
||||
@classmethod
|
||||
def 添加企业客户标签(cls):
|
||||
"""
|
||||
企业可通过此接口向客户标签库中添加新的标签组和标签,每个企业最多可配置10000个企业标签。
|
||||
注意:
|
||||
1. 如果要向指定的标签组下添加标签,需要填写group_id参数;
|
||||
2. 如果要创建一个全新的标签组以及标签,则需要通过group_name参数指定新标签组名称,
|
||||
3. 如果填写的groupname已经存在,则会在此标签组下新建标签。
|
||||
4. 如果填写了group_id参数,则group_name和标签组的order参数会被忽略。
|
||||
不支持创建空标签组。
|
||||
标签组内的标签不可同名,如果传入多个同名标签,则只会创建一个。
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_corp_tag?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
"group_id": "etj4zANAAA1Zh_RyLIpjOr6IbuMPRB8g", # 否 标签组id
|
||||
# "group_name": "泰州市", # 否 标签组名称,最长为30个字符
|
||||
"order": 1,
|
||||
"tag": [
|
||||
{
|
||||
"name": "未知", # 是 添加的标签名称,最长为30个字符
|
||||
"order": 1, # 否 标签次序值。order值大的排序靠前。有效的值范围是[0, 2^32)
|
||||
},
|
||||
],
|
||||
# "agentid": 1000014, # 授权方安装的应用agentid。仅旧的第三方多应用套件需要填此参数
|
||||
}
|
||||
data = post(url=uri, json=请求数据示例).json()
|
||||
print(data)
|
||||
|
||||
@classmethod
|
||||
def 编辑客户企业标签(cls, userid: str, external_userid: str, add_tag: str):
|
||||
"""
|
||||
企业可通过此接口为指定成员的客户添加上由企业统一配置的标签;注意,每个成员对同一个客户最多可以添加3000个标签。
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/mark_tag?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
# "userid": "YuanBao1975", # 是 添加外部联系人的userid
|
||||
"userid": userid, # 是 添加外部联系人的userid
|
||||
# "external_userid": "wmj4zANAAAGlCZ2zNRhu1qzEMSBF0a9gs", # 这里测试的是葫芦娃本人的标签
|
||||
"external_userid": external_userid, # 这里测试的是葫芦娃本人的标签
|
||||
# "add_tag": ["etj4zANAAAGtArlV00IwBWzIqinXf5vQ"], # 要添加的标签列表一定要填写🆔(对某一个用户添加某些标签)
|
||||
"add_tag": [add_tag], # 要添加的标签列表一定要填写🆔(对某一个用户添加某些标签)
|
||||
# "remove_tag": [] # 要移除的标签列表(对某一个用户移除某些标签)
|
||||
}
|
||||
data = post(url=uri, json=请求数据示例).json()
|
||||
print(data)
|
||||
|
||||
@classmethod
|
||||
def 更新所有的企业标签并存储到数据库(cls):
|
||||
pass
|
||||
data = cls.获取企业标签库()
|
||||
tag_group = jmespath.search(data=data, expression="tag_group", )
|
||||
for tag_list in tag_group:
|
||||
print(tag_list)
|
||||
# tag_list = jmespath.search(data=tag_list, expression="tag", )
|
||||
group_id = jmespath.search(data=tag_list, expression="group_id", )
|
||||
group_name = jmespath.search(data=tag_list, expression="group_name", )
|
||||
create_time = jmespath.search(data=tag_list, expression="create_time", )
|
||||
# create_time = pydash.get(obj=tag_list, path="create_time", )
|
||||
# 需要将时间戳转为时间格式
|
||||
print(create_time, "========", )
|
||||
create_time_1 = datetime.datetime.fromtimestamp(create_time)
|
||||
#
|
||||
|
||||
tag_child_list = jmespath.search(data=tag_list, expression="tag", )
|
||||
|
||||
@classmethod
|
||||
def 更新所有的用户性别组标签(cls):
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def 打标签性别(cls, userid: str, external_userid: str, gender: int):
|
||||
"""
|
||||
:param gender:
|
||||
:type gender:
|
||||
:param userid:
|
||||
:type userid:
|
||||
:param external_userid:
|
||||
:type external_userid:
|
||||
"""
|
||||
print("单独更新用户性别标签")
|
||||
if gender == 1:
|
||||
cls.编辑客户企业标签(
|
||||
userid=userid, external_userid=external_userid,
|
||||
add_tag="et74kdKAAAO9rCHIG-GcT7ZU_gsTslkg",
|
||||
)
|
||||
if gender == 2:
|
||||
cls.编辑客户企业标签(
|
||||
userid=userid, external_userid=external_userid,
|
||||
add_tag="et74kdKAAAJUou62OZwyu3LeavfmxAhw",
|
||||
)
|
||||
if gender == 0:
|
||||
cls.编辑客户企业标签(
|
||||
userid=userid, external_userid=external_userid,
|
||||
add_tag="et74kdKAAAI_VNWc-Gzakmo_jGnK-Glw",
|
||||
)
|
||||
|
||||
def 给个微好友打标签(self):
|
||||
pass
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/mark_tag"
|
||||
请求数据 = {
|
||||
"userid": "YuanBao",
|
||||
"external_userid": "wm74kdKAAAwE4T5vvLoUgHq9dEu7eTgA", # 给小豆豆测试打标签
|
||||
"add_tag": ["et74kdKAAAO9rCHIG-GcT7ZU_gsTslkg"], # 测试标签ID
|
||||
# "remove_tag": ["et74kdKAAAO9rCHIG-GcT7ZU_gsTslkg"] # 删除企业微信好友的 标签
|
||||
}
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
response_data = requests.post(url=uri, params={"access_token": wecom_token}, json=请求数据)
|
||||
print(response_data.json())
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
wecom管理企业标签.获取企业标签库()
|
||||
# wecom管理企业标签.添加企业客户标签()
|
||||
# wecom管理企业标签.更新所有的用户性别组标签()
|
||||
# wecom管理企业标签.更新所有的企业标签并存储到数据库()
|
||||
# wecom管理企业标签.获取企业标签库()
|
||||
# wecom管理企业标签().给个微好友打标签()
|
||||
@@ -0,0 +1,220 @@
|
||||
import io
|
||||
from typing import List, Literal
|
||||
|
||||
import pydash
|
||||
import requests
|
||||
from pydantic import BaseModel
|
||||
|
||||
from wechat_token.token工具包 import sixToken
|
||||
from wechat_数据库.企业微信数据库.企微用户表 import wecom企微用户
|
||||
from wechat_数据库.用户数据库.小程序登陆用户 import weiuser
|
||||
from wechat_项目工具包.数据库的工具包.更新用户积分 import miniUser用户角色
|
||||
from 第三方工具目录.腾讯云 import oss上传腾讯云图片
|
||||
|
||||
|
||||
class wecomData客户列表响应(BaseModel):
|
||||
errcode: int
|
||||
errmsg: str
|
||||
external_userid: List[str]
|
||||
|
||||
|
||||
from pydantic import BaseModel
|
||||
from typing import List, Optional
|
||||
|
||||
|
||||
class wecomData外部联系人基本信息(BaseModel):
|
||||
"""外部联系人基本信息"""
|
||||
external_userid: str
|
||||
name: str
|
||||
type: int
|
||||
avatar: str
|
||||
gender: int
|
||||
unionid: Optional[str] = None
|
||||
|
||||
|
||||
class wecomData跟进人标签(BaseModel):
|
||||
"""跟进人标签"""
|
||||
group_name: str
|
||||
tag_name: str
|
||||
type: int
|
||||
tag_id: Optional[str] = None
|
||||
|
||||
|
||||
class wecomData跟进成员信息(BaseModel):
|
||||
"""跟进成员信息"""
|
||||
userid: str
|
||||
remark: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
createtime: int
|
||||
state: Optional[str] = None
|
||||
tags: List[wecomData跟进人标签] = []
|
||||
remark_mobiles: List[str] = []
|
||||
remark_corp_name: Optional[str] = None
|
||||
add_way: int
|
||||
oper_userid: str
|
||||
|
||||
|
||||
class wecomData获取客户详情响应(BaseModel):
|
||||
"""获取客户详情接口返回"""
|
||||
errcode: int
|
||||
errmsg: str
|
||||
external_contact: Optional[wecomData外部联系人基本信息] = None
|
||||
follow_user: List[wecomData跟进成员信息] = []
|
||||
|
||||
|
||||
six六果对象xiao, six是否新创建值 = weiuser.objects.update_or_create(unionid="六果",
|
||||
defaults={
|
||||
"user_IP地址": None, "user_昵称": "六果", "user_用户当前的等级": 0, "user_省份": "六果", "user_城市": "六果", "user_区县": "六果",
|
||||
"user_街道信息": "六果", "user_头像": "https://hudie.xiao.band/%E6%9C%AA%E5%91%BD%E5%90%8D.png", "user_绑定企微usrID账号": "六果", "user_角色权限": "六果", "external_userid": "六果",
|
||||
"parent_id": "六果", "mini_openid": "wxf612e825377328f0", "wechat_openid": "六果", "wecom_openid": "wwbe6369dc26a9d83a", "codeConfigId": "六果", "codeRemark": "六果",
|
||||
"codeQrCode": "https://hudie.xiao.band/mini.jpg",
|
||||
"user_企微角色权限": "六果", "user_绑定企微UNIONID": "六果"
|
||||
})
|
||||
|
||||
|
||||
class wecom客户好友管理(BaseModel):
|
||||
# demo_必填: int = Field(..., description="描述") # 必传属发生
|
||||
# demo_可选: Optional[int] = None # 可选值
|
||||
# demo_默认值: int = Field(default=100001, description="描述") # 有默认值
|
||||
# demo_联合类型: Literal["xiao", "zizi"] = Field(..., description="描述")
|
||||
|
||||
def 企微原用户处理接口(self, data):
|
||||
""""""
|
||||
state上级用户 = pydash.get(obj=data, path="state", default="六果") # 上级分享者的uniond值 这里是企微二维码绑定的 uninoid
|
||||
external_userid = pydash.get(obj=data, path="external_userid")
|
||||
unionid下级用户 = pydash.get(obj=data, path="unionid")
|
||||
print(f"state上级用户===>{state上级用户}", f"unionid下级用户===>{unionid下级用户}")
|
||||
上级用户, 上级用户状态 = weiuser.objects.get_or_create(unionid=state上级用户) # 如果state的状态不为None:则创建这个用户
|
||||
下级用户, 下级用户状态 = weiuser.objects.get_or_create(unionid=unionid下级用户)
|
||||
six六果对象, sixBool = weiuser.objects.get_or_create(unionid="六果")
|
||||
if 上级用户.parent is None:
|
||||
# 当这里企微号的state绑定的小程序用户的时候 的 上级用户为None的时候
|
||||
上级用户.parent = six六果对象
|
||||
上级用户.external_userid = external_userid
|
||||
上级用户.user_用户当前的等级 = six六果对象.user_用户当前的等级 + 1
|
||||
上级用户.codeQrCode = six六果对象.codeQrCode
|
||||
上级用户.codeRemark = six六果对象.codeRemark
|
||||
上级用户.codeConfigId = six六果对象.codeConfigId
|
||||
上级用户.user_绑定企微UNIONID = six六果对象.user_绑定企微UNIONID
|
||||
上级用户.save()
|
||||
# # 第二步就只需要查询,如果下级用户已经有上级了就直接忽略
|
||||
if 上级用户.parent is not None:
|
||||
print("这里是上上级用户不为None的时候", )
|
||||
|
||||
# 还需要判断一下,下级用户的 父元素为six公司对象的时候,还得更新一下当前的数据,因为这个用户原来就是属于 企微员工的绑定者
|
||||
if 下级用户.parent == six六果对象 and 下级用户.user_企微角色权限 != miniUser用户角色().企微员工:
|
||||
print(下级用户, "🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎判断成功了")
|
||||
下级用户.parent = 上级用户
|
||||
下级用户.user_用户当前的等级 = 上级用户.user_用户当前的等级 + 1
|
||||
下级用户.user_绑定企微UNIONID = 上级用户.user_绑定企微UNIONID
|
||||
下级用户.codeConfigId = 上级用户.codeConfigId
|
||||
下级用户.codeQrCode = 上级用户.codeQrCode
|
||||
下级用户.codeRemark = 上级用户.codeRemark
|
||||
下级用户.user_绑定企微usrID账号 = 上级用户.user_绑定企微usrID账号
|
||||
下级用户.save()
|
||||
if 下级用户.parent is not None:
|
||||
# 这里判断出下级用户有上级,直接原样处理,不做任何的更改状态
|
||||
print("下级用户的父不为不为不为元素为None的时候", 上级用户)
|
||||
下级用户.external_userid = external_userid
|
||||
下级用户.save()
|
||||
if 下级用户.parent is None:
|
||||
print("下级用户的父元素为None的时候", 上级用户)
|
||||
下级用户.parent = 上级用户
|
||||
下级用户.user_用户当前的等级 = 上级用户.user_用户当前的等级 + 1
|
||||
下级用户.external_userid = external_userid
|
||||
下级用户.codeQrCode = 上级用户.codeQrCode
|
||||
下级用户.codeRemark = 上级用户.codeRemark
|
||||
下级用户.codeConfigId = 上级用户.codeConfigId
|
||||
下级用户.user_绑定企微UNIONID = 上级用户.user_绑定企微UNIONID
|
||||
下级用户.save()
|
||||
|
||||
def 获取客户列表(self, userid: Literal["YuanBao1975"]) -> wecomData客户列表响应:
|
||||
"""根据企微员工的ID,一次获取当前企微员所有的好友列表"""
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/list"
|
||||
json_data = requests.get(url=uri, params={"access_token": wecom_token, "userid": userid})
|
||||
# print("获取客户列表获取客户列表获取客户列表获取客户列表获取客户列表获取客户列表获取客户列表", json_data.json())
|
||||
get_data = wecomData客户列表响应(**json_data.json())
|
||||
return get_data.model_dump()
|
||||
|
||||
def 获取客户详情(self, external_userid) -> wecomData获取客户详情响应:
|
||||
"""通过 external_userid 获取用户的详情,最主要的就是拿到用户的 unionid """
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get"
|
||||
data = requests.get(url=uri, params={"access_token": wecom_token, "external_userid": external_userid})
|
||||
print("\n🍎 🍏 🍊获取客户详情 🍎 🍏 \n", data.json())
|
||||
return wecomData获取客户详情响应(**data.json())
|
||||
|
||||
def 批量获取客户详情并存储到数据库(self, state企微员工创建时添加的唯一值, userid企微员工账号ID: Literal["YuanBao1975"]):
|
||||
"""根据企微员工的ID,获取当前企微员添加的所有的外 部联系人好友,并存储到数据库"""
|
||||
|
||||
def request_recursive(userid_list=None, cursor="", ):
|
||||
""""""
|
||||
# 初始化参数
|
||||
wecom_token_inner = sixToken.get_wecom_token()
|
||||
# 构建请求参数
|
||||
uri = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/batch/get_by_user"
|
||||
json_data = {"userid_list": userid_list, "limit": 200, "cursor": cursor}
|
||||
|
||||
# 发送请求
|
||||
try:
|
||||
data = requests.post(url=uri, params={"access_token": wecom_token_inner}, json=json_data, )
|
||||
response_json = data.json()
|
||||
# 提取当前页的外部联系人
|
||||
# 获取下一页游标
|
||||
external_contact_list = pydash.get(obj=response_json, path="external_contact_list")
|
||||
next_cursor = pydash.get(obj=response_json, path="next_cursor", default="")
|
||||
|
||||
print(f"当前获取到 {len(external_contact_list)} 个外部联系人,总计 {len(external_contact_list)} 个")
|
||||
# 如果还有下一页,递归调用
|
||||
for post_data in external_contact_list:
|
||||
userid = pydash.get(obj=post_data, path="follow_info.userid") # 添加了此外部联系人的企业成员userid 如 HuDie_1
|
||||
remark = pydash.get(obj=post_data, path="follow_info.remark") # 该成员对此微信客户备注的企业名称(仅微信客户有该字段)
|
||||
description = pydash.get(obj=post_data, path="follow_info.description")
|
||||
createtime = pydash.get(obj=post_data, path="follow_info.createtime")
|
||||
state = pydash.get(obj=post_data, path="follow_info.state") # 企业自定义的state参数,用于区分客户具体是通过哪个「联系我」或获客链接添加;由企业通过创建「联系我」或在获客链接中添加customer_channel参数进行指定
|
||||
tag_id = pydash.get(obj=post_data, path="follow_info.tag_id")
|
||||
remark_mobiles = pydash.get(obj=post_data, path="follow_info.remark_mobiles") # 该成员对此客户备注的手机号码,第三方应用和代开发应用均不可获取,上游企业不可获取下游企业客户该字段
|
||||
add_way = pydash.get(obj=post_data, path="follow_info.add_way") # 该成员添加此客户的来源add_way为10时,对应的视频号信息
|
||||
oper_userid = pydash.get(obj=post_data, path="follow_info.oper_userid") # 发起添加的userid,如果成员主动添加,为成员的userid;如果是客户主动添加,则为客户的外部联系人userid;如果是内部成员共享/管理员分配,则为对应的成员/管理员userid
|
||||
external_userid = pydash.get(obj=post_data, path="external_contact.external_userid") # 外部联系人的userid
|
||||
name = pydash.get(obj=post_data, path="external_contact.name") # 外部联系人的名称[注1]
|
||||
type_data = pydash.get(obj=post_data, path="external_contact.type") # 外部联系人的类型,1表示该外部联系人是微信用户,2表示该外部联系人是企业微信用户
|
||||
avatar = pydash.get(obj=post_data, path="external_contact.avatar") # 外部联系人头像。第三方应用和代开发应用均不可获取,上游企业不可获取下游企业客户该字段
|
||||
gender = pydash.get(obj=post_data, path="external_contact.gender") # 外部联系人性别 0-未知 1-男性 2-女性。
|
||||
unionid = pydash.get(obj=post_data, path="external_contact.unionid") # 外部联系人在微信开放平台的唯一身份标识(微信unionid),
|
||||
print("看看这里的值是多少看看这里的值是多少看看这里的值是多少看看这里的值是多少看看这里的值是多少看看这里的值是多少看看这里的值是多少看看这里的值是多少", state)
|
||||
if avatar and type_data == 1:
|
||||
img_file = requests.get(url=avatar).content
|
||||
src = oss上传腾讯云图片.上传图片(key=f"{userid}/{name}.png", file=io.BytesIO(img_file), )
|
||||
avatar = src
|
||||
# time.sleep( 1 )
|
||||
# avatar = "https://hudie.xiao.band/%E6%9C%AA%E5%91%BD%E5%90%8D.png"
|
||||
if bool(avatar) == False and type_data == 1:
|
||||
avatar = "https://hudie.xiao.band/%E6%9C%AA%E5%91%BD%E5%90%8D.png"
|
||||
if type_data == 1:
|
||||
weiuser.objects.update_or_create(unionid=unionid, defaults={"user_头像": avatar, "user_昵称": name, "external_userid": external_userid, })
|
||||
wecomData = {"state": state企微员工创建时添加的唯一值, "external_userid": external_userid, "unionid": unionid}
|
||||
self.企微原用户处理接口(data=wecomData)
|
||||
wecom企微用户.objects.update_or_create(wecom企微ID=userid, wecom企微对好友添加的手机号码=remark_mobiles, wecom企微好友添加方式=oper_userid, wecom企微状态State=state企微员工创建时添加的唯一值, wecom对好友打的标签=tag_id,
|
||||
wecom对好友的备注信息=description, wecom对好友的备注名称=remark, wecom对好友的添加时间=createtime, wecom好友头像=avatar, wecom好友性别=gender, wecom好友昵称=name, wecom好友的ID=external_userid,
|
||||
wecom好友UNIONID=unionid, )
|
||||
|
||||
if next_cursor:
|
||||
print(f"发现下一页,游标: {next_cursor}") # 递归调用
|
||||
request_recursive(userid_list=userid_list, cursor=next_cursor, )
|
||||
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"网络请求异常: {e}", )
|
||||
except Exception as e:
|
||||
print(f"处理异常: {e}")
|
||||
|
||||
request_recursive(userid_list=[userid企微员工账号ID], )
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pass
|
||||
wai_external_userid = "wmj4zANAAAGlCZ2zNRhu1qzEMSBF0a9g"
|
||||
# data_wecom_客户详情数据 = wecom客户好友管理().获取客户详情(external_userid=wai_external_userid)
|
||||
wecom客户好友管理().批量获取客户详情并存储到数据库(state企微员工创建时添加的唯一值="oy4Jw6A1T3WkKOOhMxcbQTDSM8rs", userid企微员工账号ID="YuanBao1975") # 此方法会直接更新数据库并且保存数据
|
||||
@@ -0,0 +1,123 @@
|
||||
"""客户群管理工具"""
|
||||
import os
|
||||
|
||||
import django
|
||||
from pydantic import BaseModel
|
||||
|
||||
from sixGuoDjango.settings import BASE_DIR
|
||||
|
||||
os.environ.setdefault(key="DJANGO_SETTINGS_MODULE", value=f"{BASE_DIR.name}.settings")
|
||||
django.setup()
|
||||
|
||||
from wechat_token.token工具包 import sixToken
|
||||
|
||||
from requests import post
|
||||
|
||||
|
||||
# class emsParameters(BaseModel):
|
||||
# demo_必填: int = Field(..., description="描述") # 必传属发生
|
||||
# demo_可选: Optional[int] = None # 可选值
|
||||
# demo_默认值: int = Field(default=100001, description="描述") # 有默认值
|
||||
# demo_联合类型: Literal["xiao", "zizi"] = Field(..., description="描述")
|
||||
#
|
||||
|
||||
|
||||
class wecom客户群管理(BaseModel):
|
||||
"""类注释"""
|
||||
pass
|
||||
|
||||
def get获取客户群列表(self):
|
||||
"""
|
||||
该接口用于获取配置过客户群管理的客户群列表。
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/list?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
# "status_filter": 0,
|
||||
# "owner_filter": {
|
||||
# "userid_list": ["abel"]
|
||||
# },
|
||||
# "cursor": "r9FqSqsI8fgNbHLHE5QoCP50UIg2cFQbfma3l2QsmwI",
|
||||
"limit": 10
|
||||
}
|
||||
data = post(url=uri, json=请求数据示例).json()
|
||||
print(data)
|
||||
|
||||
def get获取客户群详情(self, chat_id群号ID):
|
||||
"""
|
||||
通过客户群ID,获取详情。包括群名、群成员列表、群成员入群时间、入群方式。(客户群是由具有客户群使用权限的成员创建的外部群)
|
||||
需注意的是,如果发生群信息变动,会立即收到群变更事件,但是部分信息是异步处理,可能需要等一段时间调此接口才能得到最新结果
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
"chat_id": chat_id群号ID, # 是 客户群ID
|
||||
"need_name": 1, # 否 是否需要返回群成员的名字group_chat.member_list.name。0-不返回;1-返回。默认不返回
|
||||
}
|
||||
data = post(url=uri, json=请求数据示例).json()
|
||||
print(data)
|
||||
|
||||
def 客户群opengid转换(self):
|
||||
"""
|
||||
用户在微信里的客户群里打开小程序时,某些场景下可以获取到群的opengid,如果该群是企业微信的客户群,则企业或第三方可以调用此接口将一个opengid转换为客户群chat_id
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/opengid_to_chatid?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
"opengid": "oAAAAAAA", # 是 小程序在微信获取到的群ID,参见wx.getGroupEnterInfo
|
||||
}
|
||||
data = post(url=uri, json=请求数据示例).json()
|
||||
print(data)
|
||||
|
||||
def 入群欢迎语素材管理(self):
|
||||
"""
|
||||
企业可通过此API向企业的入群欢迎语素材库中添加素材。每个企业的入群欢迎语素材库中,最多容纳100个素材。
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/add?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
"text": {
|
||||
"content": "亲爱的%NICKNAME%用户,你好"
|
||||
},
|
||||
"image": {
|
||||
"media_id": "MEDIA_ID",
|
||||
"pic_url": "http://p.qpic.cn/pic_wework/3474110808/7a6344sdadfwehe42060/0"
|
||||
},
|
||||
"link": {
|
||||
"title": "消息标题",
|
||||
"picurl": "https://example.pic.com/path",
|
||||
"desc": "消息描述",
|
||||
"url": "https://example.link.com/path"
|
||||
},
|
||||
"miniprogram": {
|
||||
"title": "消息标题",
|
||||
"pic_media_id": "MEDIA_ID",
|
||||
"appid": "wx8bd80126147dfAAA",
|
||||
"page": "/path/index"
|
||||
},
|
||||
"file": {
|
||||
"media_id": "1Yv-zXfHjSjU-7LH-GwtYqDGS-zz6w22KmWAT5COgP7o"
|
||||
},
|
||||
"video": {
|
||||
"media_id": "MEDIA_ID"
|
||||
},
|
||||
"agentid": 1000014,
|
||||
"notify": 1
|
||||
}
|
||||
data = post(url=uri, json=请求数据示例).json()
|
||||
print(data)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
wecom客户群管理().get获取客户群列表()
|
||||
wecom客户群管理().get获取客户群详情(chat_id群号ID="wrj4zANAAAmHh0Yqe23edo4TI462Bhpg")
|
||||
@@ -0,0 +1,380 @@
|
||||
import os
|
||||
|
||||
import django
|
||||
|
||||
from sixGuoDjango.settings import BASE_DIR
|
||||
from wechat_token.token工具包 import sixToken
|
||||
|
||||
|
||||
os.environ.setdefault( key="DJANGO_SETTINGS_MODULE", value=f"{BASE_DIR.name}.settings" )
|
||||
django.setup( )
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
import pydash
|
||||
import requests
|
||||
from django.conf import settings
|
||||
|
||||
from requests import post
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class wecom消息推送:
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def 上传图片文件( cls ):
|
||||
uri = ''
|
||||
filePath = Path( settings.BASE_DIR ).joinpath( "django_static_directory/media/app.png" )
|
||||
data = requests.post( url=uri, files={ "media": open( file="文件路径", mode="rb", ) } )
|
||||
|
||||
@classmethod
|
||||
def 欢迎语类型IMG( cls ):
|
||||
pass
|
||||
IMG = {
|
||||
"msgtype": "link",
|
||||
"link": {
|
||||
"title": "消息标题",
|
||||
"picurl": "https://example.pic.com/path",
|
||||
"desc": "消息描述",
|
||||
"url": "https://example.link.com/path"
|
||||
}
|
||||
}
|
||||
return IMG
|
||||
|
||||
@classmethod
|
||||
def 欢迎语类型小程序( cls ):
|
||||
pass
|
||||
miniprogram = {
|
||||
"msgtype": "miniprogram", # 附件类型,可选image、link、miniprogram或者video
|
||||
"miniprogram": {
|
||||
"title": "小程序领现金红包", # 是 小程序消息标题,最长为 64 字节
|
||||
"pic_media_id": "3AIBtUrVvuc2qwuSjJSWK9AXyQF_omNpWJqz_4onX_shiGW9U6OsWauNImkKVwJsON0xkcnywtAQJnaXfgmCbIA",
|
||||
# 小程序消息封面的mediaid,封面图建议尺寸为520*416
|
||||
"appid": "wx3acee999f873005a",
|
||||
"page": "/tabPage/Home/Home",
|
||||
},
|
||||
}
|
||||
return miniprogram
|
||||
|
||||
@classmethod
|
||||
def 欢迎语类型LINK( cls ):
|
||||
"""
|
||||
欢迎语类型LINK
|
||||
"""
|
||||
IMG = {
|
||||
"msgtype": "link", # 附件类型,可选image、link、miniprogram或者video
|
||||
"image": {
|
||||
"media_id": "MEDIA_ID", # 图片的media_id,可以通过素材管理接口获得
|
||||
"pic_url": "http://p.qpic.cn/pic_wework/3474110808/7a6344sdadfwehe42060/0" # 图片的链接,仅可使用上传图片接口得到的链接
|
||||
}
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def 欢迎语类型VIDEO( cls ):
|
||||
pass
|
||||
VIDEO = {
|
||||
"msgtype": "video",
|
||||
"video": {
|
||||
"media_id": "MEDIA_ID"
|
||||
}
|
||||
}
|
||||
return VIDEO
|
||||
|
||||
@classmethod
|
||||
def 创建企业群发( cls ):
|
||||
pass
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
url = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_msg_template"
|
||||
json_data = {
|
||||
"chat_type": "single",
|
||||
"external_userid": [
|
||||
"wmj4zANAAAGlCZ2zNRhu1qzEMSBF0a9g", "wmj4zANAAA-lsKNm2U2U-EBCcVGuFGIA",
|
||||
],
|
||||
"attachments": [
|
||||
{
|
||||
"msgtype": "link",
|
||||
"link": {
|
||||
"title": "消息标题",
|
||||
"desc": "消息描述",
|
||||
"url": "https://www.sixgou.com/",
|
||||
"picurl": "https://fastly.picsum.photos/id/82/200/200.jpg?hmac"
|
||||
"=ATNAhTLN2dA0KmTzSE5D9XiPe3GMX8uwxpFlhU7U5OY",
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
data = post(
|
||||
url=url, json=json_data, params={
|
||||
"access_token": wecom_token,
|
||||
},
|
||||
)
|
||||
print( data.json( ) )
|
||||
|
||||
@classmethod
|
||||
def 提醒成员群发( cls ):
|
||||
"""
|
||||
提醒成员群发
|
||||
"""
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def 停止企业群发( cls ):
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def 发送新客户欢迎语( cls, CALLBACK_CODE: str ):
|
||||
""""""
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
url = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_welcome_msg?access_token={wecom_token}"
|
||||
miniprogram = cls.欢迎语类型小程序( )
|
||||
json_data = {
|
||||
"welcome_code": CALLBACK_CODE,
|
||||
"text": {
|
||||
"content": """
|
||||
🎉恭喜!您已成功解锁 给【好友发红包】特权!🔓
|
||||
|
||||
|
||||
🚀更多惊喜权益,开启您的收益之旅:
|
||||
|
||||
|
||||
1️⃣ 双向红包💰:给好友发红包🧧,您也能获得现金奖励💸,分享快乐😊,双倍收获!
|
||||
|
||||
|
||||
2️⃣ 加入赚佣金🤝:成为我们的一员👨👩👧👦,推荐心仪好物❤️,轻松赚取商品推荐分成📈。
|
||||
|
||||
|
||||
3️⃣ 超越赢未来🏆:与我们并肩前行👣,共享海量商品🛍️、优质服务🛠️与庞大流量🌊,共创价值!✨
|
||||
""",
|
||||
},
|
||||
}
|
||||
data = post( url=url, json=json_data )
|
||||
print( "客户欢迎语发送成功了:", data.json( ) )
|
||||
errcode = pydash.get( obj=data.json( ), path="errcode" )
|
||||
if errcode == 41051:
|
||||
pass
|
||||
return data.json( ).get( "errmsg" )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class wecom获取企业的全部群发记录:
|
||||
"""
|
||||
企业跟第三方应用可通过该接口获取群发给客户的消息和群发到客户群的消息
|
||||
1. 群发助手和客户群群发有以下两种类型
|
||||
2. 企业发表
|
||||
1. 管理员或者业务负责人创建内容,成员确认后,即可发送给客户或者客户群
|
||||
3. 个人发表
|
||||
1. 成员自己创建的内容,可直接发送给客户或客户群
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def 获取群发记录列表( cls ):
|
||||
"""
|
||||
企业和第三方应用可通过此接口获取企业与成员的群发记录。
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
url = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_groupmsg_list_v2?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
"chat_type": "single",
|
||||
"start_time": 1605171726,
|
||||
"end_time": 1605172726,
|
||||
"creator": "zhangshan",
|
||||
"filter_type": 1,
|
||||
"limit": 50,
|
||||
"cursor": "CURSOR"
|
||||
}
|
||||
data = post( url=url, json=请求数据示例 ).json( )
|
||||
print( data )
|
||||
|
||||
@classmethod
|
||||
def 获取群发成员发送任务列表( cls ):
|
||||
"""
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
url = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_groupmsg_task?access_token={wecom_token}"
|
||||
请求数据示例 = { "msgid": "msgGCAAAXtWyujaWJHDDGi0mACAAAA", "limit": 50, "cursor": "CURSOR" }
|
||||
data = post( url=url, json=请求数据示例 ).json( )
|
||||
print( data )
|
||||
|
||||
@classmethod
|
||||
def 获取企业群发成员执行结果( cls ):
|
||||
"""
|
||||
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
url = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_groupmsg_send_result?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
"msgid": "msgGCAAAXtWyujaWJHDDGi0mACAAAA",
|
||||
"userid": "zhangsan ",
|
||||
"limit": 50,
|
||||
"cursor": "CURSOR"
|
||||
}
|
||||
data = post( url=url, json=请求数据示例 ).json( )
|
||||
print( data )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class wecom入群欢迎语素材管理:
|
||||
"""
|
||||
添加入群欢迎语素材
|
||||
企业可通过此API向企业的入群欢迎语素材库中添加素材。每个企业的入群欢迎语素材库中,最多容纳100个素材。
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def 添加入群欢迎语素材( cls ):
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
url = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/add?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
"text": {
|
||||
"content": "亲爱的%NICKNAME%用户,你好"
|
||||
},
|
||||
"image": {
|
||||
"media_id": "MEDIA_ID",
|
||||
"pic_url": "http://p.qpic.cn/pic_wework/3474110808/7a6344sdadfwehe42060/0"
|
||||
},
|
||||
"link": {
|
||||
"title": "消息标题",
|
||||
"picurl": "https://example.pic.com/path",
|
||||
"desc": "消息描述",
|
||||
"url": "https://example.link.com/path"
|
||||
},
|
||||
"miniprogram": {
|
||||
"title": "消息标题",
|
||||
"pic_media_id": "MEDIA_ID",
|
||||
"appid": "wx8bd80126147dfAAA",
|
||||
"page": "/path/index"
|
||||
},
|
||||
"file": {
|
||||
"media_id": "1Yv-zXfHjSjU-7LH-GwtYqDGS-zz6w22KmWAT5COgP7o"
|
||||
},
|
||||
"video": {
|
||||
"media_id": "MEDIA_ID"
|
||||
},
|
||||
"agentid": 1000014,
|
||||
"notify": 1
|
||||
}
|
||||
data = post( url=url, json=请求数据示例 ).json( )
|
||||
print( data )
|
||||
|
||||
@classmethod
|
||||
def 编辑入群欢迎语素材( cls ):
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/edit?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
"template_id": "msgXXXXXXX",
|
||||
"text": {
|
||||
"content": "文本消息内容"
|
||||
},
|
||||
"image": {
|
||||
"media_id": "MEDIA_ID",
|
||||
"pic_url": "http://p.qpic.cn/pic_wework/3474110808/7a6344sdadfwehe42060/0"
|
||||
},
|
||||
"link": {
|
||||
"title": "消息标题",
|
||||
"picurl": "https://example.pic.com/path",
|
||||
"desc": "消息描述",
|
||||
"url": "https://example.link.com/path"
|
||||
},
|
||||
"miniprogram": {
|
||||
"title": "消息标题",
|
||||
"pic_media_id": "MEDIA_ID",
|
||||
"appid": "wx8bd80126147df384",
|
||||
"page": "/path/index"
|
||||
},
|
||||
"file": {
|
||||
"media_id": "1Yv-zXfHjSjU-7LH-GwtYqDGS-zz6w22KmWAT5COgP7o"
|
||||
},
|
||||
"video": {
|
||||
"media_id": "MEDIA_ID"
|
||||
},
|
||||
"agentid": 1000014
|
||||
}
|
||||
data = post( url=uri, json=请求数据示例 ).json( )
|
||||
print( data )
|
||||
|
||||
@classmethod
|
||||
def 获取入群欢迎语素材( cls ):
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/get?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
"template_id": "msgXXXXXXX"
|
||||
}
|
||||
data = post( url=uri, json=请求数据示例 ).json( )
|
||||
print( data )
|
||||
|
||||
@classmethod
|
||||
def 删除入群欢迎语素材( cls ):
|
||||
"""
|
||||
删除入群欢迎语素材
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/del?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
"template_id": "msgXXXXXXX",
|
||||
"agentid": 1000014
|
||||
}
|
||||
data = post( url=uri, json=请求数据示例 ).json( )
|
||||
print( data )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class uploadTempMedia上传附件资源:
|
||||
|
||||
@classmethod
|
||||
def upload_file( cls ):
|
||||
"""
|
||||
参数 必须 说明
|
||||
access_token 是 调用接口凭证
|
||||
media_type 是 媒体文件类型,分别有图片(image)、视频(video)、普通文件(file)
|
||||
attachment_type 是 附件类型,不同的附件类型用于不同的场景。1:朋友圈;2:商品图册
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/media/upload_attachment?access_token={wecom_token}&media_type=image&attachment_type=1"
|
||||
params = { "access_token": wecom_token, "media_type": "image", "attachment_type": "1" }
|
||||
file_path = Path( settings.BASE_DIR ).joinpath( "django_环境/常用类/xiao小程序项目图片/ico运力管理系统.png" )
|
||||
print( file_path )
|
||||
file = { "media": open( file=file_path, mode="rb", ) }
|
||||
|
||||
data = post( url=uri, files=file )
|
||||
media_id = pydash.get( obj=data.json( ), path="media_id" )
|
||||
print( media_id )
|
||||
|
||||
@classmethod
|
||||
def 上传临时素材( cls ):
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={wecom_token}&type=image"
|
||||
# file_path = Path(settings.BASE_DIR).joinpath("django_环境/常用类/xiao小程序项目图片/ico运力管理系统.png")
|
||||
file_path = Path( settings.BASE_DIR ).joinpath( "django_环境//常用类/xiao小程序项目图片/莫大帅分享主图.png" )
|
||||
print( file_path )
|
||||
file = { "media": open( file=file_path, mode="rb", ) }
|
||||
|
||||
data = post( url=uri, files=file )
|
||||
media_id = pydash.get( obj=data.json( ), path="media_id" )
|
||||
print( data.json( ) )
|
||||
print( media_id )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
uploadTempMedia上传附件资源.上传临时素材( )
|
||||
@@ -0,0 +1,36 @@
|
||||
"""联系我与客户入群方式(加入群聊)工具"""
|
||||
from requests import post
|
||||
|
||||
from wechat_token.token工具包 import sixToken
|
||||
|
||||
|
||||
class wecom客户群_加入群聊_管理:
|
||||
"""注释"""
|
||||
@classmethod
|
||||
def 配置客户群进群方式(cls):
|
||||
"""
|
||||
企业可调用此接口来生成并配置「加入群聊」的二维码或者小程序按钮,客户通过扫描二维码或点击小程序上的按钮,即可加入特定的客户群
|
||||
如果配置的是小程序按钮,需要开发者的小程序接入小程序插件。
|
||||
通过API添加的配置不会在管理端进行展示,每个企业可通过API最多配置50万个「加入群聊」(与「联系我」共用50万的额度)
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/add_join_way?access_token={wecom_token}"
|
||||
请求数据示例 = {
|
||||
"scene": 2, # 是 场景。1 - 群的小程序插件 2 - 群的二维码插件
|
||||
"remark": "aa_remark", # 否 联系方式的备注信息,用于助记,超过30个字符将被截断
|
||||
"auto_create_room": 1, # 否 当群满了后,是否自动新建群。0-否;1-是。 默认为1
|
||||
"room_base_name": "销售客服群", # 否 自动建群的群名前缀,当auto_create_room为1时有效。最长40个utf8字符
|
||||
"room_base_id": 10, # 否 自动建群的群起始序号,当auto_create_room为1时有效
|
||||
# chat_id_list 是 使用该配置的客户群ID列表,最多支持5个。见客户群ID获取方法
|
||||
"chat_id_list": [
|
||||
"wrOgQhDgAAH2Yy-CTZ6POca8mlBEdaaa",
|
||||
"wrOgQhDgAALPUthpRAKvl7mgiQRwAAA"
|
||||
],
|
||||
# 否 企业自定义的state参数,用于区分不同的入群渠道。不超过30个UTF-8字符
|
||||
# 如果有设置此参数,在调用获取客户群详情接口时会返回每个群成员对应的该参数值,详见文末附录2
|
||||
"state": "klsdup3kj3s1"
|
||||
}
|
||||
data = post(uri, json=请求数据示例).json()
|
||||
print(data)
|
||||
@@ -0,0 +1,187 @@
|
||||
"""客户联系我管理"""
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
import django
|
||||
import requests
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from sixGuoDjango.settings import BASE_DIR
|
||||
from wechat_token.token工具包 import sixToken
|
||||
from wechat_数据库.用户数据库.小程序登陆用户 import weiuser
|
||||
from wechat_项目工具包.数据库的工具包.更新用户积分 import miniUser用户角色
|
||||
|
||||
os.environ.setdefault(key="DJANGO_SETTINGS_MODULE", value=f"{BASE_DIR.name}.settings")
|
||||
django.setup()
|
||||
|
||||
import pydash
|
||||
|
||||
from requests import post
|
||||
|
||||
six六果对象xiao, six是否新创建值 = weiuser.objects.update_or_create(unionid="六果",
|
||||
defaults={
|
||||
"user_IP地址": None, "user_昵称": "六果", "user_用户当前的等级": 0, "user_省份": "六果", "user_城市": "六果", "user_区县": "六果",
|
||||
"user_街道信息": "六果", "user_头像": "https://hudie.xiao.band/%E6%9C%AA%E5%91%BD%E5%90%8D.png", "user_绑定企微usrID账号": "六果", "user_角色权限": "六果", "external_userid": "六果",
|
||||
"parent_id": "六果", "mini_openid": "wxf612e825377328f0", "wechat_openid": "六果", "wecom_openid": "wwbe6369dc26a9d83a", "codeConfigId": "六果", "codeRemark": "六果",
|
||||
"codeQrCode": "https://hudie.xiao.band/mini.jpg",
|
||||
"user_企微角色权限": "六果", "user_绑定企微UNIONID": "六果"
|
||||
})
|
||||
|
||||
|
||||
class wecom客户联系_联系我_管理(BaseModel):
|
||||
"""
|
||||
https://developer.work.weixin.qq.com/document/path/92228#%E9%99%84%E5%BD%95
|
||||
"""
|
||||
addres_省: str = Field(..., description="addres_省")
|
||||
address_市: str = Field(..., description="address_市")
|
||||
address_区县: str = Field(..., description="address_区县")
|
||||
|
||||
def 配置客户联系_联系我_方式(self, state企微二维码绑定的唯一值: str, userid_list: list[str]):
|
||||
"""
|
||||
通过API添加的「联系我」不会在管理端进行展示,每个企业可通过API最多配置50万个「联系我」。
|
||||
用户需要妥善存储返回的config_id,config_id丢失可能导致用户无法编辑或删除「联系我」。
|
||||
临时会话模式不占用「联系我」数量,但每日最多添加10万个,并且仅支持单人。
|
||||
临时会话模式的二维码,添加好友完成后该二维码即刻失效。
|
||||
请求方式:POST(HTTPS)
|
||||
请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_contact_way?access_token=ACCESS_TOK
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
|
||||
# wecom_token = "500hJr2pfJIa5vCJoUOK_zJRcKG_4fKdC_pilCgsEds7lQ3VZGlg1FN6iGDKZsMpUqZO4Di9BJfEMxk7V01yz5NYNwaekvby9vw3gZBw40uXr-YqlAVkP6ZRA0Wf6IkHfiYUTDQAk1
|
||||
# -hUANg42srD6f3AfooEi1ZbbmAvXRjsPa17HVgzxLP7NnGTZPbaTOZRU2Cr269GjxZhgx0dVHu1Q"
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_contact_way?access_token={wecom_token}"
|
||||
state = "oy4Jw6Lyfyj1VvgZFodzq9oqJzHE"
|
||||
请求数据 = {
|
||||
"type": 1, # 联系方式类型,1-单人, 2-多人
|
||||
"scene": 2, # 场景,1-在小程序中联系,2-通过二维码联系
|
||||
"style": 1, # 否 在小程序中联系时使用的控件样式,详见附表
|
||||
"remark": "渠道客户", # 否 联系方式的备注信息,用于助记,不超过30个字符
|
||||
"skip_verify": True, # 否 外部客户添加时是否无需验证,默认为true
|
||||
"state": state企微二维码绑定的唯一值, # 是 区分业务用的;
|
||||
"user": userid_list,
|
||||
}
|
||||
data = requests.post(url=uri, json=请求数据).json()
|
||||
print(data)
|
||||
config_id = pydash.get(obj=data, path="config_id")
|
||||
qr_code = pydash.get(obj=data, path="qr_code")
|
||||
|
||||
def 获取企业已配置的_联系我_列表(self, start时间戳):
|
||||
"""
|
||||
获取六果公司已经创建的全部的添加我联系我二维码 列表数据🆔
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token() # list_contact_way
|
||||
print(datetime(year=2026, month=1, day=1).timestamp())
|
||||
start时间戳 = int(datetime(year=2026, month=1, day=1).timestamp())
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/list_contact_way?access_token={wecom_token}"
|
||||
data = post(url=uri, json={"start_time": start时间戳}).json()
|
||||
print(data, "=========")
|
||||
return data
|
||||
|
||||
def 获取企业已配置的_联系我_方式(self, config_id: str):
|
||||
"""
|
||||
获取企业已配置的_联系我_方式
|
||||
:param config_id:
|
||||
:type config_id:
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_contact_way?access_token={wecom_token}"
|
||||
请求数据 = {"config_id": config_id}
|
||||
data = post(url=uri, json=请求数据).json()
|
||||
return data
|
||||
|
||||
def 更新企业已配置的_联系我_方式(self):
|
||||
"""
|
||||
更新企业配置的「联系我」二维码和「联系我」小程序按钮中的信息,如使用人员和备注等。
|
||||
请求方式:POST(HTTPS)
|
||||
请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/update_contact_way?access_token=ACCESS_TOKEN
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/update_contact_way?access_token={wecom_token}"
|
||||
# oy4Jw6A1T3WkKOOhMxcbQTDSM8rs
|
||||
请求示例数据 = {"config_id": "9b18a3ac534e236162a850f77bdd20d0", "remark": "渠道客户", "skip_verify": True, "style": 1, "state": "oy4Jw6A1T3WkKOOhMxcbQTDSM8rs", "type": 2,
|
||||
"user": ["YuanBao1975"],
|
||||
}
|
||||
data = post(url=uri, json=请求示例数据).json()
|
||||
print("更新企业已配置的_联系我_方式", data)
|
||||
|
||||
def 删除企业已配置的_联系我_方式(self, config_id: str):
|
||||
"""
|
||||
删除一个已配置的「联系我」二维码或者「联系我」小程序按钮。
|
||||
请求方式:POST(HTTPS)
|
||||
请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/del_contact_way?access_token=ACCESS_TOKEN
|
||||
"""
|
||||
print(config_id, type(config_id))
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/del_contact_way?access_token={wecom_token}"
|
||||
请求数据 = {"config_id": config_id}
|
||||
data = post(url=uri, json=请求数据).json()
|
||||
print(data, "==========")
|
||||
return data
|
||||
|
||||
def 结束临时会话(self):
|
||||
"""
|
||||
结束临时会话
|
||||
"""
|
||||
pass
|
||||
|
||||
def 结束语定义(self):
|
||||
"""
|
||||
结束语定义
|
||||
"""
|
||||
pass
|
||||
|
||||
def 最终处理完整的企微二维码信息(self, start时间戳):
|
||||
# 调用获取所有的 原先创建的 列表 得到 config_id
|
||||
config_id_list_data = self.获取企业已配置的_联系我_列表(start时间戳=start时间戳)
|
||||
contact_way = pydash.get(obj=config_id_list_data, path="contact_way")
|
||||
for configID in contact_way:
|
||||
config_id = pydash.get(obj=configID, path="config_id")
|
||||
data_详情数据 = self.获取企业已配置的_联系我_方式(config_id=config_id)
|
||||
qr_code = pydash.get(obj=data_详情数据, path="contact_way.qr_code")
|
||||
state = pydash.get(obj=data_详情数据, path="contact_way.state")
|
||||
userID = pydash.get(obj=data_详情数据, path="contact_way.user.0")
|
||||
remark = pydash.get(obj=data_详情数据, path="contact_way.remark")
|
||||
print(qr_code)
|
||||
wei_obj对象, wei_obj首次创建 = weiuser.objects.get_or_create(unionid=state)
|
||||
if wei_obj首次创建:
|
||||
# 当对象是首次创建时:需要更新一下数据
|
||||
wei_obj对象.user_绑定企微usrID账号 = userID
|
||||
wei_obj对象.codeConfigId = config_id
|
||||
wei_obj对象.codeQrCode = qr_code
|
||||
wei_obj对象.codeRemark = remark
|
||||
wei_obj对象.parent_id = "六果" # 如果是首次创建就需要将当前对象的父元素 默认为 六果公司
|
||||
wei_obj对象.user_企微角色权限 = "企微员工"
|
||||
wei_obj对象.user_省份 = self.addres_省
|
||||
wei_obj对象.user_城市 = self.address_市
|
||||
wei_obj对象.user_区县 = self.address_区县
|
||||
wei_obj对象.user_绑定企微UNIONID = state
|
||||
wei_obj对象.save()
|
||||
print("首次创建,并且数据库更新成功了")
|
||||
else:
|
||||
wei_obj对象.user_绑定企微usrID账号 = userID
|
||||
wei_obj对象.codeConfigId = config_id
|
||||
wei_obj对象.codeQrCode = qr_code
|
||||
wei_obj对象.codeRemark = remark
|
||||
wei_obj对象.user_企微角色权限 = miniUser用户角色().企微员工
|
||||
wei_obj对象.parent_id = wei_obj对象
|
||||
wei_obj对象.user_用户当前的等级 = 1
|
||||
wei_obj对象.user_省份 = self.addres_省
|
||||
wei_obj对象.user_城市 = self.address_市
|
||||
wei_obj对象.user_区县 = self.address_区县
|
||||
wei_obj对象.user_绑定企微UNIONID = state
|
||||
wei_obj对象.save()
|
||||
print("企微员的用户已经存在,并且更新了相关的信息")
|
||||
# 接着 查询所有的 父元素为当前对象的所有用户,再将绑定的二维码信息,更新为当前的对象
|
||||
weiuser.objects.filter(parent=wei_obj对象).update(codeConfigId=wei_obj对象.codeConfigId, user_绑定企微usrID账号=userID,
|
||||
codeQrCode=wei_obj对象.codeQrCode, codeRemark=wei_obj对象.codeRemark)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
#
|
||||
# resData = wecom客户联系_联系我_管理().获取企业已配置的_联系我_方式( config_id="bbc5220b82e614ceeff98fd9f2b04827" )
|
||||
# wecom客户联系_联系我_管理().获取企业已配置的_联系我_列表()
|
||||
start时间戳 = datetime(year=2026, month=1, day=1).timestamp()
|
||||
wecom客户联系_联系我_管理(addres_省="江苏省", address_市="泰州市", address_区县="海陵区").最终处理完整的企微二维码信息(start时间戳=start时间戳) # wecom客户联系_联系我_管理().删除企业已配置的_联系我_方式(config_id="13ee9dcd9a4f7a50ab0f293af90daf3c")
|
||||
@@ -0,0 +1,39 @@
|
||||
"""注释"""
|
||||
|
||||
from requests import get
|
||||
|
||||
from wechat_token.token工具包 import sixToken
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class wecom获取配置了客户联系功能的成员列表:
|
||||
"""
|
||||
获取配置了客户联系功能的成员列表
|
||||
最后更新:2023/12/01
|
||||
企业和第三方服务商可通过此接口获取配置了客户联系功能的成员列表。
|
||||
|
||||
请求方式:GET(HTTPS)
|
||||
请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_follow_user_list?access_token=ACCESS_TOKEN
|
||||
"""
|
||||
|
||||
|
||||
|
||||
@classmethod
|
||||
def 获取配置了客户联系功能的成员列表( cls ) -> dict:
|
||||
"""
|
||||
获取配置了客户联系功能的成员列表
|
||||
"""
|
||||
wecom_token = sixToken.get_wecom_token( )
|
||||
url = f"https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_follow_user_list?access_token={wecom_token}"
|
||||
data = get( url=url ).json( )
|
||||
print( data )
|
||||
return data
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print( wecom获取配置了客户联系功能的成员列表.获取配置了客户联系功能的成员列表( ) )
|
||||
@@ -0,0 +1,80 @@
|
||||
import base64
|
||||
import hashlib
|
||||
|
||||
import jmespath
|
||||
import xmltodict
|
||||
from Crypto.Cipher import AES
|
||||
from django.core.handlers.wsgi import WSGIRequest
|
||||
from rest_framework.request import Request
|
||||
|
||||
|
||||
class wecom设置接收事件服务器通讯录:
|
||||
"""https://work.weixin.qq.com/wework_admin/frame#apps/contactsApi"""
|
||||
# 跟认证目录下的功能是一样的(这里是留一个备份)
|
||||
token = "bVWt1PEUCG" # url验证的token(当前的值为江苏六果科技有限公司)
|
||||
EncodingAESKey = "LS6VsiJA6Vpb3nJlt34vMZFAbuKDJkFuH2KxuEXYuUR" # 配置的解密(当前的值为江苏六果科技有限公司)
|
||||
corp_id = "wwbe6369dc26a9d83a" # 企业微信🆔(当前的值为 江苏六果科技有限公司)
|
||||
corpsecret = "SIRyum7vQh-Bt36AxnqKMX0HIiE-zkYbjYgSat7reZw" # 企业微信 secret(当前的值为 江苏六果科技有限公司)
|
||||
|
||||
# phone_secret = "WNxZZdcU3FRS5msq_kHZaaZOBauBEjJZdQV3VrAxu0c" # 通讯录 secret
|
||||
|
||||
@classmethod
|
||||
def post解密推送消息体(cls, msg_content: bytes):
|
||||
""""""
|
||||
# 从XML中找到Encrypt标签的内容,即加密数据
|
||||
xmldict = xmltodict.parse(msg_content.decode())
|
||||
Encrypt = jmespath.search(data=xmldict, expression="xml.Encrypt", )
|
||||
# 将EncodingAESKey进行Base64解码,并补足填充字符'='
|
||||
AESKey = base64.b64decode(cls.EncodingAESKey + '=')
|
||||
|
||||
# 创建一个AES加密器对象,使用CBC模式和指定的初始化向量(IV)
|
||||
cipher = AES.new(key=AESKey, mode=AES.MODE_CBC, IV=AESKey[:16])
|
||||
# 对加密数据进行Base64解码
|
||||
aes_msg = base64.b64decode(Encrypt)
|
||||
# 使用解密器对象解密数据
|
||||
de_text = cipher.decrypt(plaintext=aes_msg)
|
||||
print(de_text)
|
||||
# 去除解密数据地前16个字节的随机字符串
|
||||
content = de_text[16:]
|
||||
# 解析前4个字节以获取XML内容的实际长度,并将其从网络字节序转换为主机字节序
|
||||
# xml_len = socket.ntohl(struct.unpack("I", content[:4])[0])
|
||||
xml_len = int.from_bytes(content[:4], byteorder='big')
|
||||
# 根据解析出的长度提取实际的XML内容
|
||||
xml_content = content[4: xml_len + 4]
|
||||
# 打印XML内容
|
||||
# 将XML内容解析为字典格式
|
||||
as_dict = xmltodict.parse(xml_input=xml_content)
|
||||
|
||||
# 打印解析后的字典
|
||||
return as_dict
|
||||
|
||||
@classmethod
|
||||
def get请求算法(cls, echostr):
|
||||
""""""
|
||||
AESKey = base64.b64decode(cls.EncodingAESKey + '=')
|
||||
aes_msg = base64.b64decode(echostr)
|
||||
aes = AES.new(key=AESKey, mode=AES.MODE_CBC, iv=aes_msg[:16])
|
||||
de_text = aes.decrypt(plaintext=aes_msg)
|
||||
content = de_text[16:] # 去掉前16随机字节
|
||||
# 取出4字节的msg_len
|
||||
xml_len = int.from_bytes(content[:4], byteorder='big')
|
||||
xml_content = content[4: xml_len + 4]
|
||||
return xml_content
|
||||
|
||||
@classmethod
|
||||
def get解密验证消息(cls, request: WSGIRequest | Request, ):
|
||||
"""接受微信发过来的get请求,拿到参数后解决,并且回复值,结果为验证成功"""
|
||||
GET_OBJ = request.query_params
|
||||
signature = jmespath.search(data=GET_OBJ, expression="msg_signature", )
|
||||
timestamp = jmespath.search(data=GET_OBJ, expression="timestamp", )
|
||||
nonce = jmespath.search(data=GET_OBJ, expression="nonce", )
|
||||
echostr = jmespath.search(data=GET_OBJ, expression="echostr", )
|
||||
# TODO:sorted([token, timestamp, nonce])这是就是对三个参数进行字典排序
|
||||
hashstr = ''.join(sorted([cls.token, timestamp, nonce, echostr, ])) # 这是就是对三个参数进行字典排序
|
||||
sig = hashlib.new(name="sha1", data=hashstr.encode()).hexdigest()
|
||||
if sig == signature:
|
||||
ret = cls.get请求算法(echostr)
|
||||
s = ret.decode().strip()
|
||||
return s
|
||||
else:
|
||||
raise Exception("没有验yghd成功")
|
||||
@@ -0,0 +1,99 @@
|
||||
import jmespath
|
||||
import requests
|
||||
from requests import post
|
||||
|
||||
from wechat_token.token工具包 import sixToken
|
||||
|
||||
|
||||
class 通讯录管理:
|
||||
"""注释"""
|
||||
|
||||
def 成员扩展属性(self):
|
||||
"""
|
||||
|
||||
"""
|
||||
pass
|
||||
"""
|
||||
成员自定义属性需要先在WEB管理端添加,见扩展属性添加方法,否则忽略未知属性的赋值。
|
||||
• 新增/更新:仅通讯录同步助手或第三方通讯录应用可以进行
|
||||
• 查询:代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||||
"""
|
||||
|
||||
def 创建成员(self):
|
||||
"""
|
||||
|
||||
"""
|
||||
pass
|
||||
|
||||
def 读取成员(self):
|
||||
"""
|
||||
|
||||
"""
|
||||
pass
|
||||
"""
|
||||
应用只能获取可见范围内的成员信息,且每种应用获取的字段有所不同,在返回结果说明中会逐个说明。企业通讯录安全特别重要,企业微信将持续升级加固通讯录接口的安全机制,以下是关键的变更点:
|
||||
从2022年6月20号20点开始,除通讯录同步以外的基础应用(如客户联系、微信客服、会话存档、日程等),以及新创建的自建应用与代开发应用,调用该接口时,不再返回以下字段:头像、性别、手机、邮箱、企业邮箱、员工个人二维码、地址,应用需要通过oauth2手工授权的方式获取管理员与员工本人授权的字段。
|
||||
【重要】从2022年8月15日10点开始,“企业管理后台 - 管理工具 - 通讯录同步”的新增IP将不能再调用此接口,企业可通过「获取成员ID列表」和「获取部门ID列表」接口获取userid和部门ID列表。查看调整详情。
|
||||
"""
|
||||
wecom_phone_token = sixToken.get_weom_phone_token()
|
||||
print(wecom_phone_token)
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/user/get"
|
||||
data = requests.get(url=uri, params={"access_token": wecom_phone_token, "userid": "HuDie_1"})
|
||||
print(data.json())
|
||||
|
||||
def 更新成员(self):
|
||||
"""
|
||||
|
||||
"""
|
||||
pass
|
||||
|
||||
def 删除成员(self):
|
||||
"""
|
||||
|
||||
"""
|
||||
pass
|
||||
|
||||
def 获取成员ID列表(self):
|
||||
"""
|
||||
|
||||
"""
|
||||
pass
|
||||
"""
|
||||
获取企业成员的userid与对应的部门ID列表,预计于2022年8月8号发布。若需要获取其他字段,参见「适配建议」。
|
||||
请求地址:https://qyapi.weixin.qq.com/cgi-bin/user/list_id?access_token=ACCESS_TOKEN
|
||||
"""
|
||||
|
||||
wecom_phone_token = sixToken.get_weom_phone_token()
|
||||
print(wecom_phone_token)
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/user/list_id"
|
||||
data = requests.post(url=uri, params={"access_token": wecom_phone_token})
|
||||
print(data.json())
|
||||
|
||||
def unionid与external_userid的关联(self):
|
||||
"""本接口自建应用是不能调用的,所以,本接口无效,仅限了服务商代开发或"""
|
||||
pass
|
||||
wecom_token = sixToken.get_wecom_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/idconvert/unionid_to_external_userid?access_token={wecom_token}"
|
||||
post_data = {
|
||||
"unionid": "oy4Jw6A1T3WkKOOhMxcbQTDSM8rs",
|
||||
"openid": "o6oV61xoMYAFNpi4RpVjn3BFGB1U",
|
||||
"subject_type": 0
|
||||
}
|
||||
data = post(url=uri, json=post_data).json()
|
||||
print(data)
|
||||
|
||||
@classmethod
|
||||
def userid转openid(cls):
|
||||
wecom_phone_token = sixToken.get_weom_phone_token()
|
||||
uri = f"https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid"
|
||||
data = requests.post(url=uri, params={"access_token": wecom_phone_token}, json={"userid": "YuanBao1975"})
|
||||
print(data.json())
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
通讯录管理().获取成员ID列表()
|
||||
# 通讯录管理.userid转openid()
|
||||
# 通讯录管理().unionid与external_userid的关联()
|
||||
# 通讯录管理().读取成员()
|
||||
Reference in New Issue
Block a user