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的值可以直接⽤于下⼀步的登录并获取公参请求

=200408为未扫码,201为已扫码但未点击登录,200为成功登录);ct_uri="/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AfrMMbhsnElmA7xc1R9CWUq-@qrticket_0&uuid=4ZnG7WZ0Cg=

4、登录并获取公参

说明:访问后可获取⼀组公参,⽤于之后访问所有的接⼝。这也意味着如果这部分数据泄露,代表其他⼈可以在这段时间内随意操作你的微信(仅限于⽹页版⽀持的操作)

请求⽅式:GET

地址:

get参数:直接⽤上⼀步返回的redirect_uri中的所有参数即可

返回:获取并存储该返回值中的四个参数skeywxsidwxuinpass_ticket,以及所返回Cookie中的webwx_data_ticketwebwx_auth_ticket

0

@crypt_8b4f09cc_a5871dc10130a48703b9afd5602152e4

+urBrYI292xoIknf

211722515

qg%2BL%2BfjNnoHyqYsL3xj0KoNi5nqchsInPWWSxDwqCJ8%3D

1

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);

}

}

返回:获取并存储该返回值中的四个参数skeywxsidwxuinpass_ticket,以及所返回Cookie中的webwx_data_ticketwebwx_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

微信初始化后获取的4key,这些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)

}

返回:主要有AddMsgListModContactListDelContactList,新⼀轮消息同步的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

该参数有则为缩略图,没有则为

原图

携带3cookie的值:wxuinwxsidwebwx_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. 同步消息检查返回值中retcodeselector

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, "撤回消息");