常玩qq的人应该知道qq群里可以引入一个“聊天机器人”qq小冰,而后可以在群里通过@qq小冰来达到调戏的目的
然而尿性的腾讯除了qq之外还有微信这样一款聊天的软件
本文目的就是注册一个微信号(来作为我们的机器人),将其拉到微信群里然后通过艾特的功能来实现个人聊天或者客服的目的
做为一个不合格的软开,怎么能不用别人的轮子呢(手动斜眼笑)
ok,给出轮子链接https://github.com/cncoder/WeChatBotJava(用Java语言来实现的)
通过这个轮子可以登陆你的微信,获取联系人、监听消息并自动回复
我们的功能是基于此轮子进行的修改
闲话少说
找到类me.biezhi.wechat.service.WechatServiceImpl,其getContact(WechatMeta)方法是用来获取联系人的
此方法中循环处理memberlist过滤其中公告号、群聊等账号,拿到所有用户contactList
因为我们的目的是实现群聊机器人,因此定义群聊联系人groupList并在群聊的判断语句里将当前contact加入到list中
循环结束后将该list注入wechatContact中去
getContact()方法最后调用了私有的getGroup()方法,起初不懂这是要干嘛,后来见名知意发现这个就是用来获取群联系人的(group嘛)
重写该方法,调用微信的webwxbatchgetcontact api,关于该api的具体使用可以自行百度
下面是该方法的代码
/**
* 获取群成员
* @param wechatMeta
* @param wechatContact
*/
private void getGroup(WechatMeta wechatMeta, WechatContact wechatContact) {
String url = wechatMeta.getBase_uri() + "/webwxbatchgetcontact?"
+"type=ex"
+"&r=" +DateKit.getCurrentUnixTime()
+"&lang=zh_CN"
+"&pass_ticket="+wechatMeta.getPass_ticket();
JSONObject body = new JSONObject();
JSONArray groupList = wechatContact.getGroupList();
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
body.put("BaseRequest", wechatMeta.getBaseRequest());
body.put("Count", groupList.size());
for (int i = 0; i < groupList.size(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("UserName", groupList.get(i).asJSONObject().getString("UserName"));
map.put("EncryChatRoomId", "");
list.add(map);
}
body.put("List", list);
HttpRequest request = HttpRequest.post(url).contentType("application/json;charset=utf-8")
.header("Cookie", wechatMeta.getCookie()).send(body.toString());
LOGGER.debug(request.toString());
String res = request.body();
request.disconnect();
if (StringKit.isBlank(res)) {
throw new WechatException("获取群信息失败");
}
LOGGER.debug(res);
try {
JSONObject jsonObject = JSONKit.parseObject(res);
JSONObject BaseResponse = jsonObject.get("BaseResponse").asJSONObject();
if (null != BaseResponse) {
int ret = BaseResponse.getInt("Ret", -1);
if (ret == 0) {
JSONArray contactList = jsonObject.get("ContactList").asArray();
if (null != contactList) {
groupList = new JSONArray();
for (int i = 0, len = contactList.size(); i < len; i++) {
JSONObject contact = contactList.get(i).asJSONObject();
if (contact.getString("UserName").indexOf("@@") != -1) {
JSONArray memberList =contact.get("MemberList").asArray();
for(JSONValue value:memberList) {
groupList.add(value);
}
}
}
wechatContact.setGroupList(groupList);
}
}
}
} catch (Exception e) {
throw new WechatException(e);
}
}
(注意1:groupLIst在这段代码中出现两次,第一次是JSONArray groupList = wechatContact.getGroupList();这里的groupList是群的相关信息,比如群名字,群成员列表等,第二次出现时在groupList.add(value);这里的groupLIst得到的就是群聊中所有成员的信息,包括昵称、用户名、群昵称等
注意2:在实际使用中可能发现这个wechatContact.getGroupList();得到的groupList为空,或者value里没有你想要的群的消息,这是因为这里得到的是被保存在通讯录里的群的列表,打开微信的某个群,在“聊天信息”里有一个“保存到通讯录”功能,这里开关要打开,然后才能获取到里面的值)
拿到了群成员列表之后,岂不就可以为所欲为了吗^_^
上文说到获得的groupList中的每个元素都对应着群中的一个成员,本项目中需要使用的属性为DisplayName和NickName,其中DisplayName为群昵称,就是设置的在这个群的昵称&#