企业资讯
虎牙粉丝业务,qq空间说说赞20个平台,抖音业务秒刷网低价-抖音点赞连点器
自助下单地址(拼多多砍价,ks/qq/dy赞等业务):点我进入
1 技术实现原理
整个技术的实现原理如下图所示
本文不会教大家从零开始开发微信消息劫持,而是利用已有的第三方工具:pc-wechat-hook-http-api。 相关文档在这里。
需要说明的是,本工具基于微信3.6.0.18版本。 下载这个版本的微信后,直接覆盖安装,这样就可以保留之前的微信聊天记录了。
2.2 如何使用微信消息劫持工具?
首先去官网下载压缩包。 如果不知道如何从官网下载,可以直接拉到文末。
将HPSocket4C.dll文件复制到微信目录下(如E:TencentWeChat[3.6.0.18])
2.2.1 注入dll
点击Daen injector .exe文件:
在:
文件目录指的是微信安装路径,参考上图。 DLL路径是指DaenWxHook.dll文件的完整路径。 工艺参数可以默认直接使用。 其中,图中的8089是指本地用于接收微信实时消息的http服务器端口。 8055指的是dll开启的http服务器端口。 发送消息时,只需要向该端口发送数据即可。
点击注入启动,登录微信。 到这里就完成了微信消息的劫持,接下来就是尝试发送微信消息进行验证了。
2.2.2 发送微信消息
发送消息的方式是向指定端口发送HTTP请求。 具体端口值为上面注入dll工具中指定的8055。 如果用nodejs实现企业微信如何添加群聊机器人,post请求体如下:
function post(data, callback) {
var options = {
hostname: "127.0.0.1",
port: 8055,
path: "/DaenWxHook/client/",
method: "POST",
headers: {
"User-Agent": "apifox/1.0.0 (https://www.apifox.cn)",
"Content-Type": "application/json"
}
};
var req = http.request(options, function (res) {
var body = "";
res.setEncoding("utf8");
res.on("data", function (chunk) {
body += chunk;
});
res.on("end", function () {
var json = JSON.parse(body);
callback(json);
});
});
req.on("error", function (e) {
console.log("problem with request: " + e.message);
});
req.write(JSON.stringify(data));
req.end();
}
其中data为JSON类型。 其数据结构的具体形式可以参考官方文档或直接阅读本文提供的代码。
2.2.3 接收微信消息
接收微信消息也很方便。 只需要开一个http服务器,端口和dll注入一致即可。 例如2.2.1中规定了8089。 nodejs示例代码如下:
app.post("/wechat/", function (req, res) {
var data = req.body;
var type = data["type"];
if (type == "D0003") {
data = data["data"]
var msg = data["msg"]
var fromType = data["fromType"] // 1私聊, 2群聊, 3公众号
var from_wxid = data["fromWxid"]
var isRcv = data["msgSource"]==0 //0别人发,1自己发
if (fromType == 2) {
onRcvWXRoomMsg && onRcvWXRoomMsg(msg, from_wxid, isRcv)
} else if (fromType == 3) {
onGHZMsg && onGHZMsg(msg, from_wxid, isRcv);
} else if (fromType == 1) {
onRcvWXP2PMsg && onRcvWXP2PMsg(msg, from_wxid, isRcv);
}
}
res.send("");
});
app.listen(8089, function () {
console.log("正在监听微信消息");
});
3 第三方IM SDK接入
至此,我们就实现了微信消息的收发,接下来我们需要将这些消息实时转发到我们的app中。 如果从0开始去开发一个即时通讯App系统,工作量是巨大的。
我们仍然可以使用第三方平台。 网上有很多第三方IM平台,您可以选择自己熟悉的任何平台。 这里我选择了我比较熟悉的即时IM平台。
Instant IM SDK支持所有主流平台,包括flutter和uniapp两大跨平台框架,加速产品上线。 在消息安全审计方面,他们使用主流的第三方安全厂商的服务,基本可以支持需要的审计功能。
不仅支持基本的单聊/群聊功能,还支持高并发消息的房间聊天。 官网数据显示,单间人数可达百万以上,适用于对房间人数要求较高的场景。 此外,还有非常新颖的来电邀请功能企业微信如何添加群聊机器人,满足即时通讯的需求。
当然,对于个人开发者来说,最重要的还是要有足够的免费卖淫名额。 一方面,Instant IM提供的免费额度足够个人开发者使用;另一方面,如果以后有商业计划,可以非常方便的在线快速接入和构建IM产品
您可以先在即时控制台注册并添加应用,获取AppId和ServerSecret,如下图。
更多Instant Messaging IM SDK的使用介绍文档,请参考这里
3.1 通过微信收发消息
由于我们是针对windows版的微信收发消息,所以还必须在windows端接入即时IM,通过即时IM将数据转发给App。 目前windows上的即时IM只有一个C++版本的SDK,开发效率低。 为了更快的搭建我们的服务,作者将IM的网页版SDK做了兼容Nodejs运行环境,读者可以在文末直接获取。
关于Instant SDK的使用这里就不过多介绍了。 读者只需要注意一点:这是一个第三方IM平台。 我们用它来传递微信消息,方便我们在开发APP的时候实时获取微信消息。 在此处粘贴关键代码:
function initZego(onError, onRcvMsg, clientUId = "C123456", serverUId = "S123456") {
___clientUID = clientUId;
var token = newToken(serverUId);
var startTimestamp = new Date().getTime();
function _onError(zim, err) {
one rror(err);
}
function onRcvP2PMsg(zim, msgObj) {
var msgList = msgObj.messageList;
var fromConversationID = msgObj.fromConversationID;
msgList.forEach(function (msg) {
if (msg.timestamp - startTimestamp >= 0) { //过滤掉离线消息
console.log(msg)
onRcvMsg(msg, fromConversationID);
}
})
}
function onTokenWillExpire(zim, second) {
token = newToken(userId);
zim.renewToken(token);
}
var zim = createZIM(_onError, onRcvP2PMsg, onTokenWillExpire);
login(zim, serverUId, token, function (succ, data) {
if (succ) {
console.log("登录成功!")
} else {
console.log("登录失败!", data)
}
})
return zim;
}
需要注意的是,创建ZIM(ZIM)引擎时需要提供AppId,AppId必须是在ZIM控制台添加应用后自动获取的。
4 APP开发
App主要包含3个模块:聊天、通讯录、个人设置(包括聊天机器人、自动回复等)。 该应用程序需要与即时通讯 SDK 集成。 这里我就不细说了。 我相信官方网站比我说的要好。
4.1 聊天
聊天包括发送和接收微信消息,但所有的消息都被封装成即时IM消息。 我们为每条消息定义一个消息类型以供识别。 即IM中从windows终端收到的消息如下:
private void onRcvMsg(ArrayList messageList, String fromUserID) {
if (lsArr == null) return;
for (ZIMMessage zimMessage : messageList) {
if (zimMessage instanceof ZIMTextMessage) {
ZIMTextMessage zimTextMessage = (ZIMTextMessage) zimMessage;
if (zimMessage.getTimestamp() < this.startTime)
continue;
String uid = zimTextMessage.getSenderUserID();
if (!toUserId.equals(uid)) continue;
String json = zimTextMessage.message;
Msg msg = Msg.parseMsg(json);
for (MsgCenterListener l : lsArr) l.onRcvMsg(msg);
}
}
}
定义微信消息数据如下:
public class P2PMsg extends Msg {
@SerializedName("w")
public String wxid;
@SerializedName("tm")
public long time;
@SerializedName("m")
public String msg;
@SerializedName("r")
public boolean isRcv;
@Expose(serialize = false, deserialize = false)
public String remark;
public P2PMsg(String wxid, long time, String msg) {
this.type = Msg.TYPE_P2P_MSG;
this.wxid = wxid;
this.time = time;
this.msg = msg;
}
}
App端和windows端都使用P2PMsg定义的json格式数据,通过isRcv自动判断消息是接收消息还是发送消息。
对于windows端,收到P2PMsg消息后,根据其中指定的微信号转发消息。 对于App端,根据微信ID和isRecv字段,判断通话对象是谁,当前消息是接收还是发送。
4.2 联系人
接触获取方法比较简单。 在windows端获取联系人列表后,直接发送给App端。 但是需要注意的是,由于联系的量级可能非常大,如果一次性发送可能会因为消息体过大而导致消息传递失败。 所以我们分批发送联系方式:
function sendFriendListZego(msg) {
var pno = msg.pno;
var psize = 10
var max_pno = Math.ceil(WXFriendsList.length * 1.0 / psize);
var friendsList = [];
var json = "";
if (pno < 0) {
json = {
t: TYPE_FRIEND_LIST,
fl: [],
tt: WXFriendsList.length,
p: pno
};
sendSettings();
} else {
if (pno < max_pno - 1)
friendsList = WXFriendsList.slice(pno * psize, (pno + 1) * psize);
else
friendsList = WXFriendsList.slice(pno * psize, WXFriendsList.length);
json = {
t: TYPE_FRIEND_LIST,
fl: friendsList,
tt: max_pno,
p: pno
};
}
sendZegoMsg(JSON.stringify(json))
}
4.3 聊天机器人和自动回复聊天机器人
Chatbot 我们也是站在巨人的肩膀上,使用青云客提供的API来实现自动对话。 为了代码的简洁,我们以python为例。 读者也可以翻到文末获取nodejs版本的源码:
def talk_with_robot(msg, robot_name=None):
url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg={}".format(urllib.parse.quote(msg))
html = requests.get(url)
rt = html.json()["content"]
rt = rt.replace("{br}","
")
if robot_name is not None:
rt = rt.replace("菲菲", robot_name)
return rt