【SDK调用文档】
<pre><code>/* 企业微信连接回调函数 */
@clientID: 企业微信客户端唯一ID,通过这个ID区分不同的客户端
typedef void (__stdcall *WXCmdConnectCallback) (unsigned int clientID);
/* 企业微信数据回调函数 */
@clientID: 企业微信客户端唯一ID
@jsonData: 企业微信返回的 Json数据
@dataSize: 企业微信返回的 Json数据长度
typedef void (__stdcall *WXCmdReceiveCallback) (unsigned int clientID, const char *jsonData, size_t dataSize);
/* 企业微信退出回调函数 */
@clientID:企业微信客户端唯一ID
typedef void (__stdcall *WXCmdQuitCallback) (unsigned int clientID);
/* 1.初始化Socket接口,只需要执行一次 */
@WXCmdConnectCallback: 企业微信连接回调函数指针
@WXCmdReceiveCallback: 企业微信数据回调函数指针
@WXCmdQuitCallback: 企业微信退出回调函数指针
WXCmdError __stdcall WXCmdInitSocket(WXCmdConnectCallback, WXCmdReceiveCallback, WXCmdQuitCallback);
/* 2.1 初始化企微客户端安装路径,只需要执行一次。可以不使用此函数,此时会使用企微默认安装路径 */
@weworkInstallPath: 企微客户端在磁盘上的完整路径, 可以传空字符串
WXCmdError __stdcall WXCmdInitWeworkInstallPath(const char *weworkInstallPath);
/* 2.2 初始化注入端Dll接口,只需要执行一次 */
@dllPath: 注入端dll在磁盘上的完整路径,必传
WXCmdError __stdcall WXCmdInitDllPath(const char *dllPath);
/* 3.运行控制端服务,只需要执行一次 */
WXCmdError __stdcall WXCmdRun();
/* 4 打开一个企业微信客户端,可以多次调用,每调用一次就能打开一个客户端。
接受一个参数paramlist,需要按照格式传入参数,
包括[设置登录ID]、[是否关闭子进程节约内存资源]、[是否携带一个客户参数用于扫码和登录成功时返回] */
@paramlist: 格式为: key1=value1&amp;key2=value2&amp;key3=value3 ,可以设置一个或多个参数
其中key可以取以下几个值:
1. appid 授权验证appid,必须设置该值;
2. sdkkey 授权验证sdkkey, 必须设置该值;
3. login_user_id 设置登录ID,此时该接口相当于4.2;
例如 login_user_id=1688801548589452
4. customer_param 设置客户参数, 在扫码和登录成功、以及获取自己信息时,会原样返回这个参数;
5. close_sub_process 设置关闭子进程, 例如 close_sub_process=1。关闭子进程可以节约很多内存资源,但是此时无法使用企微自带的web服务,包括微盘、内部小程序应用的使用;
如果要同时设置多个参数使用&amp;连接这几个参数
WXCmdError __stdcall WXCmdOpenWechatWithParam(const char* paramlist);
@示例:
WXCmdOpenWechatWithParam(&quot;close_sub_process=0&amp;customer_param=hhhhh&amp;login_user_id=1688850383085170&amp;appid=a8427d96387b2b42e1d8a54a19be81c4&amp;sdkkey=78c2c900-2ebe-d9e6-ec6b-fc4ea1b220ca&quot;);
/* 5.注入已经打开的企业微信进程。尽量用4这个接口 */
@wechatPid: 企业微信进程Pid
WXCmdError __stdcall WXCmdInjectWechatProcess(unsigned int wechatPid);
/* 6.给某个企业微信客户端发送数据 */
@clientID: 企业微信客户端ID
@jsonData: jsonData数据
WXCmdError __stdcall WXCmdSend(unsigned int clientID, const char *jsonData);
/* 7.程序退出时调用此接口 */
WXCmdError __stdcall WXCmdStop();</code></pre>
<p><strong>Python调用Demo</strong></p>
<pre><code>#-*- coding: utf-8 -*-
# 企业微信基础操作
# ERIC SUN 2020-9-24
from ctypes import *
import os,json,time
C_ID = 0
wxloaderInstance = 0
def c_string(data):
return c_char_p(data.encode(&#039;utf-8&#039;))
# 回调函数
@WINFUNCTYPE(None,c_ulong)
def connect_callback(client_id):
print(u&#039;新的客户端连接: &#039;)
global C_ID
C_ID = client_id
print(client_id)
@WINFUNCTYPE(None, c_ulong, c_char_p, c_ulong)
def recv_callback(client_id, data, length):
jsonData = json.loads(data);
if jsonData[&#039;type&#039;] == 500:
return
print(&#039;[on_recv] client_id: {0}, message:{1}&#039;.format(client_id, json.loads(data)))
if jsonData[&#039;type&#039;] == 15001:
jd = {}
wxloaderInstance.sendMessage(C_ID, 2000, jd)
@WINFUNCTYPE(None, c_ulong)
def close_callback(client_id):
C_ID = 0
print(u&#039;已断开&#039;)
print(client_id)
class WeCom:
# 加载器
WXLOADER = None
dll_path = &#039;&#039;
def __init__(self, dll_path):
self.dll_path = dll_path
# 控制库地址
loader_path = os.path.join(self.dll_path, &#039;WXCommand_wxwork.dll&#039;)
loader_path = os.path.realpath(loader_path)
# 注入库地址
inject_path = os.path.join(self.dll_path, &#039;VXWorkElf_v3.1.1.3002_release.dll&#039;)
inject_path = os.path.realpath(inject_path)
self.WXLOADER = WinDLL(loader_path)
self.WXLOADER.WXCmdInitDllPath(c_string(inject_path))
out = create_string_buffer(20)
self.WXLOADER.WXCmdGetLocalWechatVersion(out, 20)
print(u&#039;版本号:&#039; + out.value.decode(&#039;utf-8&#039;))
# 初始化socket连接
self.WXLOADER.WXCmdInitSocket(connect_callback, recv_callback, close_callback)
# 运行
self.WXLOADER.WXCmdRun()
# self.WXLOADER.WXCmdStop()
# 打开一个企业微信,此时会自动注入 VXWorkElf_v3.1.1.3002_release.dll 到企业微信
def openWechatClient(self):
print(u&#039;open wechat:&#039;)
self.WXLOADER.WXCmdOpenWechat()
# 发送消息
def sendMessage(self, client_id, message_type, params):
print(u&#039;send message:&#039;)
send_data = {&#039;type&#039;: message_type, &#039;data&#039;: params}
return self.WXLOADER.WXCmdSend(client_id, c_string(json.dumps(send_data, ensure_ascii=False)))
#return self.WXLOADER.WXCmdSend(client_id, c_string(json.dumps(send_data)))
#return self.WXLOADER.WXCmdSend(client_id, json.dumps(send_data, ensure_ascii=False, encoding=&#039;utf-8&#039;))
if __name__ == &quot;__main__&quot;:
wxloaderInstance = WeCom(&#039;F:\\逆向\\Dll测试_成品\\vxwork_3.1.1.3002_release\\Dll&#039;)
print(&#039;命令:\n&#039;
&#039;1: 打开企业微信\n&#039;
&#039;2000: 获取自己的信息\n&#039;
&#039;2001: 获取好友的信息\n&#039;
&#039;2500: 获取内部联系人列表\n&#039;
&#039;2501: 获取外部联系人列表\n&#039;
&#039;2502: 获取群聊列表\n&#039;
&#039;3000: 搜索手机号好友\n&#039;
&#039;5000: 发送文本消息(utf-8)\n&#039;
&#039;5003: 发送图片消息\n&#039;
&#039;5008: 发送小程序\n&#039;
)
while True:
str = input(&quot;请输入命令:&quot;)
if str == &#039;&#039;:
continue
cmd = int(str)
data = {}
if cmd == 1:
wxloaderInstance.openWechatClient()
continue
elif cmd == 2503:
roomID = input(&#039;请输入群聊ID:&#039;)
data = {
&#039;room_chat_id&#039;: roomID
}
elif cmd == 3000:
mobile = input(&#039;请输入手机号:&#039;)
data = {
&#039;mobile&#039;: mobile
}
elif cmd == 5000:
chatID = input(&#039;请输入会话ID: &#039;)
content = input(&#039;请输入文本内容: &#039;)
data = {
&#039;conversation_id&#039;: chatID,
&#039;content&#039;: content
}
elif cmd == 5001:
content = input(&#039;请输入文本内容: &#039;)
data = {
&#039;conversation_id&#039;: &quot;R:10696051717463132&quot;,
&#039;content&#039;: [
{
&#039;subtype&#039;: 1,
&#039;text&#039;: &#039;7881301953921102&#039;
},
{
&#039;subtype&#039;: 0,
&#039;text&#039;: &#039;精灵&#039;
}
]
}
elif cmd == 5003:
chatID = input(&#039;请输入会话ID: &#039;)
path = input(&#039;请输入图片路径: &#039;)
data = {
&#039;conversation_id&#039;: chatID,
&#039;path&#039;: path
}
elif cmd == 5008:
chatID = input(&#039;请输入会话ID: &#039;)
username = input(&#039;请输入小程序username(以@app结尾的字符串): &#039;)
appid = input(&#039;请输入appid(以wx开头的字符串): &#039;)
pagepath = input(&#039;请输入pagepath: &#039;)
title = input(&#039;请输入标题: &#039;)
des = input(&#039;请输入描述: &#039;)
thumburl = input(&#039;请输入图标(网络图片url): &#039;)
icon = input(&#039;请输入小程序展示图路径(本地图片): &#039;)
data = {
&#039;conversation_id&#039;: chatID,
&#039;username&#039;: username,
&#039;appid&#039;: appid,
&#039;pagepath&#039;: pagepath,
&#039;title&#039;: title,
&#039;des&#039;: des,
&#039;thumburl&#039;: thumburl,
&#039;icon&#039;: icon,
&#039;displaytype&#039;: 2
}
wxloaderInstance.sendMessage(C_ID, cmd, data)</code></pre>