ConversationContentServiceImpl.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. package com.kede.wechat.service.impl;
  2. import com.kede.common.dao.ChatMsgMapper;
  3. import com.kede.common.dao.ChatMsgOptimizeMapper;
  4. import com.kede.common.enums.WechatSmgTypeEnum;
  5. import com.kede.common.model.ChatMsg;
  6. import com.kede.common.model.ChatMsgOptimize;
  7. import com.kede.common.model.ChatMsgUser;
  8. import com.kede.common.utils.DateUtils;
  9. import com.kede.common.utils.HttpUtils;
  10. import com.kede.common.utils.RSAEncrypt;
  11. import com.kede.common.utils.StringUtils;
  12. import com.kede.core.mybatis.BaseMybatisDao;
  13. import com.kede.wechat.bo.ChatMsgUserBo;
  14. import com.kede.wechat.bo.InputChatMsg;
  15. import com.kede.wechat.bo.InputGetChatName;
  16. import com.kede.wechat.bo.InputgetUserMsg;
  17. import com.kede.wechat.service.ConversationContentService;
  18. import com.tencent.wework.Finance;
  19. import org.json.JSONArray;
  20. import org.json.JSONObject;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import org.springframework.beans.factory.annotation.Value;
  24. import org.springframework.data.redis.core.RedisTemplate;
  25. import org.springframework.stereotype.Service;
  26. import com.kede.common.dao.ChatMsgUserMapper;
  27. import javax.annotation.Resource;
  28. import java.io.File;
  29. import java.io.FileOutputStream;
  30. import java.io.UnsupportedEncodingException;
  31. import java.util.*;
  32. import java.util.stream.Collectors;
  33. import static sun.plugin2.os.windows.OSVERSIONINFOA.size;
  34. @Service("ConversationContentService")
  35. public class ConversationContentServiceImpl extends BaseMybatisDao<ChatMsgUserMapper> implements ConversationContentService {
  36. static String hnPriKey ="-----BEGIN PRIVATE KEY-----\n" +
  37. "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCnh5N/kiyeNx/y\n" +
  38. "dDKe3FO8HWj8tuQQUCkCc8ol1Sqmcs9ey7S2189UDbZOPeY2xiiMD6AdFVUK5Y0P\n" +
  39. "gbX/XZFVizhwXseE+1IV1k0w3C++5Y4Zll7nZoJ05ANMbj+dlamAlNYOutmc0lZf\n" +
  40. "CGXM5oeu+U0XDWE1+uY7TRAGV3OcA7GBraXiothncbkNf0ZwfBEGVyLNHcNODgwz\n" +
  41. "ECc0KJuEF2V+UAt11HloT60atSmdiktwbJ6KOJ62TM/eU+F/5d3UJLdw0Xb8kEFn\n" +
  42. "PYK/1mD8PGKFA6F0wSajNLc6iPg5mgiOS5j02N2+nEN8m7vIdL7Hd0yrigf5kEdl\n" +
  43. "x9PC7OYpAgMBAAECggEAIUhSCVok+xnAgw6Kr/zdtdWx8eLz1DnYq+ANHQ8IdiEB\n" +
  44. "Cbg2osylJ/HBcjHh9qfPjmPcT2rZhlysdZQzcBRKt0/9WnW59bVoTWZR148m/Snl\n" +
  45. "3Td+i0JWUJqr/Rc6FDiTgDQRgsOkT/+JoT+t2dNCyYRFyHqkAXFjJAzfTiM5mJjg\n" +
  46. "h8q7bU/LXoc49kuaNYmt5rV1nACoIh7MmKZpmR4OKXDWrl52Xt5qCEonp3bAH/S3\n" +
  47. "HaTqsoqot7fF5aZWEuDWUeYQPzgVSsdw2k9Lq1c8aoE15IRfQCxtBOYpk8LEDJty\n" +
  48. "JIGHrzBEHP7cok4UdBWbfuI1YjqmjefQovQumKqfcQKBgQDlXDrFFvx+k9pUI2bo\n" +
  49. "KXcqroOcpdsssO5uJOG1PwuM02wIR0hP1d89fItFwLLuzjb+jeyN3qwFgoh21fkk\n" +
  50. "Z3HkxubMY4fpXk1mAsTPUZxll8YYgGE7tXk1Rk5xsBMzlFRW88N7Ww/rQMBOlpJA\n" +
  51. "6UfZGFYMezb1vXf7u3M4w/N22wKBgQC6/OF5DsCHAOui8CPXS2z2YTKuoOJmHKIe\n" +
  52. "vBeXy+ic+YRuTBXgA0Z1wL4xDW/LeCqoTmetbTuvGSyahMV4QSK0pxH9gk80sH4+\n" +
  53. "YEza3DLASxr4gSsr2fL6siuXN/OHyMClQb6JVa0yuPG1zLzShaIXYVAyz1m9rU1B\n" +
  54. "JpQfbEV8SwKBgGnBDvAVWzLZ5Y9qC2b8x4+Mi+7MorSGmEl9A/1YJnE2gteGVpdJ\n" +
  55. "G/fz1xvAcECgIMdalToM8/BOcbGpk4jvkZpVA9I2ClLWQoXIvQqCrMRDKPnfJ/Yq\n" +
  56. "BMtFsaHF9/SObhzxpK7aHAry/ji+QI1hgtlc2UBEB+FjDVGq6sO/xiCFAoGAV/3Y\n" +
  57. "PJdskhskx7AprY6Y3/gtWW/sGhEvWTc6Avy5oeTpJN45DQl9hrwExCCGk0EhEcKT\n" +
  58. "l1Dn3SYDj1MbedNs+YYFOT6w9yJ2xfObNwKX/1VYg8iFAEW3ybE+QhLaTvNxdFLT\n" +
  59. "zty6fDv7wolt8cNg24+3pbFdkZyT1izJV2Aj8rECgYBZQMObUgJ57n8FrXCdcdSa\n" +
  60. "MGsFYl8KUZa1zvzhoi3h7YtbVNNtSHcEK7VDyIheBt9pFCN7nuDX3jW2XYW2USEC\n" +
  61. "T7Pab2DAXPkRmXspWNID21G+AqqGSLD4pk9+ZmqevTfAtI+ajiu5NH1guH73rVOM\n" +
  62. "xGjQ5dCmWpUGt4fmO+zWIw==\n" +
  63. "-----END PRIVATE KEY-----";
  64. static String pubKey ="-----BEGIN PUBLIC KEY-----\n" +
  65. "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp4eTf5Isnjcf8nQyntxT\n" +
  66. "vB1o/LbkEFApAnPKJdUqpnLPXsu0ttfPVA22Tj3mNsYojA+gHRVVCuWND4G1/12R\n" +
  67. "VYs4cF7HhPtSFdZNMNwvvuWOGZZe52aCdOQDTG4/nZWpgJTWDrrZnNJWXwhlzOaH\n" +
  68. "rvlNFw1hNfrmO00QBldznAOxga2l4qLYZ3G5DX9GcHwRBlcizR3DTg4MMxAnNCib\n" +
  69. "hBdlflALddR5aE+tGrUpnYpLcGyeijietkzP3lPhf+Xd1CS3cNF2/JBBZz2Cv9Zg\n" +
  70. "/DxihQOhdMEmozS3Ooj4OZoIjkuY9NjdvpxDfJu7yHS+x3dMq4oH+ZBHZcfTwuzm\n" +
  71. "KQIDAQAB\n" +
  72. "-----END PUBLIC KEY-----";
  73. Logger logger = LoggerFactory.getLogger(ConversationContentServiceImpl.class);
  74. @Value(value = "${conversationContent.corpid}")
  75. private String hnCorpId;
  76. @Value(value = "${conversationContent.secret}")
  77. private String hnSecret;
  78. @Value(value = "${conversationContent.app.secret}")
  79. private String hnAppSecret;
  80. @Value(value = "${conversationContent.nm.corpid}")
  81. private String nmCorpid;
  82. @Value(value = "${conversationContent.nm.secret}")
  83. private String nmSecret;
  84. @Value(value = "${conversationContent.nm.app.secret}")
  85. private String nmAppSecret;
  86. @Value(value = "${upload.path}")
  87. private String uploadPath;
  88. @Resource
  89. private RedisTemplate redisTemplate;
  90. @Resource
  91. private ChatMsgUserMapper chatMsgUserMapper;
  92. @Resource
  93. private ChatMsgMapper chatMsgMapper;
  94. @Resource
  95. private ChatMsgOptimizeMapper chatMsgOptimizeMapper;
  96. /**
  97. * 获取会话内容
  98. * @param pageSeq
  99. * @param pageLimit
  100. * @param days 获取天数,比如-2, 那就是获取当前天数-2的日期,那么获取数据就是前天开始到当前日期的数据
  101. * @return
  102. */
  103. @Override
  104. public Map<String,Object> pushChatData(Integer pageSeq, Integer pageLimit,Integer days,Integer type) {
  105. String message = null;
  106. Map<String,Object> map = new HashMap<>();
  107. List<InputChatMsg> list = new ArrayList<>();
  108. Integer total = 0;
  109. long sdk = Finance.NewSdk();
  110. String corpId =null;
  111. String secret =null;
  112. String priKey =null;
  113. if (type==0){
  114. corpId = hnCorpId;
  115. secret = hnSecret;
  116. priKey = hnPriKey;
  117. }else if (type==1){
  118. corpId = nmCorpid;
  119. secret = nmSecret;
  120. priKey = nmAppSecret;
  121. }
  122. System.out.println(Finance.Init(sdk, corpId, secret));
  123. long ret = 0;
  124. int seq = 0;
  125. int limit = 200;
  126. if (pageSeq != null || pageLimit!=null){
  127. seq=pageSeq;
  128. limit = pageLimit;
  129. }
  130. long slice = Finance.NewSlice();
  131. ret = Finance.GetChatData(sdk, seq, limit, null, null, 3, slice);
  132. if (ret != 0) {
  133. System.out.println("getchatdata ret " + ret);
  134. }
  135. String getchatdata = Finance.GetContentFromSlice(slice);
  136. JSONObject jo = new JSONObject(getchatdata);
  137. JSONArray chatdata = jo.getJSONArray("chatdata");
  138. total=chatdata.length();
  139. System.out.println("消息数:" + total);
  140. Date earlyToday = DateUtils.getEarlyToday();
  141. Date date = DateUtils.getDateBefore(earlyToday, days);
  142. for (int i = 0; i < chatdata.length(); i++) {
  143. String item = chatdata.get(i).toString();
  144. // item:{
  145. // "publickey_ver":1,
  146. // "encrypt_chat_msg":"XSeHr+qM0YfX/q5WWvmnVEuL2E4U0RclkIbK9JnWQq7Y/0Ynir3srKh+9DH6BqRj/NYXKmUC65+0WRo
  147. // QboW3dC200XTqVNj+z0kljl11HdNmjuS3p7g0L+DYG5Bdz6Lo8FuHf/5WkOVi/R5VxOO6FvU+PediEOSCBN2dVHCeyIvExCk5mh
  148. // o+ME9QV/Q19HujmHpxzl3cu1XvBAZ7YvIpd2d/BCCI9JwmBc5bXr2FQ0r/PFkZadKGjw0cxqPyNIBkNc+ic0wHhWSZFTvY3qDW2
  149. // FFAdkYW68w8PA5f+8gD9VUuxKzz/j3Fu/6547Ayyuo93lPtbud5lAWXyeLexyHujFmdr300MA44BoYZsuTqdVsHbtEGLw967kO1
  150. // oHcImidD416ZuQh2VZiOYTJMtDZALdB1tXramb7kFj0AsKloFLKeg3ks3TYRKwEmM9wJ/y2hGDJzq5xncBFFShbLao5u",
  151. // "msgid":"1634016854685227651_1749628622146_external",
  152. // "encrypt_random_key":"kJ3XJM7CB7DGZqFxSfT8+EDWfr8vZmVVKzKLl5FM47Sd7iUSlgZF/a4dm5sTpCMW3uzk/m1LZV4odH
  153. // RyVO2+AaVJsidMoLV2LmmWiCAuXkzdK4yDbGItkvpZGrilgAlJjR8EhsUuqXOjvxkUemGvKMhrUqKdCaO4p3GYT/cxMRJDUmrP0v
  154. // TQqdgwznQOSubbBFDdMTSAfEtZnGp5tOQdCNFCbIqks4/Y8Isd/nd/Kq3QNsXjE+GdZkqVuOqRujOeCeqFRJF022i2KFuJQ+R+7X
  155. // 1es92NKBbaNT1AlRNfjtACH1KrPRLlEnmAS0EUIWWmn45/kOpH3T4ovOuNDnrafw==",
  156. // "seq":1}
  157. JSONObject data = new JSONObject(item);
  158. String encrypt_random_key = data.getString("encrypt_random_key");
  159. String encrypt_chat_msg = data.getString("encrypt_chat_msg");
  160. long msg = Finance.NewSlice();
  161. try {
  162. message = RSAEncrypt.decryptRSA(encrypt_random_key, priKey);
  163. ret = Finance.DecryptData(sdk, message, encrypt_chat_msg, msg);
  164. if (ret != 0) {
  165. System.out.println("getchatdata ret " + ret);
  166. // return;
  167. }
  168. String str = String.valueOf(Finance.GetContentFromSlice(msg));
  169. System.out.println("getwep="+str);
  170. com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(str);
  171. String msgtype = jsonObject.getString("msgtype");
  172. InputChatMsg chatMsg = new InputChatMsg(jsonObject,type);
  173. System.out.println(chatMsg.getMsgtime());
  174. if (chatMsg.getMsgtime().getTime()>date.getTime()){
  175. //处理数据
  176. ChatMsgOptimize chatMsgOptimize = chatMsgOptimizeMapper.selectById(chatMsg.getMsgid());
  177. if (chatMsgOptimize==null){
  178. chatMsgOptimize = new ChatMsgOptimize();
  179. chatMsgOptimize.setMsgid(chatMsg.getMsgid());
  180. chatMsgOptimize.setMsgtime(chatMsg.getMsgtime());
  181. chatMsgOptimizeMapper.insert(chatMsgOptimize);
  182. pushSmgType(msgtype, jsonObject, sdk, chatMsg);
  183. list.add(chatMsg);
  184. }
  185. }
  186. } catch (Exception e) {
  187. e.printStackTrace();
  188. }
  189. }
  190. Finance.FreeSlice(slice);
  191. map.put("list",list);
  192. map.put("total",total);
  193. return map;
  194. }
  195. private void pushSmgType(String msgtype, com.alibaba.fastjson.JSONObject jsonObject, long sdk, InputChatMsg chatMsg) {
  196. if (msgtype!=null) {
  197. if (msgtype.equals("text")) {
  198. //文档
  199. com.alibaba.fastjson.JSONObject text = jsonObject.getJSONObject("text");
  200. if (text != null) {
  201. String content1 = text.getString("content");
  202. // chatMsg.setContent(pushCharset(content1));
  203. chatMsg.setContent(content1);
  204. }
  205. } else if (msgtype.equals("link")) {
  206. //链接
  207. com.alibaba.fastjson.JSONObject link = jsonObject.getJSONObject("link");
  208. chatMsg.setMsgurl(link.getString("link_url"));
  209. chatMsg.setContent(pushCharset(link.getString("title")));
  210. } else if (msgtype.equals("mixed")) {
  211. //混合
  212. System.out.println("=+++++++++++++++++++++++++++++++++++++" + jsonObject);
  213. com.alibaba.fastjson.JSONObject mixed = jsonObject.getJSONObject("mixed");
  214. com.alibaba.fastjson.JSONArray item = mixed.getJSONArray("item");
  215. for (int j = 0; j < item.size(); j++) {
  216. com.alibaba.fastjson.JSONObject e = item.getJSONObject(j);
  217. String type = e.getString("type");
  218. if (type.equals("text")) {
  219. com.alibaba.fastjson.JSONObject contentJson = e.getJSONObject("content");
  220. String content = contentJson.getString("content");
  221. chatMsg.setContent(content);
  222. } else {
  223. String url = "";
  224. com.alibaba.fastjson.JSONObject content = e.getJSONObject("content");
  225. String sdkfileid = content.getString("sdkfileid");
  226. if (type.equals("file")) {
  227. String filename = content.getString("filename");
  228. String osname = System.getProperties().getProperty("os.name");
  229. if (osname.contains("Windows")) {
  230. // filename = new String(filename.getBytes("GBK"),"UTF-8");
  231. String safeName = filename.replaceAll("[<>:\"/\\\\|?*,、]", "_");
  232. url = "/wechat/" + safeName;
  233. }
  234. } else if (type.equals("image")) {
  235. url = "/wechat/" + System.currentTimeMillis() + ".jpg";
  236. com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("image");
  237. } else {
  238. chatMsg.setContent(chatMsg.getContent() + "[附件=" + e + "]");
  239. }
  240. downloadFile(sdk, sdkfileid, uploadPath + url);
  241. chatMsg.setMsgurl(url);
  242. }
  243. }
  244. } else if (msgtype.equals("sphfeed")) {
  245. chatMsg.setContent(jsonObject.getString("sphfeed"));
  246. } else if (msgtype.equals("file") || msgtype.equals("image") || msgtype.equals("video") || msgtype.equals("voice")) {
  247. String url = pushFileUrl(sdk, msgtype, jsonObject);
  248. chatMsg.setMsgurl(url);
  249. } else if (msgtype.equals("chatrecord")) {
  250. chatMsg.setContent(jsonObject.getString("chatrecord"));
  251. } else if (msgtype.equals("agree")) {
  252. chatMsg.setContent("[同意会话存储]");
  253. } else if (msgtype.equals("disagree")) {
  254. chatMsg.setContent("[不同意会话存储]");
  255. } else if (msgtype.equals("emotion")) {
  256. String url = pushFileUrl(sdk, msgtype, jsonObject);
  257. chatMsg.setMsgurl(url);
  258. } else {
  259. if (!jsonObject.getString("action").equals("switch") && !jsonObject.getString("action").equals("recall")) {
  260. chatMsg.setContent(jsonObject.toJSONString());
  261. }
  262. }
  263. }
  264. }
  265. private String pushCharset(String content1) {
  266. String str ;
  267. try {
  268. String osname = System.getProperties().getProperty("os.name");
  269. if (osname.contains("Windows")) {
  270. String result = new String(content1.getBytes("GBK"),"UTF-8");
  271. str=result;
  272. }else{
  273. str=content1;
  274. }
  275. } catch (UnsupportedEncodingException e) {
  276. throw new RuntimeException(e);
  277. }
  278. return str;
  279. }
  280. private String pushFileUrl(long sdk, String msgtype, com.alibaba.fastjson.JSONObject jsonObject) {
  281. String url = "";
  282. String sdkfileid=null;
  283. if (msgtype.equals("file")){
  284. com.alibaba.fastjson.JSONObject file = jsonObject.getJSONObject("file");
  285. String filename = file.getString("filename");
  286. sdkfileid = file.getString("sdkfileid");
  287. String osname = System.getProperties().getProperty("os.name");
  288. if (osname.contains("Windows")) {
  289. // filename = new String(filename.getBytes("GBK"),"UTF-8");
  290. String safeName=filename.replaceAll("[<>:\"/\\\\|?*,、]", "_");
  291. url = "/wechat/"+ "file/"+safeName;
  292. }
  293. }else if (msgtype.equals("image")){
  294. url = "/wechat/"+"image/"+ System.currentTimeMillis()+".jpg";
  295. com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("image");
  296. sdkfileid = image.getString("sdkfileid");
  297. }else if (msgtype.equals("voice")){
  298. url = "/wechat/"+"voice/" +System.currentTimeMillis()+".mp3";
  299. com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("voice");
  300. sdkfileid = image.getString("sdkfileid");
  301. }else if (msgtype.equals("video")){
  302. url = url +"/wechat/"+"video/"+ System.currentTimeMillis()+".mp4";
  303. com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("video");
  304. }else if (msgtype.equals("emotion")){
  305. com.alibaba.fastjson.JSONObject emotion = jsonObject.getJSONObject("emotion");
  306. Integer type=emotion.getInteger("type");
  307. String suffix= "";
  308. if (type==1){
  309. suffix=".gif";
  310. }else if (type==2){
  311. suffix=".png";
  312. }
  313. url = url +"/wechat/"+"emotion/"+ System.currentTimeMillis()+suffix;
  314. sdkfileid = emotion.getString("sdkfileid");
  315. }
  316. // 下载文件
  317. downloadFile(sdk, sdkfileid, uploadPath+url);
  318. return url;
  319. }
  320. private void downloadFile(long sdk, String sdkfileid, String url) {
  321. String indexbuf = "";
  322. while(true){
  323. //每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个media_data,在使用完media_data中数据后,还需要调用FreeMediaData释放。
  324. long media_data = Finance.NewMediaData();
  325. int ret = Finance.GetMediaData(sdk, indexbuf, sdkfileid, null, null, 3, media_data);
  326. if(ret!=0){
  327. System.out.println("getmediadata ret:" + ret);
  328. Finance.FreeMediaData(media_data);
  329. return;
  330. }else{
  331. System.out.println("getmediadata ret:" + ret);
  332. }
  333. System.out.printf("getmediadata outindex len:%d, data_len:%d, is_finis:%d\n",Finance.GetIndexLen(media_data),Finance.GetDataLen(media_data), Finance.IsMediaDataFinish(media_data));
  334. try {
  335. File file = new File(url);
  336. if (!file.getParentFile().exists()) {
  337. file.getParentFile().mkdirs(); // 自动创建缺失的父目录
  338. }
  339. //大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。
  340. FileOutputStream outputStream = new FileOutputStream(url, true);
  341. outputStream.write(Finance.GetData(media_data));
  342. outputStream.close();
  343. } catch (Exception e) {
  344. e.printStackTrace();
  345. }
  346. if(Finance.IsMediaDataFinish(media_data) == 1)
  347. {
  348. //已经拉取完成最后一个分片
  349. Finance.FreeMediaData(media_data);
  350. break;
  351. }
  352. else
  353. {
  354. //获取下次拉取需要使用的indexbuf
  355. indexbuf = Finance.GetOutIndexBuf(media_data);
  356. Finance.FreeMediaData(media_data);
  357. }
  358. }
  359. }
  360. @Override
  361. public String getAccessToken(Integer type) {
  362. String corpId =null;
  363. String secret =null;
  364. String accessToken = null;
  365. if (type==0){
  366. corpId = hnCorpId;
  367. secret = hnSecret;
  368. //获取redis缓存数据
  369. Map<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("ACCESS_TOKEN");
  370. if (accessMap == null){
  371. logger.debug("getAccessToken无缓存从接口获取");
  372. Map<String, String> map = getAccessMap(corpId, secret);
  373. //新增redis缓存数据
  374. redisTemplate.opsForValue().set("ACCESS_TOKEN",map);
  375. accessToken = map.get("accessToken");
  376. }else {
  377. logger.debug("getAccessToken有缓存从缓存获取");
  378. accessToken = accessMap.get("accessToken");
  379. Long expireDate = Long.valueOf(accessMap.get("expireDate"));
  380. if (expireDate < System.currentTimeMillis()){
  381. logger.debug("getAccessToken缓存已过期从接口获取");
  382. Map<String, String> map = getAccessMap(corpId, secret);
  383. accessToken = map.get("accessToken");
  384. //新增redis缓存数据
  385. redisTemplate.opsForValue().set("ACCESS_TOKEN",map);
  386. }
  387. }
  388. }else if (type==1){
  389. corpId = nmCorpid;
  390. secret = nmSecret;
  391. //获取redis缓存数据
  392. Map<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("NM_ACCESS_TOKEN");
  393. if (accessMap == null){
  394. logger.debug("getAccessToken无缓存从接口获取");
  395. Map<String, String> map = getAccessMap(corpId, secret);
  396. //新增redis缓存数据
  397. redisTemplate.opsForValue().set("NM_ACCESS_TOKEN",map);
  398. accessToken = map.get("accessToken");
  399. }else {
  400. logger.debug("getAccessToken有缓存从缓存获取");
  401. accessToken = accessMap.get("accessToken");
  402. Long expireDate = Long.valueOf(accessMap.get("expireDate"));
  403. if (expireDate < System.currentTimeMillis()){
  404. logger.debug("getAccessToken缓存已过期从接口获取");
  405. Map<String, String> map = getAccessMap(corpId, secret);
  406. accessToken = map.get("accessToken");
  407. //新增redis缓存数据
  408. redisTemplate.opsForValue().set("NM_ACCESS_TOKEN",map);
  409. }
  410. }
  411. }
  412. return accessToken;
  413. }
  414. // public String getAddressBookAccessToken(Integer type) {
  415. // String corpId =null;
  416. // String secret =null;
  417. // if (type==0){
  418. // corpId = hnCorpId;
  419. // secret = hnSecret;
  420. // }else if (type==1){
  421. // corpId = nmCorpid;
  422. // secret = nmSecret;
  423. // }
  424. // //获取redis缓存数据
  425. // String accessToken = null;
  426. // Map<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("ADDRESS_BOOK_ACCESS_TOKEN");
  427. // if (accessMap == null){
  428. // logger.debug("ADDRESS_BOOK无缓存从接口获取");
  429. // Map<String, String> map = getAccessMap(corpId, secret);
  430. // //新增redis缓存数据
  431. // redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map);
  432. // accessToken = map.get("accessToken");
  433. // }else {
  434. // logger.debug("ADDRESS_BOOK有缓存从缓存获取");
  435. // accessToken = accessMap.get("accessToken");
  436. // Long expireDate = Long.valueOf(accessMap.get("expireDate"));
  437. // if (expireDate < System.currentTimeMillis()){
  438. // logger.debug("ADDRESS_BOOK缓存已过期从接口获取");
  439. // Map<String, String> map = getAccessMap(corpId, secret);
  440. // accessToken = map.get("accessToken");
  441. // //新增redis缓存数据
  442. // redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map);
  443. // }
  444. // }
  445. // return accessToken;
  446. // }
  447. @Override
  448. public String getAppAccessToken(Integer type) {
  449. String corpId =null;
  450. String appSecret =null;
  451. String accessToken=null;
  452. if (type==0){
  453. corpId = hnCorpId;
  454. appSecret = hnAppSecret;
  455. //获取redis缓存数据
  456. Map<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("ADDRESS_BOOK_ACCESS_TOKEN");
  457. if (accessMap == null){
  458. logger.debug("APP_ACCESS_TOKEN无缓存从接口获取");
  459. Map<String, String> map = getAccessMap(corpId,appSecret);
  460. //新增redis缓存数据
  461. redisTemplate.opsForValue().set("APP_ACCESS_TOKEN",map);
  462. accessToken = map.get("accessToken");
  463. }else {
  464. logger.debug("APP_ACCESS_TOKEN有缓存从缓存获取");
  465. accessToken = accessMap.get("accessToken");
  466. Long expireDate = Long.valueOf(accessMap.get("expireDate"));
  467. if (expireDate < System.currentTimeMillis()){
  468. logger.debug("APP_ACCESS_TOKEN缓存已过期从接口获取");
  469. Map<String, String> map = getAccessMap(corpId,appSecret);
  470. accessToken = map.get("accessToken");
  471. //新增redis缓存数据
  472. redisTemplate.opsForValue().set("APP_ACCESS_TOKEN",map);
  473. }
  474. }
  475. }else if (type==1){
  476. corpId = nmCorpid;
  477. appSecret = nmAppSecret;
  478. //获取redis缓存数据
  479. Map<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("NM_ADDRESS_BOOK_ACCESS_TOKEN");
  480. if (accessMap == null){
  481. logger.debug("NM_APP_ACCESS_TOKEN无缓存从接口获取");
  482. Map<String, String> map = getAccessMap(corpId,appSecret);
  483. //新增redis缓存数据
  484. redisTemplate.opsForValue().set("NM_APP_ACCESS_TOKEN",map);
  485. accessToken = map.get("accessToken");
  486. }else {
  487. logger.debug("NM_APP_ACCESS_TOKEN有缓存从缓存获取");
  488. accessToken = accessMap.get("accessToken");
  489. Long expireDate = Long.valueOf(accessMap.get("expireDate"));
  490. if (expireDate < System.currentTimeMillis()){
  491. logger.debug("NM_APP_ACCESS_TOKEN缓存已过期从接口获取");
  492. Map<String, String> map = getAccessMap(corpId,appSecret);
  493. accessToken = map.get("accessToken");
  494. //新增redis缓存数据
  495. redisTemplate.opsForValue().set("NM_APP_ACCESS_TOKEN",map);
  496. }
  497. }
  498. }
  499. return accessToken;
  500. }
  501. @Override
  502. public String getPermitUserList(Integer type) {
  503. String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_permit_user_list?access_token=%s",getAccessToken(type));
  504. com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url);
  505. if (result.getInteger("errcode")==0){
  506. List<String> ids = result.getJSONArray("ids").toJavaList(String.class);
  507. ids.stream().forEach(System.out::println);
  508. }else {
  509. System.out.println(result.getString("errcode"));
  510. System.out.println("获取会话内容存档成员列表失败");
  511. }
  512. pushGetChatName(result.toJSONString(),type);
  513. return null;
  514. }
  515. /**
  516. * 通过id获取名字,先查数据库,没有再按类型去调API查询
  517. * @param userId
  518. * @return
  519. */
  520. @Override
  521. public Map<String,Object> pushGetChatName(String userId, Integer type) {
  522. Map<String,Object> map = new HashMap<>();
  523. Integer i = 0;
  524. ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(userId);
  525. if (chatMsgUser != null){
  526. map.put("name",chatMsgUser.getName());
  527. map.put("code",i);
  528. return map;
  529. }else {
  530. String msgIdSub = userId.substring(0, 2);
  531. String url=null;
  532. Integer type2;
  533. if (msgIdSub.equals("wb")){
  534. type2=0;
  535. // url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_robot_info??access_token=%s&robot_id=%s",getAppAccessToken(),userId);
  536. }else if (msgIdSub.equals("wo")||msgIdSub.equals("wm")){
  537. // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get
  538. url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token=%s&external_userid=%s",getAppAccessToken(type),userId);
  539. type2=1;
  540. }else {
  541. url=String.format("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s",getAccessToken(type),userId);
  542. type2=2;
  543. }
  544. Map<String, Object> maps = getUserName(url, type2);
  545. Object o = maps.get("name");
  546. String userName = null;
  547. if(o!=null){
  548. userName = o.toString();
  549. }
  550. map.put ("code", maps.get("code"));
  551. chatMsgUser = new ChatMsgUser();
  552. chatMsgUser.setUserId(userId);
  553. chatMsgUser.setType(type);
  554. chatMsgUser.setCreateTime(new Date());
  555. if (StringUtils.isNotBlank(userName)){
  556. chatMsgUser.setName(userName);
  557. map.put("name",userName);
  558. }
  559. chatMsgUserMapper.insert(chatMsgUser);
  560. if (StringUtils.isBlank(userName)){
  561. String str = "未知(" + chatMsgUser.getId() + ")";
  562. chatMsgUser.setName(str);
  563. map.put("name",str);
  564. chatMsgUserMapper.update(chatMsgUser);
  565. }
  566. return map;
  567. }
  568. }
  569. /**
  570. * errorGode 错误码
  571. * 301059=非内部群,不提供数据
  572. * 90501=该群不是客户群
  573. * @param chatMsg
  574. * @return
  575. */
  576. @Override
  577. public String pushGetRoomName(ChatMsg chatMsg, Integer type) {
  578. String roomname=null;
  579. // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=ACCESS_TOKEN
  580. String roomid = chatMsg.getRoomid();
  581. ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(roomid);
  582. if (chatMsgUser != null){
  583. return chatMsgUser.getName();
  584. }else {
  585. //查询编号中有没有external
  586. String msgIdSub = chatMsg.getMsgid();
  587. int i = msgIdSub.indexOf("external");
  588. if (i>0){
  589. String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=%s",getAppAccessToken(type));
  590. Map<String,Object> map = new HashMap<String, Object>();
  591. map.put("chat_id",roomid);
  592. map.put("cursor",0);
  593. com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpPost(url, map);
  594. roomname = jsonObject.getString("roomname");
  595. if (StringUtils.isBlank(roomname)){
  596. com.alibaba.fastjson.JSONObject groupChat = jsonObject.getJSONObject("group_chat");
  597. if (groupChat!=null){
  598. roomname = groupChat.getString("name");
  599. }
  600. }
  601. if (jsonObject.getInteger("errcode")==0){
  602. }else {
  603. System.out.println("获取外部群名称失败"+jsonObject.getString("errcode"));
  604. }
  605. }
  606. else
  607. {
  608. //https://qyapi.weixin.qq.com/cgi-bin/msgaudit/groupchat/get
  609. String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/groupchat/get?access_token=%s",getAccessToken(type));
  610. Map<String,Object> map = new HashMap<String, Object>();
  611. map.put("roomid",roomid);
  612. com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpPost(url, map);
  613. System.out.println(jsonObject.toJSONString());
  614. roomname = jsonObject.getString("roomname");
  615. if (StringUtils.isBlank(roomname)){
  616. com.alibaba.fastjson.JSONObject groupChat = jsonObject.getJSONObject("group_chat");
  617. roomname = groupChat.getString("name");
  618. }
  619. if (jsonObject.getInteger("errcode")==0){
  620. }else {
  621. System.out.println("获取内部群名称失败"+jsonObject.getString("errcode"));
  622. }
  623. }
  624. chatMsgUser = new ChatMsgUser();
  625. chatMsgUser.setUserId(roomid);
  626. chatMsgUser.setType(3);
  627. chatMsgUser.setCreateTime(new Date());
  628. if (StringUtils.isNotBlank(roomname)){
  629. chatMsgUser.setName(roomname);
  630. }
  631. chatMsgUserMapper.insert(chatMsgUser);
  632. if (StringUtils.isBlank(roomname)){
  633. chatMsgUser.setName("未知群("+chatMsgUser.getId()+")");
  634. chatMsgUserMapper.update(chatMsgUser);
  635. }
  636. }
  637. return roomname;
  638. }
  639. @Override
  640. public Object getMsgData(InputGetChatName in) {
  641. List<ChatMsgUser> list = chatMsgUserMapper.getUserList(2,in.getProvinceType());
  642. list.forEach(e->{
  643. //查询每个人的所有信息
  644. List<ChatMsg> chatMsgs = chatMsgMapper.selectMsgById(e.getUserId(),null);
  645. List<ChatMsg> collect = chatMsgs.stream().filter(e1 -> e1.getType().equals(0)).collect(Collectors.toList());
  646. List<ChatMsg> collect1 = chatMsgs.stream().filter(e1 -> e1.getType().equals(1)).collect(Collectors.toList());
  647. List<String> toUser=new ArrayList<>();
  648. List<String> toList=new ArrayList<>();
  649. collect.forEach(e1->{
  650. if (e1.getFromId().equals(e.getUserId())){
  651. if (!toUser.contains(e1.getTolist())){
  652. toUser.add(e1.getTolist());
  653. }
  654. }else {
  655. if (!toUser.contains(e1.getFromId())){
  656. toUser.add(e1.getFromId());
  657. }
  658. }
  659. });
  660. collect1.forEach(e1->{
  661. if (e1.getFromId().equals(e.getUserId())){
  662. if (!toList.contains(e1.getRoomid())){
  663. toList.add(e1.getRoomid());
  664. }
  665. }else {
  666. if (!toList.contains(e1.getRoomid())){
  667. toList.add(e1.getRoomid());
  668. }
  669. }
  670. });
  671. System.out.println(e.getName()+"单聊有:");
  672. toUser.forEach(System.out::println);
  673. System.out.println("================================");
  674. System.out.println(e.getName()+"群聊有:");
  675. toList.forEach(System.out::println);
  676. });
  677. return list;
  678. }
  679. @Override
  680. public Object getUserMsg(InputgetUserMsg in) {
  681. List<ChatMsgUser> list = chatMsgUserMapper.getUserList(2,in.getProvinceType());
  682. return list;
  683. }
  684. @Override
  685. public Object getMyIdByUser(InputgetUserMsg in) {
  686. if (in.getEndTime()!=null)in.setEndTime(in.getEndTime()+" 23:59:59");
  687. return chatMsgUserMapper.selectMyIdByUser(in);
  688. }
  689. @Override
  690. public Object getMyIdByRoom(InputgetUserMsg in) {
  691. if (in.getEndTime()!=null)in.setEndTime(in.getEndTime()+" 23:59:59");
  692. return chatMsgUserMapper.selectMyIdByRoom(in);
  693. }
  694. @Override
  695. public Object getMsgList(InputgetUserMsg in) {
  696. if (in.getEndTime()!=null)in.setEndTime(in.getEndTime()+" 23:59:59");
  697. List<ChatMsg> chatMsgs=new ArrayList<>();
  698. if (StringUtils.isNotEmpty(in.getRoomId())){
  699. chatMsgs = chatMsgMapper.selectByRoomId(in);
  700. }else if (StringUtils.isNotEmpty(in.getUserId())&&StringUtils.isNotEmpty(in.getFoId())){
  701. chatMsgs = chatMsgMapper.selectByUserIdAndFoId(in);
  702. //将list按时间先后排序
  703. chatMsgs.sort(Comparator.comparing(ChatMsg::getMsgtime));
  704. }
  705. for (ChatMsg e : chatMsgs) {
  706. WechatSmgTypeEnum field = WechatSmgTypeEnum.getField(e.getMsgtype());
  707. if (field==null){
  708. e.setMsgType(e.getMsgtype());
  709. }else {
  710. String desc = field.getDesc();
  711. e.setMsgType(desc);
  712. }
  713. if (e.getType()==0){
  714. e.setTypeName("单聊");
  715. }else if (e.getType()==1){
  716. e.setTypeName("群聊");
  717. }
  718. }
  719. return chatMsgs;
  720. }
  721. private Map<String,Object> getUserName(String url,Integer type){
  722. String name = null;
  723. Integer code=0;
  724. Map<String,Object> map=new HashMap<String, Object>();
  725. if (type==0) {
  726. name="机器人";
  727. }else if (type==1){
  728. com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url);
  729. if (result.getInteger("errcode")==0) {
  730. System.out.println(result.toJSONString());
  731. com.alibaba.fastjson.JSONObject externalContact = result.getJSONObject("external_contact");
  732. name=externalContact.getString("name");
  733. }else {
  734. code = result.getInteger("errcode");
  735. System.out.println(result.toJSONString());
  736. System.out.println("获取外部联系人名称失败");
  737. }
  738. }else if (type==2){
  739. com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url);
  740. if (result.getInteger("errcode")==0) {
  741. System.out.println(result.toJSONString());
  742. com.alibaba.fastjson.JSONObject externalContact = result.getJSONObject("external_contact");
  743. name = result.getString("name");
  744. }else {
  745. System.out.println(result.toJSONString());
  746. code = result.getInteger("errcode");
  747. }
  748. }
  749. map.put("name",name);
  750. map.put("code",code);
  751. return map;
  752. }
  753. private Map<String, String> getAccessMap(String corpid, String secret) {
  754. String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s",corpid,secret);
  755. Date date = new Date();
  756. com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpGet(url);
  757. String access_token = (String) jsonObject.get("access_token");
  758. Integer expires_in = (Integer) jsonObject.get("expires_in");
  759. //时间加上过期时间
  760. Date expireDate = DateUtils.addMilliseconds(date, expires_in*1000);
  761. Map<String,String> map = new HashMap<>();
  762. map.put("accessToken",access_token);
  763. map.put("expireDate", String.valueOf(expireDate.getTime()));
  764. return map;
  765. }
  766. }