微信自动发送消息接口开发(二)
上一篇讲到OAuth鉴权成功,接下去就是监听微信消息的接口了.
成功登陆后,通过抓包和源码查看分析,主要有用到的监听新消息的接口有以下几个:
1. 微信登录初始化列表: webwxinit
微信登录后会立即调用的一个接口,用来初始化一些列表数据,比方说常用联系人列表,广告推送等
这个接口是一个POST接口,传参是一个json对象,注意BaseRequest
这个对象存的是oauth鉴权返回的一些值,很多地方都会用到,下面是我做的封装,可以参考一下:
public class BaseRequest
{
WXModel _model;
public BaseRequest(WXModel model)
{
this._model = model;
}
public string DeviceID { get { return "e" + DateTime.Now.Ticks; } }
public string Sid { get { return _model.wxsid; } }
public string Skey { get { return _model.skey; } }
public string Uin { get { return _model.wxuin; } }
}
注意这个接口返回的Content-Type不是很标准,是text/plain 并且没有跟charset字符集,微信整套接口用的全部都是UTF-8,和我一样用HttpHelper的人可能要手动设置一下获取编码,否则获取下来的会和谷歌开发环境的数据一样是乱码.
微信几个接口都存在这样的问题,不再一一叙述
2. 微信获取联系人列表详情: webwxgetcontact
webwxgetcontact是一个Get接口,用来获取联系人内容,没有什么好多说的,参数中r取随机值,其他的在之前鉴权内容中都有返回.
3. 微信获取群组列表详情: webwxbatchgetcontact
POST请求,除了有BaseRequest外,再给一个List是要请求的UserName,在一开始的webwxinit接口返回的ChatSet中可以得到,源码是对ChatSet过滤了已经存在的常用个联系人,请求剩下的所有群联系人
4. 微信检查是否有新的数据: synccheck
GET请求 里面其他没什么好说的,值得注意的是synckey 这个参数在init的时候会返回外,每次更新数据的时候也会有,要记得每次请求接口对应更新synckey里面的值.
请求当返回的是window.synccheck={retcode:"0",selector:"0"}
则表示没有新的数据更新,其他都是要更新新的消息.
下面是我对synckey的封装.
public class KeyModel
{
public int Key { get; set; }
public long Val { get; set; }
public override string ToString()
{
return Key + "_" + Val;
}
}
public class SyncKey
{
public List<KeyModel> List { get; set; }
public int Count { get { return List?.Count ?? 0; } }
public override string ToString()
{
if (List == null || List.Count == 0) return "";
return string.Join("|", List);
}
}
5. 微信同步新的消息 webwxsync
POST请求 最重要的一个请求,用来同步更新新的消息.
请求参数其他也没什么好说的,主要通过SyncKey来确定这一次需要更新的内容.rr是一个随机数.
里面返回的json中 AddMsgList是新的消息列表,剩下的ModContactList,DelContactList,ModChatRoomMemberList我没有仔细研究.应该就是字面的意思:群人员变动,群删除,群基本信息变动等.
注意这里会返回SyncKey ,需要更新最新的SyncKey.
成功监听到微信消息:(接口中还有不少值,我的监听程序并没有去解析,具体可去看对应接口)
源码中消息返回type展示:
/*
MSGTYPE_TEXT: 1,
MSGTYPE_IMAGE: 3,
MSGTYPE_VOICE: 34,
MSGTYPE_VIDEO: 43,
MSGTYPE_MICROVIDEO: 62,
MSGTYPE_EMOTICON: 47,
MSGTYPE_APP: 49,
MSGTYPE_VOIPMSG: 50,
MSGTYPE_VOIPNOTIFY: 52,
MSGTYPE_VOIPINVITE: 53,
MSGTYPE_LOCATION: 48,
MSGTYPE_STATUSNOTIFY: 51,
MSGTYPE_SYSNOTICE: 9999,
MSGTYPE_POSSIBLEFRIEND_MSG: 40,
MSGTYPE_VERIFYMSG: 37,
MSGTYPE_SHARECARD: 42,
MSGTYPE_SYS: 1e4,
MSGTYPE_RECALLED: 10002, // 撤销消息*/