Skip to content

Commit

Permalink
增加被动添加好友功能
Browse files Browse the repository at this point in the history
  • Loading branch information
yaphone committed Jun 28, 2017
1 parent 29b561b commit 4adcc1a
Show file tree
Hide file tree
Showing 11 changed files with 135 additions and 62 deletions.
63 changes: 59 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@

## 更新日志

- 2017-6-28:增加被动添加好友功能

- 2017-6-23:增加获取群好友昵称功能,修复已知问题。

- 2017-6-16:增加微信状态维护
Expand Down Expand Up @@ -242,7 +244,7 @@ src/main/java是itchat4j的项目源码,在src/test/java目录下有两个小D
}
```

### 图片消息
### 2.图片消息

```json
{
Expand Down Expand Up @@ -296,7 +298,7 @@ src/main/java是itchat4j的项目源码,在src/test/java目录下有两个小D
}
```

### 语音消息
### 3.语音消息

```Json
{
Expand Down Expand Up @@ -350,7 +352,7 @@ src/main/java是itchat4j的项目源码,在src/test/java目录下有两个小D
}
```

### 小视频消息
### 4.小视频消息

```Json
{
Expand Down Expand Up @@ -404,7 +406,7 @@ src/main/java是itchat4j的项目源码,在src/test/java目录下有两个小D
}
```

### 名片消息
### 5.名片消息

```Json
{
Expand Down Expand Up @@ -458,6 +460,59 @@ src/main/java是itchat4j的项目源码,在src/test/java目录下有两个小D
}
```

### 6.被动添加好友消息

```json
{
"SubMsgType": 0,
"VoiceLength": 0,
"FileName": "",
"ImgHeight": 0,
"ToUserName": "@5ce504de33c5105c599277b603e9d02c",
"HasProductId": 0,
"ImgStatus": 1,
"Url": "",
"ImgWidth": 0,
"ForwardFlag": 0,
"Status": 3,
"Ticket": "",
"RecommendInfo": {
"Ticket": "v2_7b244cf55b35daf113c16efb4db83ca0a38a4ca40a01a375d4f36b64fb7f597429495e333ebdb1673164fad0e0ec1aca1fbb90043d410360e29c2277caf7f8f1@stranger",
"UserName": "@8703fa509d1e91f2eb9d9b4e9a2946ded04d9ee1bba002908981270b75200b12",
"Sex": 2,
"AttrStatus": 102497,
"City": "南岸",
"NickName": "yaphone",
"Scene": 6,
"Province": "重庆",
"Content": "",
"Alias": "",
"Signature": "",
"OpCode": 2,
"QQNum": 0,
"VerifyFlag": 0
},
"CreateTime": 1498658433,
"NewMsgId": 1801473737376226000,
"MsgType": 37,
"groupMsg": false,
"MsgId": "1801473737376226019",
"StatusNotifyCode": 0,
"AppInfo": {
"Type": 0,
"AppID": ""
},
"AppMsgType": 0,
"PlayLength": 0,
"MediaId": "",
"Content": "<msg fromusername=\"wxid_a6p74rz9ovbz21\" encryptusername=\"v1_361333ea6e854479810494826e82e9e2a49fb0107ed702186afe900cc88470d94788df3e30945d5e46cf87edfc4dcbff@stranger\" fromnickname=\"yaphone\" content=\"\" shortpy=\"YAPHONE\" imagestatus=\"3\" scene=\"6\" country=\"CN\" province=\"Chongqing\" city=\"South Bank\" sign=\"\" percard=\"1\" sex=\"2\" alias=\"\" weibo=\"\" weibonickname=\"\" albumflag=\"0\" albumstyle=\"0\" albumbgimgid=\"\" snsflag=\"17\" snsbgimgid=\"http://mmsns.qpic.cn/mmsns/4376ae1e0cf0ccced233def9ad1560d0dec29d64941ab85a46d7c13c5df14f3338c7290aefc758d1960b91bbb372abf030e795b4c2d050f7/0\" snsbgobjectid=\"11749457640825893599\" mhash=\"\" mfullhash=\"\" bigheadimgurl=\"http://wx.qlogo.cn/mmhead/ver_1/rA30HUEYRfMW5Se0ib95ZT8XMY24IicxPY2QPblbK6UNzicwUIIE9CGmgKh4WOUuo8PLeAsPwiaNfLVGDOAOUADZ9VHOzyC8th7iavQwnCw3Fuos/0\" smallheadimgurl=\"http://wx.qlogo.cn/mmhead/ver_1/rA30HUEYRfMW5Se0ib95ZT8XMY24IicxPY2QPblbK6UNzicwUIIE9CGmgKh4WOUuo8PLeAsPwiaNfLVGDOAOUADZ9VHOzyC8th7iavQwnCw3Fuos/132\" ticket=\"v2_7b244cf55b35daf113c16efb4db83ca0a38a4ca40a01a375d4f36b64fb7f597429495e333ebdb1673164fad0e0ec1aca1fbb90043d410360e29c2277caf7f8f1@stranger\" opcode=\"2\" googlecontact=\"\" qrticket=\"\" chatroomusername=\"\" sourceusername=\"\" sourcenickname=\"\"><brandlist count=\"0\" ver=\"656202095\"></brandlist></msg>",
"StatusNotifyUserName": "",
"FromUserName": "fmessage",
"OriContent": "",
"FileSize": ""
}
```



## 如何使用
Expand Down
49 changes: 27 additions & 22 deletions src/main/java/cn/zhouyafeng/itchat4j/api/MessageTools.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.activation.MimetypesFileTypeMap;

import cn.zhouyafeng.itchat4j.utils.enums.StorageLoginInfoEnum;
import com.sun.xml.internal.bind.v2.TODO;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
Expand All @@ -24,6 +27,7 @@
import cn.zhouyafeng.itchat4j.core.Core;
import cn.zhouyafeng.itchat4j.utils.Config;
import cn.zhouyafeng.itchat4j.utils.MyHttpClient;
import cn.zhouyafeng.itchat4j.utils.enums.StorageLoginInfoEnum;
import cn.zhouyafeng.itchat4j.utils.enums.URLEnum;

/**
Expand Down Expand Up @@ -366,36 +370,37 @@ private static boolean webWxSendAppMsg(String userId, Map<String, String> data)

/**
* 被动添加好友
*
* @param core
* @param userName 对方用户名
* @param status 2 是添加 3是接受
* @param userName
* 对方用户名
* @param status
* 2 是添加 3是接受
* @param ticket
*/
public static void addFriend(Core core,String userName, Integer status,String ticket) {
public static void addFriend(Core core, String userName, Integer status, String ticket) {

String url = String.format(URLEnum.WEB_WX_VERIFYUSER.getUrl(),
core.getLoginInfo().get("url"),
String.valueOf(System.currentTimeMillis() / 3158L),
core.getLoginInfo().get("pass_ticket"));
String url = String.format(URLEnum.WEB_WX_VERIFYUSER.getUrl(), core.getLoginInfo().get("url"),
String.valueOf(System.currentTimeMillis() / 3158L), core.getLoginInfo().get("pass_ticket"));

List<Map<String,Object>> verifyUserList = new ArrayList<>();
Map<String,Object> verifyUser = new HashMap<String,Object>();
verifyUser.put("Value",userName);
verifyUser.put("VerifyUserTicket",ticket);
List<Map<String, Object>> verifyUserList = new ArrayList<Map<String, Object>>();
Map<String, Object> verifyUser = new HashMap<String, Object>();
verifyUser.put("Value", userName);
verifyUser.put("VerifyUserTicket", ticket);
verifyUserList.add(verifyUser);

List<Integer> sceneList = new ArrayList<>();
List<Integer> sceneList = new ArrayList<Integer>();
sceneList.add(33);

JSONObject body = new JSONObject();
body.put("BaseRequest", core.getParamMap().get("BaseRequest"));
body.put("Opcode",status);
body.put("VerifyUserListSize",1);
body.put("VerifyUserList",verifyUserList);
body.put("VerifyContent","");
body.put("SceneListCount",1);
body.put("SceneList",sceneList);
body.put("skey", (String) core.getLoginInfo().get(StorageLoginInfoEnum.skey.getKey()));
body.put("Opcode", status);
body.put("VerifyUserListSize", 1);
body.put("VerifyUserList", verifyUserList);
body.put("VerifyContent", "");
body.put("SceneListCount", 1);
body.put("SceneList", sceneList);
body.put("skey", core.getLoginInfo().get(StorageLoginInfoEnum.skey.getKey()));

String result = null;
try {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/cn/zhouyafeng/itchat4j/core/Core.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public static Core getInstance() {

private JSONObject userSelf; // 登陆账号自身信息
private List<JSONObject> memberList = new ArrayList<JSONObject>(); // 好友+群聊+公众号+特殊账号
private List<JSONObject> contactList = new ArrayList<JSONObject>();;// 好友
private List<JSONObject> contactList = new ArrayList<JSONObject>();// 好友
private List<JSONObject> groupList = new ArrayList<JSONObject>();; // 群
private Map<String, JSONArray> groupMemeberMap = new HashMap<String, JSONArray>(); // 群聊成员字典
private List<JSONObject> publicUsersList = new ArrayList<JSONObject>();;// 公众号/服务号
Expand Down
24 changes: 9 additions & 15 deletions src/main/java/cn/zhouyafeng/itchat4j/core/MsgCenter.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,8 @@
package cn.zhouyafeng.itchat4j.core;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;

import cn.zhouyafeng.itchat4j.utils.enums.StorageLoginInfoEnum;
import cn.zhouyafeng.itchat4j.utils.enums.URLEnum;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -98,7 +87,8 @@ public static JSONArray produceMsg(JSONArray msgList) {
JSONObject recommendInfo = m.getJSONObject("RecommendInfo");
String userName = recommendInfo.getString("UserName");
String ticket = recommendInfo.getString("Ticket");
MessageTools.addFriend(core,userName,3,ticket);
MessageTools.addFriend(core, userName, 3, ticket); // 确认添加好友
m.put("Type", MsgTypeEnum.VERIFYMSG.getType());

} else if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_SHARECARD.getCode())) { // 共享名片
m.put("Type", MsgTypeEnum.NAMECARD.getType());
Expand Down Expand Up @@ -166,6 +156,13 @@ public static void handleMsg(IMsgHandlerFace msgHandler) {
MessageTools.sendMsgById(result, core.getMsgList().get(0).getString("FromUserName"));
} else if (msg.getString("Type").equals(MsgTypeEnum.SYS.getType())) { // 系统消息
msgHandler.sysMsgHandle(msg);
} else if (msg.getString("Type").equals(MsgTypeEnum.VERIFYMSG.getType())) { // 确认添加好友消息
// 更新好友列表
core.getContactList().add(msg.getJSONObject("RecommendInfo"));

String result = msgHandler.verifyAddFriendMsgHandle(msg);
MessageTools.sendMsgById(result,
core.getMsgList().get(0).getJSONObject("RecommendInfo").getString("UserName"));
}
} catch (Exception e) {
e.printStackTrace();
Expand All @@ -182,7 +179,4 @@ public static void handleMsg(IMsgHandlerFace msgHandler) {
}
}




}
Original file line number Diff line number Diff line change
Expand Up @@ -70,4 +70,13 @@ public interface IMsgHandlerFace {
*/
public void sysMsgHandle(JSONObject msg);

/**
* 处理确认添加好友消息
*
* @date 2017年6月28日 下午10:15:30
* @param msg
* @return
*/
public String verifyAddFriendMsgHandle(JSONObject msg);

}
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ public void run() {
try {
JSONArray msgList = new JSONArray();
msgList = msgObj.getJSONArray("AddMsgList");
JSONArray modContactList = msgObj.getJSONArray("ModContactList"); // 存有删除或者新增的好友信息
JSONArray modContactList = msgObj.getJSONArray("ModContactList"); // 存在删除或者新增的好友信息
msgList = MsgCenter.produceMsg(msgList);
for (int j = 0; j < msgList.size(); j++) {
JSONObject msg = msgList.getJSONObject(j);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package cn.zhouyafeng.itchat4j.utils.enums;

import cn.zhouyafeng.itchat4j.utils.MsgCodeEnum;

/**
* 消息类型枚举类
*
Expand All @@ -14,7 +16,8 @@ public enum MsgTypeEnum {
VOICE("Voice", "语音消息"),
VIEDO("Viedo", "小视频消息"),
NAMECARD("NameCard", "名片消息"),
SYS("Sys", "系统消息");
SYS("Sys", "系统消息"),
VERIFYMSG("VerifyMsg", "添加好友");

private String type;
private String code;
Expand Down
25 changes: 7 additions & 18 deletions src/test/java/cn/zhouyafeng/itchat4j/demo/demo1/SimpleDemo.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@

import com.alibaba.fastjson.JSONObject;

import cn.zhouyafeng.itchat4j.api.WechatTools;
import cn.zhouyafeng.itchat4j.core.Core;
import cn.zhouyafeng.itchat4j.face.IMsgHandlerFace;
import cn.zhouyafeng.itchat4j.utils.enums.MsgTypeEnum;
import cn.zhouyafeng.itchat4j.utils.tools.DownloadTools;
Expand All @@ -27,24 +25,8 @@ public class SimpleDemo implements IMsgHandlerFace {

@Override
public String textMsgHandle(JSONObject msg) {
// String docFilePath = "D:/itchat4j/pic/1.jpg"; // 这里是需要发送的文件的路径
if (!msg.getBoolean("groupMsg")) { // 群消息不处理
// String userId = msg.getString("FromUserName");
// MessageTools.sendFileMsgByUserId(userId, docFilePath); // 发送文件
// MessageTools.sendPicMsgByUserId(userId, docFilePath);
String text = msg.getString("Text"); // 发送文本消息,也可调用MessageTools.sendFileMsgByUserId(userId,text);
LOG.info(text);
if (text.equals("111")) {
WechatTools.logout();
}
if (text.equals("222")) {
WechatTools.remarkNameByNickName("yaphone", "Hello");
}
if (text.equals("333")) { // 测试群列表
System.out.print(WechatTools.getGroupNickNameList());
System.out.print(WechatTools.getGroupIdList());
System.out.print(Core.getInstance().getGroupMemeberMap());
}
return text;
}
return null;
Expand Down Expand Up @@ -85,4 +67,11 @@ public void sysMsgHandle(JSONObject msg) { // 收到系统消息
LOG.info(text);
}

@Override
public String verifyAddFriendMsgHandle(JSONObject msg) {
String nickName = msg.getJSONObject("RecommendInfo").getString("NickName");
String text = "你好" + nickName + ", 欢迎添加我为好友!";
return text;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -95,4 +95,10 @@ public void sysMsgHandle(JSONObject msg) {
// TODO Auto-generated method stub
}

@Override
public String verifyAddFriendMsgHandle(JSONObject msg) {
// TODO Auto-generated method stub
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,10 @@ public static void main(String[] args) {
wechat.start(); // 启动服务,会在qrPath下生成一张二维码图片,扫描即可登陆,注意,二维码图片如果超过一定时间未扫描会过期,过期时会自动更新,所以你可能需要重新打开图片
}

@Override
public String verifyAddFriendMsgHandle(JSONObject msg) {
// TODO Auto-generated method stub
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,10 @@ public void sysMsgHandle(JSONObject msg) {
// TODO Auto-generated method stub
}

@Override
public String verifyAddFriendMsgHandle(JSONObject msg) {
// TODO Auto-generated method stub
return null;
}

}

0 comments on commit 4adcc1a

Please sign in to comment.