2023年11月28日发(作者:)
微信⽹页版接⼝详解
本系列会讲述微信机器⼈技术的实现,第⼀讲主要了解微信⽹页版给我们提供的http接⼝,这⼀步是做⼀个基于微信⽹页版机器⼈的基础和难点。
本讲将微信⽹页版的主要接⼝罗列出,并给出了⼊参和返回值的含义和⽤法。⼀些不常⽤的接⼝后续会逐渐补充,也欢迎⼤家与我交流。
后⾯⼏讲将会在代码中探讨微信机器⼈的设计思路,欢迎⼤家持续关注。
⼀、⽹页版微信提供的HTTP接⼝
1、获取uuid
说明:⽤于获取显⽰⼆维码以及登录所需的uuid,标识获取⼆维码和扫码的为同⼀个⽤户
请求⽅式:GET
地址:
get参数:
参数⽰例值说明
funnew固定值
表⽰中⽂字符集langzh_CN
appidwx782c26e4c19acffb固定值
返回:
= 200; = "wb7R2kx9dA==";
2、显⽰⼆维码
说明:展⽰⼀张⽤于登陆的⼆维码图⽚,地址⾥的{uuid}传第⼀步所获取的uuid
请求⽅式:GET
地址:
get参数:
参数⽰例值说明
twebwx固定值
返回:⼆维码的⼆进制流,浏览器打开会直接显⽰⼀张⼆维码图⽚
3、轮询登录
说明:尝试登录。若此时⽤户⼿机已完成扫码并点击登录,则返回⼀个真正⽤于登录的url地址。否则接⼝⼤概10s后返回未扫码或未登录的状态码
请求⽅式:GET
地址:
get参数:
参数⽰例值说明
tip11:未扫描 0:⼀扫描
uuidwb7R2kx9dA==第⼀步所获取的uuid
返回:redirect_uri的值可以直接⽤于下⼀步的“登录并获取公参”请求
=200(408为未扫码,201为已扫码但未点击登录,200为成功登录);ct_uri="/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AfrMMbhsnElmA7xc1R9CWUq-@qrticket_0&uuid=4ZnG7WZ0Cg=
4、登录并获取公参
说明:访问后可获取⼀组公参,⽤于之后访问所有的接⼝。这也意味着如果这部分数据泄露,代表其他⼈可以在这段时间内随意操作你的微信(仅限于⽹页版⽀持的操作)
请求⽅式:GET
地址:
get参数:直接⽤上⼀步返回的redirect_uri中的所有参数即可
返回:获取并存储该返回值中的四个参数skey、wxsid、wxuin、pass_ticket,以及所返回Cookie中的webwx_data_ticket,webwx_auth_ticket
5、微信初始化
说明:初始化微信⾸页栏的联系⼈、公众号等(不是通讯录⾥的联系⼈),初始化登录者⾃⼰的信息(包括昵称等),初始化同步消息所⽤的SycnKey
请求⽅式:POST
地址:
get参数:
参数⽰例值说明
公参中
的值
pass_ticketqg%2BL%2BfjNnoHyqYsL3xj0KoNi5nqchsInPWWSxDwqCJ8%3D
post参数:(json格式)
{
BaseRequest: {
Uin: 211722515,
Sid: +urBrYI292xoIknf,
Skey: @crypt_8b4f09cc_a5871dc10130a48703b9afd5602152e4,
DeviceID: e545297464380306
上边的DeviceID可以⽤如下代码⽣成,每次登录过程中保持⼀致。String DeviceID = "e" + f(new Random().nextLong()).substring(1, 16);
}
}
返回:获取并存储该返回值中的四个参数skey、wxsid、wxuin、pass_ticket,以及所返回Cookie中的webwx_data_ticket,webwx_auth_ticket
{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
},
"HideInputBarFlag": 0,
"Sex": 0,
"Signature": "",
"VerifyFlag": 0,
"OwnerUin": 0,
"PYInitial": "WJCSZS",
"PYQuanPin": "wenjianchuanshuzhushou",
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"StarFriend": 0,
"AppAccountFlag": 0,
"Statues": 0,
"AttrStatus": 0,
"Province": "",
"City": "",
"Alias": "",
"SnsFlag": 0,
"UniFriend": 0,
"DisplayName": "",
"ChatRoomId": 0,
"KeyWord": "fil",
"EncryChatRoomId": "",
"IsOwner": 0
},
......此处省略剩下的10个联系⼈信息
],
"SyncKey": { 同步消息时⽤的syncKey,⽤于之后轮询消息的接⼝
"Count": 4,
"List": [{
"Key": 1,
"Val": 700722177
}, {
"Key": 2,
"Val": 700723184
}, {
"Key": 3,
"Val": 700723136
}, {
"Key": 1000,
"MemberList": [{
"Uin": 0,
"UserName": "@9c30c8d81e75a7eff0603cdd5de860b18fe92995845473fc2f0cda6ed76053cb",(微信随机码,潜规则:前⾯@为联系⼈,@@为群)
"NickName": "Nandi Wardhana",(联系⼈的微信昵称)
"HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=620986971&username=@9c30c8d81e75a7eff0603cdd5de860b18fe92995845473fc2f0cda6ed76053cb&skey=@crypt_8b4f09cc_1b827f84b1535b6be801f",
"ContactFlag": 3,
"MemberCount": 0,(如果是群,该字段表⽰成员数量)
"MemberList": [],(群成员列表)
"RemarkName": "",(备注名称,如果空则说明没有给他备注)
"HideInputBarFlag": 0,
"Sex": 1,(性别,1为男,2为⼥)
"Signature": "Stay ",(签名)
"VerifyFlag": 0,(⽤来判断是否是公众号或服务号的字段)
"OwnerUin": 0,
"PYInitial": "NANDIWARDHANA",
"PYQuanPin": "NandiWardhana",(名字拼⾳全拼)
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"StarFriend": 0,
"AppAccountFlag": 0,
"Statues": 0,
"AttrStatus": 2359303,
"Province": "Jakarta Raya",(省份)
"City": "",(城市)
"Alias": "",
"SnsFlag": 17,
"UniFriend": 0,
"DisplayName": "",(如果是群内成员,该字段表⽰群内名称)
"ChatRoomId": 0,
"KeyWord": "",
"EncryChatRoomId": "",(如果是群,该字段表⽰群的id,不同于微信随机码@@那个)
"IsOwner": 0
},
... 此处省略剩下770个联系⼈信息
]
}
7、批量获取联系⼈详情
说明:批量获取联系⼈详情,⼈或群均可。获取群详情主要是获取群内联系⼈列表。获取⼈详情主要是获取群内的某个⼈的详细信息。
请求⽅式:POST
地址:
get参数:
参数⽰例值说明
我也不知道这是
啥意思
pass_ticketyp5RfCpb%2FsNVex0Uepn1BWXNCYCqTfqe8NOYzan%2B4Y4%3D公参中的值
typeex
post参数:
{
get参数:
参数⽰例值说明
sid+FhlgkGS3wD/GKQw公参中的值
skey@crypt_8b4f09cc_1b827f84b1535b6be801f公参中的值
参考5中的⽣成⽅式deviceide5472
微信初始化后获取的4个key,这些key会
随着每次获取最新消息(参见9)后的返
synckey1_700722177|2_700724323|3_700724315|1000_1520925834
回值更新,其⽬的在于每次同步消息后记
录⼀个当前同步的状态。
uin211722515公参中的值
返回:
eck={retcode:"0",selector:"2"}
retcode
SUCCESS("0", "成功"),
TICKET_ERROR("-14", "ticket错误"),
PARAM_ERROR("1", "传⼊参数错误"),
NOT_LOGIN_WARN("1100", "未登录提⽰"),
NOT_LOGIN_CHECK("1101", "未检测到登录"),
COOKIE_INVALID_ERROR("1102", "cookie值⽆效"),
LOGIN_ENV_ERROR("1203", "当前登录环境异常,为了安全起见请不要在web端进⾏登录"),
TOO_OFEN("1205", "操作频繁");
selector
NORMAL("0", "正常"),
NEW_MSG("2", "有新消息"),
MOD_CONTACT("4", "有⼈修改了⾃⼰的昵称或你修改了别⼈的备注"),
ADD_OR_DEL_CONTACT("6", "存在删除或者新增的好友信息"),
ENTER_OR_LEAVE_CHAT("7", "进⼊或离开聊天界⾯");
9、获取最新消息
说明:当同步检查接⼝显⽰有新消息时,调⽤该接⼝获取具体的新消息。此处的新消息为⼴义的,包括消息,修改群名,群内成员变化,加好友等。
请求⽅式:POST
地址:
get参数:
参数⽰例值说明
sid+FhlgkGS3wD/GKQw公参中的值
skey@crypt_8b4f09cc_1b827f84b1535b6be801f公参中的值
uin211722515公参中的值
post参数:
{
"BaseRequest": {
"Uin": 211722515,
"Sid": "+FhlgkGS3wD/GKQw",
"Skey": "@crypt_8b4f09cc_1b827f84b1535b6be801f",
"DeviceID": "e308"
},
"SyncKey": {
"Count": 4,
"List": [{
"Key": 1,
"Val": 700722177
}, {
"Key": 2,
"Val": 700724323
}, {
"Key": 3,
"Val": 700724315
}, {
"Key": 1000,
"Val": 1520925834
}]
},
"rr": -508959981 f(-new Date().getTime() / 1000)
}
返回:主要有AddMsgList,ModContactList,DelContactList,新⼀轮消息同步的synckey
{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
},
"AddMsgCount": 1, 新增信息
"AddMsgList": [{
"MsgId": "320367", 服务端返回的消息id,可⽤于撤回接⼝参数。如果是图⽚,该参数还可以作为调⽤微信获取图⽚接⼝的参数之⼀。
"FromUserName": "@abf9affa7f0c0df3d1bf20", 发消息的⼈
"ToUserName": "@abf9affa7f0c0df3d1bf20", 发给谁
"MsgType": 51, 消息类型,1为⽂字,3为图⽚...,具体请参照消息类型表
"Content": "",
"Status": 3,
"ImgStatus": 1,
"CreateTime": 1520927383,
"VoiceLength": 0,
"PlayLength": 0,
"FileName": "",
"FileSize": "",
"MediaId": "",
"Url": "",
"AppMsgType": 0,
"StatusNotifyCode": 4,
"ForwardFlag": 0,
"AppInfo": {
"AppID": "",
"Type": 0
},
"HasProductId": 0,
"Ticket": "",
"ImgHeight": 0,
"ImgWidth": 0,
"SubMsgType": 0,
"NewMsgId": 320367,
"OriContent": "",
"EncryFileName": ""
}],
"ModContactCount": 0, 联系⼈修改
"ModContactList": [],
"DelContactCount": 0, 联系⼈删除
"DelContactList": [],
"ModChatRoomMemberCount": 0, 群内成员变动
"ModChatRoomMemberList": [],"ContinueFlag": 0,
"SyncKey": { 新⼀轮消息更新⽤这些SyncKey
"Count": 7,
"List": [{
"Key": 1,
"Val": 700722177
}, {
"Key": 2,
"Val": 700724325
}, {
"Key": 3,
"Val": 700724315
}, {
"Key": 11,
"Val": 700724093
}, {
"Key": 201,
"Val": 1520927383
}, {
"Key": 1000,
"Val": 1520925834
}, {
"Key": 1001,
"Val": 1520917874
}]
},
"SKey": "",
"SyncCheckKey": { 新⼀轮消息同步⽤这些Key
"Count": 7,
"List": [{
"Key": 1,
"Val": 700722177
}, {
"Key": 2,
"Val": 700724325
}, {
"Key": 3,
"Val": 700724315
}, {
"Key": 11,
"Val": 700724093
}, {
"Key": 201,
"Val": 1520927383
}, {
"Key": 1000,
"Val": 1520925834
}, {
"Key": 1001,
"Val": 1520917874
}]
}
}
10、创建群聊
略
11、修改群聊
略
12、发送消息
说明:发送⽂本消息(包括表情),不能发送图⽚或⽂件。
请求⽅式:POST
地址:
明参数⽰例值
公
参
pass_ticketyp5RfCpb%2FsNVex0Uepn1BWXNCYCqTfqe8NOYzan%2B4Y4%3D
中
的
值
post参数:
-----------------------------41184676334
Content-Disposition: form-data; name="id" 此处随意
WU_FILE_0
-----------------------------41184676334
Content-Disposition: form-data; name="name" 图⽚名称
-----------------------------41184676334
Content-Disposition: form-data; name="type" 图⽚类型
image/jpeg
-----------------------------41184676334
Content-Disposition: form-data; name="lastModifiedDate" 发送时间,该参数可⽆
Tue Jul 14 2009 13:32:31 GMT+0800
-----------------------------41184676334
Content-Disposition: form-data; name="size" 图⽚⼤⼩
845941
-----------------------------41184676334
Content-Disposition: form-data; name="chunks" 总共分多少批上传
2
-----------------------------41184676334
Content-Disposition: form-data; name="chunk" 当前是第⼏批
0
-----------------------------41184676334
Content-Disposition: form-data; name="mediatype" 当传图⽚时,此处写pic
pic
-----------------------------41184676334
Content-Disposition: form-data; name="uploadmediarequest"
{
"UploadType": 2, 固定为2
"BaseRequest": {
"Uin": 211722515,
"Sid": "+FhlgkGS3wD/GKQw",
"Skey": "@crypt_8b4f09cc_1b827f84b1535b6be801f",
"DeviceID": "e7876"
},
"ClientMediaId": 152,
"TotalLen": 845941, ⽂件⼤⼩
"StartPos": 0,
"DataLen": 845941, ⽂件⼤⼩
"MediaType": 4, 固定为4,表⽰图⽚
"FromUserName": "@abf9affa7f0c0df3d1bf20", 该参数可填可不填
"ToUserName": "filehelper", 该参数可填可不填
"FileMd5": "ba45c8f60456a672e003a875e469d0eb" 该参数随机⼀个uuid即可
MsgID3176647服务端返回的消息id
skey@crypt_8b4f09cc_1b827f84b1535b6be801f公参中的值
typeslave
该参数有则为缩略图,没有则为
原图
携带3个cookie的值:wxuin,wxsid,webwx_data_ticket
返回:图⽚的流
⼆、⼀些状态码code值的说明
1. BaseResponse⾥的Ret
SUCCESS("0", "成功"),
TICKET_ERROR("-14", "ticket错误"),
PARAM_ERROR("1", "传⼊参数错误"),
NOT_LOGIN_WARN("1100", "未登录提⽰"),
NOT_LOGIN_CHECK("1101", "未检测到登录"),
COOKIE_INVALID_ERROR("1102", "cookie值⽆效"),
LOGIN_ENV_ERROR("1203", "当前登录环境异常,为了安全起见请不要在web端进⾏登录"),
TOO_OFEN("1205", "操作频繁");
2. 同步消息检查返回值中retcode和selector
retcode
SUCCESS("0", "成功"),
TICKET_ERROR("-14", "ticket错误"),
PARAM_ERROR("1", "传⼊参数错误"),
NOT_LOGIN_WARN("1100", "未登录提⽰"),
NOT_LOGIN_CHECK("1101", "未检测到登录"),
COOKIE_INVALID_ERROR("1102", "cookie值⽆效"),
LOGIN_ENV_ERROR("1203", "当前登录环境异常,为了安全起见请不要在web端进⾏登录"),
TOO_OFEN("1205", "操作频繁");
selector
NORMAL("0", "正常"),
NEW_MSG("2", "有新消息"),
MOD_CONTACT("4", "有⼈修改了⾃⼰的昵称或你修改了别⼈的备注"),
ADD_OR_DEL_CONTACT("6", "存在删除或者新增的好友信息"),
ENTER_OR_LEAVE_CHAT("7", "进⼊或离开聊天界⾯");
3. 消息类型
TEXT(1, "⽂本消息类型"),
IMAGE(3, "图⽚消息"),
VOICE(34, "语⾳消息"),
VIDEO(43, "⼩视频消息"),
MICRO_VIDEO(62, "短视频消息"),
EMOTI_CON(47, "表情消息"),
MEDIA(49, "多媒体消息"),
VOIP_MSG(50, ""),
VOIP_NOTIFY(52, ""),
VOIP_INVITE(53, ""),
LOCATION(48, ""),
STATUS_NOTIFY(51, "状态通知,⾃⼰访问了某⼀个聊天页⾯"),
SYS_NOTICE(9999, ""),
POSSIBLE_FRIEND_MSG(40, ""),
VERIFY_MSG(37, "好友请求"),
SHARE_CARD(42, "分享名⽚"),
SYS(10000, "系统消息"),
RECALLED(10002, "撤回消息");
发布评论