diff --git a/pom.xml b/pom.xml index 57013e9..f3cf9b0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.hotlcc wechat4j - 0.2.4 + 0.2.5 wechat4j Wechat client for Java. diff --git a/src/main/java/com/hotlcc/wechat4j/Wechat.java b/src/main/java/com/hotlcc/wechat4j/Wechat.java index 7dd7fff..9bc9296 100644 --- a/src/main/java/com/hotlcc/wechat4j/Wechat.java +++ b/src/main/java/com/hotlcc/wechat4j/Wechat.java @@ -1129,6 +1129,45 @@ public class Wechat { return getContactByRemarkName(false, remarkName); } + /** + * 获取联系人信息(根据多种名称) + * + * @param update 是否强制更新 + * @param userName 用户名(加密的) + * @param nickName 昵称 + * @param remarkName 备注 + * @return 返回数据 + */ + public UserInfo getContact(boolean update, String userName, String nickName, String remarkName) { + if (StringUtil.isNotEmpty(userName)) { + return getContactByUserName(update, userName); + } else if (StringUtil.isNotEmpty(nickName)) { + return getContactByNickName(update, nickName); + } else if (StringUtil.isNotEmpty(remarkName)) { + return getContactByRemarkName(update, remarkName); + } else { + return getLoginUser(update); + } + } + + public UserInfo getContact(String userName, String nickName, String remarkName) { + return getContact(false, userName, nickName, remarkName); + } + + /** + * 根据UserName获取联系人头像图片 + * + * @param userName 用户名(加密的) + * @return 返回数据 + */ + public byte[] getContactHeadImgByUserName(String userName) { + if (!StringUtil.isEmpty(userName)) { + return WebWeixinApiUtil.getContactHeadImg(httpClient, urlVersion, userName); + } else { + return WebWeixinApiUtil.getContactHeadImg(httpClient, urlVersion, getLoginUserName()); + } + } + /** * 发送文本消息 * @@ -1136,7 +1175,7 @@ public class Wechat { * @param content 文本消息内容 * @return 返回数据 */ - public JSONObject sendText(String userName, String content) { + public JSONObject sendTextToUserName(String userName, String content) { BaseRequest baseRequest = new BaseRequest(wxsid, skey, wxuin); String msgId = WechatUtil.createMsgId(); @@ -1165,7 +1204,7 @@ public class Wechat { */ public JSONObject sendTextToNickName(String nickName, String content) { if (StringUtil.isEmpty(nickName)) { - return sendText(null, content); + return sendTextToUserName(null, content); } UserInfo userInfo = getContactByNickName(false, nickName); @@ -1178,7 +1217,7 @@ public class Wechat { return null; } - return sendText(userName, content); + return sendTextToUserName(userName, content); } /** @@ -1190,7 +1229,7 @@ public class Wechat { */ public JSONObject sendTextToRemarkName(String remarkName, String content) { if (StringUtil.isEmpty(remarkName)) { - return sendText(null, content); + return sendTextToUserName(null, content); } UserInfo userInfo = getContactByRemarkName(false, remarkName); @@ -1203,7 +1242,7 @@ public class Wechat { return null; } - return sendText(userName, content); + return sendTextToUserName(userName, content); } /** @@ -1219,14 +1258,14 @@ public class Wechat { UserInfo userInfo; if (StringUtil.isNotEmpty(userName)) { - return sendText(userName, content); + return sendTextToUserName(userName, content); } else if (StringUtil.isNotEmpty(nickName)) { userInfo = getContactByNickName(false, nickName); } else if (StringUtil.isNotEmpty(remarkName)) { userInfo = getContactByRemarkName(false, remarkName); } else { String loginUserName = getLoginUserName(false); - return sendText(loginUserName, content); + return sendTextToUserName(loginUserName, content); } if (userInfo == null) { @@ -1236,7 +1275,7 @@ public class Wechat { if (StringUtil.isEmpty(userName)) { return null; } - return sendText(userName, content); + return sendTextToUserName(userName, content); } /** @@ -1248,7 +1287,7 @@ public class Wechat { * @param contentType 媒体文件类型 * @return 返回数据 */ - public JSONObject sendImage(String userName, byte[] mediaData, String mediaName, ContentType contentType) { + public JSONObject sendImageToUserName(String userName, byte[] mediaData, String mediaName, ContentType contentType) { String loginUserName = getLoginUserName(false); String toUserName = StringUtil.isEmpty(userName) ? loginUserName : userName; BaseRequest baseRequest = new BaseRequest(wxsid, skey, wxuin); @@ -1295,10 +1334,10 @@ public class Wechat { * @param image 图片文件 * @return 返回数据 */ - public JSONObject sendImage(String userName, File image) { + public JSONObject sendImageToUserName(String userName, File image) { ContentType contentType = FileUtil.getContentType(image); byte[] mediaData = FileUtil.getBytes(image); - return sendImage(userName, mediaData, image.getName(), contentType); + return sendImageToUserName(userName, mediaData, image.getName(), contentType); } /** @@ -1312,7 +1351,7 @@ public class Wechat { */ public JSONObject sendImageToNickName(String nickName, byte[] mediaData, String mediaName, ContentType contentType) { if (StringUtil.isEmpty(nickName)) { - return sendImage(null, mediaData, mediaName, contentType); + return sendImageToUserName(null, mediaData, mediaName, contentType); } UserInfo userInfo = getContactByNickName(false, nickName); @@ -1325,7 +1364,7 @@ public class Wechat { return null; } - return sendImage(userName, mediaData, mediaName, contentType); + return sendImageToUserName(userName, mediaData, mediaName, contentType); } /** @@ -1352,7 +1391,7 @@ public class Wechat { */ public JSONObject sendImageToRemarkName(String remarkName, byte[] mediaData, String mediaName, ContentType contentType) { if (StringUtil.isEmpty(remarkName)) { - return sendImage(null, mediaData, mediaName, contentType); + return sendImageToUserName(null, mediaData, mediaName, contentType); } UserInfo userInfo = getContactByRemarkName(false, remarkName); @@ -1365,7 +1404,7 @@ public class Wechat { return null; } - return sendImage(userName, mediaData, mediaName, contentType); + return sendImageToUserName(userName, mediaData, mediaName, contentType); } /** @@ -1392,19 +1431,18 @@ public class Wechat { * @param contentType 媒体文件类型 * @return 返回数据 */ - public JSONObject sendImage(String userName, String nickName, String remarkName - , byte[] mediaData, String mediaName, ContentType contentType) { + public JSONObject sendImage(String userName, String nickName, String remarkName, byte[] mediaData, String mediaName, ContentType contentType) { UserInfo userInfo; if (StringUtil.isNotEmpty(userName)) { - return sendImage(userName, mediaData, mediaName, contentType); + return sendImageToUserName(userName, mediaData, mediaName, contentType); } else if (StringUtil.isNotEmpty(nickName)) { userInfo = getContactByNickName(false, nickName); } else if (StringUtil.isNotEmpty(remarkName)) { userInfo = getContactByRemarkName(false, remarkName); } else { String loginUserName = getLoginUserName(false); - return sendImage(loginUserName, mediaData, mediaName, contentType); + return sendImageToUserName(loginUserName, mediaData, mediaName, contentType); } if (userInfo == null) { @@ -1414,7 +1452,7 @@ public class Wechat { if (StringUtil.isEmpty(userName)) { return null; } - return sendImage(userName, mediaData, mediaName, contentType); + return sendImageToUserName(userName, mediaData, mediaName, contentType); } /** @@ -1441,7 +1479,7 @@ public class Wechat { * @param contentType 媒体文件类型 * @return 返回数据 */ - public JSONObject sendVideo(String userName, byte[] mediaData, String mediaName, ContentType contentType) { + public JSONObject sendVideoToUserName(String userName, byte[] mediaData, String mediaName, ContentType contentType) { String loginUserName = getLoginUserName(false); String toUserName = StringUtil.isEmpty(userName) ? loginUserName : userName; BaseRequest baseRequest = new BaseRequest(wxsid, skey, wxuin); @@ -1488,10 +1526,10 @@ public class Wechat { * @param video 视频文件 * @return 返回数据 */ - public JSONObject sendVideo(String userName, File video) { + public JSONObject sendVideoToUserName(String userName, File video) { ContentType contentType = FileUtil.getContentType(video); byte[] mediaData = FileUtil.getBytes(video); - return sendVideo(userName, mediaData, video.getName(), contentType); + return sendVideoToUserName(userName, mediaData, video.getName(), contentType); } /** @@ -1505,7 +1543,7 @@ public class Wechat { */ public JSONObject sendVideoToNickName(String nickName, byte[] mediaData, String mediaName, ContentType contentType) { if (StringUtil.isEmpty(nickName)) { - return sendVideo(null, mediaData, mediaName, contentType); + return sendVideoToUserName(null, mediaData, mediaName, contentType); } UserInfo userInfo = getContactByNickName(false, nickName); @@ -1518,7 +1556,7 @@ public class Wechat { return null; } - return sendVideo(userName, mediaData, mediaName, contentType); + return sendVideoToUserName(userName, mediaData, mediaName, contentType); } /** @@ -1545,7 +1583,7 @@ public class Wechat { */ public JSONObject sendVideoToRemarkName(String remarkName, byte[] mediaData, String mediaName, ContentType contentType) { if (StringUtil.isEmpty(remarkName)) { - return sendVideo(null, mediaData, mediaName, contentType); + return sendVideoToUserName(null, mediaData, mediaName, contentType); } UserInfo userInfo = getContactByRemarkName(false, remarkName); @@ -1558,7 +1596,7 @@ public class Wechat { return null; } - return sendVideo(userName, mediaData, mediaName, contentType); + return sendVideoToUserName(userName, mediaData, mediaName, contentType); } /** @@ -1589,14 +1627,14 @@ public class Wechat { UserInfo userInfo; if (StringUtil.isNotEmpty(userName)) { - return sendVideo(userName, mediaData, mediaName, contentType); + return sendVideoToUserName(userName, mediaData, mediaName, contentType); } else if (StringUtil.isNotEmpty(nickName)) { userInfo = getContactByNickName(false, nickName); } else if (StringUtil.isNotEmpty(remarkName)) { userInfo = getContactByRemarkName(false, remarkName); } else { String loginUserName = getLoginUserName(false); - return sendVideo(loginUserName, mediaData, mediaName, contentType); + return sendVideoToUserName(loginUserName, mediaData, mediaName, contentType); } if (userInfo == null) { @@ -1606,7 +1644,7 @@ public class Wechat { if (StringUtil.isEmpty(userName)) { return null; } - return sendVideo(userName, mediaData, mediaName, contentType); + return sendVideoToUserName(userName, mediaData, mediaName, contentType); } /** diff --git a/src/main/java/com/hotlcc/wechat4j/util/WebWeixinApiUtil.java b/src/main/java/com/hotlcc/wechat4j/util/WebWeixinApiUtil.java index 8782739..65c9f0b 100644 --- a/src/main/java/com/hotlcc/wechat4j/util/WebWeixinApiUtil.java +++ b/src/main/java/com/hotlcc/wechat4j/util/WebWeixinApiUtil.java @@ -565,6 +565,42 @@ public final class WebWeixinApiUtil { } } + /** + * 获取联系人头像 + * + * @param httpClient http客户端 + * @param urlVersion url版本号 + * @param username 用户名 + * @return 头像图片数据 + */ + public static byte[] getContactHeadImg(HttpClient httpClient, + String urlVersion, + String username) { + try { + String url = new ST(PropertiesUtil.getProperty("webwx-url.webwxgetheadimg_url")) + .add("urlVersion", urlVersion) + .add("seq", System.currentTimeMillis()) + .add("username", username) + .render(); + + HttpGet httpGet = new HttpGet(url); + + HttpResponse response = httpClient.execute(httpGet); + int statusCode = response.getStatusLine().getStatusCode(); + if (HttpStatus.SC_OK != statusCode) { + throw new RuntimeException("响应失败(" + statusCode + ")"); + } + + HttpEntity entity = response.getEntity(); + byte[] headImgData = EntityUtils.toByteArray(entity); + + return headImgData; + } catch (Exception e) { + log.error("获取联系人头像图片异常", e); + return null; + } + } + /** * 从服务端同步新数据 * diff --git a/src/main/java/com/hotlcc/wechat4j/util/WechatUtil.java b/src/main/java/com/hotlcc/wechat4j/util/WechatUtil.java index a1b7323..1d809a1 100644 --- a/src/main/java/com/hotlcc/wechat4j/util/WechatUtil.java +++ b/src/main/java/com/hotlcc/wechat4j/util/WechatUtil.java @@ -56,21 +56,4 @@ public final class WechatUtil { } return synckey.toString(); } - - /** - * 根据ContentType得到微信上传所需的mediatype - * - * @param contentType contentType - * @return 微信上传所需的mediatype - */ - public static String getMediatype(String contentType) { - if (contentType == null) { - return "doc"; - } - if (contentType.indexOf("image") >= 0) { - return "pic"; - } else { - return "doc"; - } - } } diff --git a/src/main/resources/META-INF/wechat4j/webwx-url.properties b/src/main/resources/META-INF/wechat4j/webwx-url.properties index d686c57..9b34b4d 100644 --- a/src/main/resources/META-INF/wechat4j/webwx-url.properties +++ b/src/main/resources/META-INF/wechat4j/webwx-url.properties @@ -1,3 +1,6 @@ +# 0、全局 +## 0.1、Web微信host +webwx-url.webwxhost_url=https://wx.qq.com # 1、登录 ## 1.1、获取微信uuid webwx-url.uuid_url=https://login.wx.qq.com/jslogin?appid=&fun=new&lang=zh_CN&_=<_> @@ -23,6 +26,8 @@ webwx-url.synccheck_url=https://webpush.wx.qq.com/cgi-bin/mmwebwx-bi webwx-url.getcontact_url=https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=&r=&seq=0&skey= ## 3.2、批量获取指定联系人列表 webwx-url.batchgetcontact_url=https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact?type=ex&r=&lang=zh_CN&pass_ticket= +## 3.3、获取联系人头像 +webwx-url.webwxgetheadimg_url=https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=&username= # 4、收发消息 ## 4.1、从服务端拉取新消息 webwx-url.webwxsync_url=https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=&skey=&pass_ticket= diff --git a/src/test/java/TestClass.java b/src/test/java/TestClass.java index bc9c395..7519ee3 100644 --- a/src/test/java/TestClass.java +++ b/src/test/java/TestClass.java @@ -9,6 +9,9 @@ import org.junit.Before; import org.junit.Test; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; public class TestClass { private Wechat wechat; @@ -29,19 +32,41 @@ public class TestClass { } public void testSendText() { - JSONObject result = wechat.sendText(null, "这是消息内容"); + JSONObject result = wechat.sendTextToUserName(null, "这是消息内容"); System.out.println(result); } - @Test public void testSendImage() { File file = null; JSONObject result = null; file = new File("C:\\Users\\Administrator\\Pictures\\壁纸\\9e5f4981099bcf351e0ec18c3654aced.jpg"); - result = wechat.sendImage(null, file); + result = wechat.sendImageToUserName(null, file); file = new File("C:\\Users\\Administrator\\Videos\\手机QQ视频_20190416170016.mp4"); - result = wechat.sendVideo(null, file); + result = wechat.sendVideoToUserName(null, file); System.out.println(result); while (true) CommonUtil.threadSleep(5000); } + + @Test + public void testGetImageData() { + byte[] data = wechat.getContactHeadImgByUserName(null); + FileOutputStream fos = null; + try { + fos = new FileOutputStream("D:\\a.jpg"); + fos.write(data); + fos.flush(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } }