发送消息的后台逻辑
从手机微信,PC微信,发送文本消息、图片消息、语音等消息,首要的一步:选择你要发送消息的具体对象,实际就是选择你通讯录里面的好友(包括好友,群)。但真正微信后台的处理,是用到了微信的一个类似身份证号码的ID,即 wxid。
下图是一个微信通讯录好友的数据结构(非完整版):
在发消息的时候,我们选择的对象是:老张学技术。而微信后台,是把老张学技术所对应的wxid找到,用这个wxid作为发送消息的第一个参数。即,你要发给谁?
了解了上面这个逻辑后,我们一定得拿到通讯录每个名字对应的wxid。所以,接下来,我们一起来看,怎么获取到通讯录好友信息,尤其是获取对应的wxid的信息。
获取通讯录好友信息
通讯录好友的获取,在PC微信里有两种处理方式,一种是HOOK微信启动时载入通讯录好友信息的地址;另外一种,通过直接读取微信存放在内存里面的数据。这个事实上不用关心,必备软件已经处理好了,我们调用相应接口即可。
http代码示例(javascript)
const rp = require('request-promise');
const url = 'http://127.0.0.1:5555';
const TXT_MSG = 555;
function getid()
{
const id = Date.now();
return id.toString();
}
/**get_contact_list 获取好友和群列表
*
*/
async function get_contact_list()
{
const options={
url: url+'/api/getcontactlist'
};
let data = await rp(options);
const j = JSON.parse(data);
return j;
}
/**
* send txt message
*/
async function sendtxt()
{
const options =
{
url: url+'/api/sendtxtmsg',
qs:
{
id: getid(),
type: TXT_MSG,
wxid: 'filehelper',
content: '一起来唱海阔天空!'
}
};
let data = await rp(options);
const j = JSON.parse(data);
return j;
}
async function main()
{
const j = await get_contact_list();
console.log(j);
}
main();
执行程序后,控制台会把通讯录所有好友列表打印出来(json格式),里面包含了最重要的信息:名字和wxid的对应关系。有了这个对应,你就可以很轻易地进行消息发送了。
说明:获取通讯录好友信息支持http和websocket两种方式。
代码优化
老手一眼就能看出,这个代码必须优化:
async function sendtxt()
{
const options =
{
url: url+'/api/sendtxtmsg',
qs:
{
id: getid(),
type: TXT_MSG,
wxid: 'filehelper',
content: '一起来唱海阔天空!'
}
};
let data = await rp(options);
const j = JSON.parse(data);
return j;
}
在上面代码中,wxid和content都是固定写好的。对上面的代码,做个简单的优化,优化后如下:
async function sendtxt(wxid,content)
{
const options =
{
url: url+'/api/sendtxtmsg',
qs:
{
id: getid(),
type: TXT_MSG,
wxid: wxid,
content: content
}
};
let data = await rp(options);
const j = JSON.parse(data);
return j;
}
是不是更友好了?
代码地址
答疑解惑
如有相关问题,可加微信好友进行答疑(暗号:bot),二维码如下:
更多文章
请关注公众号,及时查看更多推送文章: