WeChat.cs 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  1. using CommonTools;
  2. using HttpHelper;
  3. using Newtonsoft.Json;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using System.Web;
  12. using System.Windows.Media.Imaging;
  13. using WeChatCore.Common;
  14. using WeChatCore.DefineClass;
  15. using WeChatCore.Entity;
  16. using WeChatCore.Enum;
  17. namespace WeChatCore
  18. {
  19. /// <summary>
  20. /// weichat
  21. /// </summary>
  22. public static class WeChat
  23. {
  24. #region 初始化微信机器人
  25. /// <summary>
  26. /// 初始化消息机器人 注:必须用异步线程,否则会阻塞主线程
  27. /// </summary>
  28. public static void InitWeChatRobot()
  29. {
  30. bool DownLoadImageResult = DownloadImage();
  31. if (DownLoadImageResult == true)
  32. {
  33. CommonMethodCallBackHandlers.OnDownLoadQRCodeCompleted();
  34. //下载成功
  35. Login();
  36. CommonDefine.GetMsgSyncKey = GetSyncKey();
  37. while (true)
  38. {
  39. try
  40. {
  41. LogWriter.Write(string.Format("获取心跳信息..."), LogPathDefine.WeChatLogPath);
  42. KeepHeart(CommonDefine.GetMsgSyncKey);
  43. }
  44. catch (Exception ex)
  45. {
  46. LogWriter.Write(string.Format(ex.Message), LogPathDefine.ExceptionLogPath);
  47. }
  48. }
  49. }
  50. else
  51. {
  52. LogWriter.Write(string.Format("下载验证码失败,请重试..."), LogPathDefine.WeChatLogPath);
  53. throw new Exception("下载验证码失败,请重试...");
  54. }
  55. }
  56. #endregion
  57. #region 环境校验
  58. public static void CheckMethod()
  59. {
  60. }
  61. #endregion
  62. #region 下载验证码
  63. /// <summary>
  64. /// 下载验证码
  65. /// </summary>
  66. public static bool DownloadImage()
  67. {
  68. HttpResponseResult ResponseResult = HttpMethods.Get(UrlDefine.LoginUrl, new System.Net.CookieContainer(), Encoding.UTF8);
  69. if (ResponseResult.StatusCode == System.Net.HttpStatusCode.OK)
  70. {
  71. string[] str = ResponseResult.ContentData.ToString().Split(';');
  72. string ImageCode = str[1].Substring(str[1].IndexOf("\"") + 1, str[1].Length - str[1].IndexOf("\"") - 2);
  73. UrlDefine.Tickets = ImageCode;
  74. CommonDefine.Cookies = HttpMethods.getCookie(UrlDefine.RootUrl);
  75. ResponseResult = HttpMethods.GetFile(UrlDefine.LoginUrlWithToken + ImageCode, "Check.jpg", new System.Net.CookieContainer());
  76. if (ResponseResult.StatusCode == System.Net.HttpStatusCode.OK)
  77. {
  78. LogWriter.Write("下载微信登录二维码成功...", LogPathDefine.WeChatLogPath);
  79. return true;
  80. }
  81. else
  82. {
  83. LogWriter.Write("获取微信登录二维码失败...", LogPathDefine.WeChatErrorLogPath);
  84. LogWriter.Write(string.Format("当前返回状态码是{0},返回信息是{1}", ResponseResult.StatusCode.ToString(), ResponseResult.ReturnMsg), LogPathDefine.WeChatErrorLogPath);
  85. return false;
  86. }
  87. }
  88. else
  89. {
  90. //请求出现问题
  91. LogWriter.Write("访问微信登官网失败...", LogPathDefine.WeChatErrorLogPath);
  92. LogWriter.Write(string.Format("当前返回状态码是{0},返回信息是{1}", ResponseResult.StatusCode.ToString(), ResponseResult.ReturnMsg), LogPathDefine.WeChatErrorLogPath);
  93. return false;
  94. }
  95. }
  96. #endregion
  97. #region 登录
  98. /// <summary>
  99. /// 登录
  100. /// </summary>
  101. public static void Login()
  102. {
  103. string str = string.Empty;
  104. HttpMethods.ContentType = "application/json;charset=utf-8";
  105. while (true)
  106. {
  107. if (!str.Contains("200"))
  108. {
  109. HttpResponseResult ResponseResult = HttpMethods.Get(UrlDefine.WaitingUrl(UrlDefine.Tickets), CommonDefine.Cookies, Encoding.UTF8);
  110. str = ResponseResult.ContentData.ToString();
  111. Console.WriteLine("当前返回值是:" + str);
  112. if (str.Contains("201"))
  113. {
  114. //扫码登录中
  115. string[] base64 = str.Split(',');
  116. CommonDefine.Base64 = base64[1];
  117. byte[] arr = Convert.FromBase64String(CommonDefine.Base64.Replace("'", "").Replace(";", "").Trim());
  118. File.WriteAllBytes(Environment.CurrentDirectory + "\\User.jpg", arr);
  119. MemoryStream ms = new MemoryStream(arr);
  120. BitmapImage bi = new BitmapImage();
  121. bi.BeginInit();
  122. bi.StreamSource = ms;// new FileStream();
  123. bi.EndInit();
  124. CommonDefine.UserImage = bi;
  125. CommonMethodCallBackHandlers.OnLoginScranQRCodeCompleted(Environment.CurrentDirectory + "\\User.jpg");
  126. }
  127. }
  128. if (str.Contains("200"))
  129. {
  130. //扫码登录完成
  131. LogWriter.Write("扫码登录成功...", LogPathDefine.WeChatLogPath);
  132. string[] strs = str.Split(';');
  133. UrlDefine.LoginUrls = strs[1].Substring(strs[1].IndexOf("=\"") + 2, strs[1].Length - strs[1].IndexOf("=\"") - 3);
  134. string XmlList = HttpMethods.Get(UrlDefine.LoginUrls, CommonDefine.Cookies, Encoding.UTF8, true).ContentData.ToString();
  135. CommonDefine.GetCookieDictionary = HttpMethods.SetCookieDictionary;
  136. CommonDefine.LoginResult = XMLHelper.DESerializer<LoginResultEntity>(XmlList);
  137. //此处可用于二次点击登录
  138. LogWriter.Write(CommonDefine.LoginResult.wxuin, Environment.CurrentDirectory + "\\Data\\data.dat");
  139. Random r = new Random();
  140. BaseRequestEntity Bre = new BaseRequestEntity() { Uin = CommonDefine.LoginResult.wxuin, Sid = CommonDefine.LoginResult.wxsid, Skey = CommonDefine.LoginResult.skey, DeviceID = MethodsHelper.GetDeviceId() };
  141. BaseRequestSubmitEntity le = new BaseRequestSubmitEntity() { BaseRequest = Bre };
  142. string postdata = JsonConvert.SerializeObject(le);
  143. string MySelfList = HttpMethods.PostData(UrlDefine.GetLoginId + CommonDefine.LoginResult.pass_ticket, postdata, CommonDefine.Cookies, Encoding.UTF8).ContentData.ToString();
  144. LogWriter.Write(string.Format("获取个人信息{0}...", MySelfList), LogPathDefine.WeChatLogPath);
  145. CommonDefine.BaseContact = JsonConvert.DeserializeObject<BaseContactEntity>(MySelfList);
  146. string ContentList = HttpMethods.Get(UrlDefine.GetContactUrl(CommonDefine.LoginResult.pass_ticket, CommonDefine.LoginResult.skey), CommonDefine.Cookies, Encoding.UTF8).ContentData.ToString();
  147. CommonDefine.ContactsList = JsonConvert.DeserializeObject<ContactsListEntity>(ContentList);
  148. LogWriter.Write(string.Format("获取联系人信息{0}...", ContentList), LogPathDefine.WeChatLogPath);
  149. new Task(() => { GetGroupContactsMethod(CommonDefine.ContactsList.MemberList); }).Start();
  150. new Task(() =>
  151. {
  152. CommonDefine.ContactsList.MemberList.ForEach((p) =>
  153. {
  154. p.DownloadImage();
  155. });
  156. }).Start();
  157. CommonMethodCallBackHandlers.OnLoginCompleted(true);
  158. break;
  159. }
  160. Thread.Sleep(5000);
  161. }
  162. }
  163. #endregion
  164. #region 下载头像
  165. public static void DownloadHeaderImage(MemberListItemEntity Mli)
  166. {
  167. Mli.DownloadImage();
  168. }
  169. #endregion
  170. #region 获取联系人
  171. /// <summary>
  172. /// 刷新联系人
  173. /// </summary>
  174. public static void RefreshContacts()
  175. {
  176. string ContentList = HttpMethods.Get(UrlDefine.GetContactUrl(CommonDefine.LoginResult.pass_ticket, CommonDefine.LoginResult.skey), CommonDefine.Cookies, Encoding.UTF8).ContentData.ToString();
  177. ContactsListEntity ContactsLists = JsonConvert.DeserializeObject<ContactsListEntity>(ContentList);
  178. if (ContactsLists != CommonDefine.ContactsList)//联系人有更新,关键是看数量增加还是减少的
  179. {
  180. CommonDefine.ContactsList = ContactsLists;
  181. }
  182. }
  183. #endregion
  184. #region 联系人分类
  185. /// <summary>
  186. /// 分类
  187. /// </summary>
  188. /// <returns></returns>
  189. public static List<MemberListItemEntity> SetSplite(ContactType ct)
  190. {
  191. switch (ct)
  192. {
  193. case ContactType.PublicContact:
  194. ///公众号
  195. var PublicContact = from item in CommonDefine.ContactsList.MemberList
  196. where item.VerifyFlag == 8 ||
  197. item.VerifyFlag == 24 ||
  198. item.VerifyFlag == 56
  199. select item;
  200. if (PublicContact != null)
  201. return PublicContact.ToList();
  202. else
  203. return new List<MemberListItemEntity>();
  204. case ContactType.PersonContact:
  205. //个人
  206. var PersonList = from item in CommonDefine.ContactsList.MemberList where item.VerifyFlag == 0 && item.UserName.Contains("@") select item;
  207. if (PersonList != null)
  208. return PersonList.ToList();
  209. else
  210. return new List<MemberListItemEntity>();
  211. case ContactType.GroupContact:
  212. //群组
  213. var GroupList = from item in CommonDefine.ContactsList.MemberList where item.VerifyFlag == 0 && item.UserName.Contains("@@") select item;
  214. if (GroupList != null)
  215. return GroupList.ToList();
  216. else
  217. return new List<MemberListItemEntity>();
  218. }
  219. return new List<MemberListItemEntity>();
  220. }
  221. #endregion
  222. #region 获取启动心跳参数
  223. /// <summary>
  224. /// 获取心跳key
  225. /// </summary>
  226. /// <returns></returns>
  227. public static string GetSyncKey()
  228. {
  229. BaseRequestEntity Bre = new BaseRequestEntity() { Uin = CommonDefine.LoginResult.wxuin, Sid = CommonDefine.LoginResult.wxsid, Skey = CommonDefine.LoginResult.skey, DeviceID = MethodsHelper.GetDeviceId() };
  230. BaseRequestSubmitEntity le = new BaseRequestSubmitEntity() { BaseRequest = Bre };
  231. string SyncKeyData = JsonConvert.SerializeObject(le);
  232. string SyncKeyUrl = UrlDefine.GetSyncKey + CommonDefine.LoginResult.pass_ticket;
  233. string SyncKeyList = HttpMethods.PostData(SyncKeyUrl, SyncKeyData, CommonDefine.Cookies, Encoding.UTF8).ContentData.ToString();
  234. BaseContactEntity bce = JsonConvert.DeserializeObject<BaseContactEntity>(SyncKeyList);
  235. CommonDefine.SyncKey = bce.SyncKey;
  236. string SyncKey = string.Empty;
  237. for (int index = 0; index < bce.SyncKey.List.Count; index++)
  238. {
  239. if (!string.IsNullOrWhiteSpace(SyncKey))
  240. {
  241. SyncKey = SyncKey + "|";
  242. }
  243. SyncKey = SyncKey + bce.SyncKey.List[index].Key + "_" + bce.SyncKey.List[index].Val;
  244. }
  245. Thread.Sleep(5000);
  246. return SyncKey;
  247. }
  248. #endregion
  249. #region 获取心跳
  250. /// <summary>
  251. /// 获取心跳
  252. /// </summary>
  253. /// <param name="SyncKey"></param>
  254. public static void KeepHeart(string SyncKey)
  255. {
  256. Random ran = new Random();
  257. string HeartUrl = UrlDefine.HeartUrl + "r=" + DateTimeToosHelper.GetUnixTimeSpan().ToString() + MethodsHelper.GetThreeNumber() +
  258. "&skey=" + CommonDefine.LoginResult.skey
  259. + "&sid=" + CommonDefine.LoginResult.wxsid
  260. + "&uin=" + CommonDefine.LoginResult.wxuin
  261. + "&deviceid=e9128931905052" + ((int)ran.Next(0, 9)).ToString() + ((int)(ran.Next(0, 8) + 1)).ToString() + "&synckey=" + SyncKey + "&_=" + DateTimeToosHelper.GetUnixTimeSpan().ToString() + MethodsHelper.GetThreeNumber();
  262. LogWriter.Write(SyncKey, @"SyncKey.log");
  263. string HeartList = string.Empty;
  264. try
  265. {
  266. HeartList = HttpMethods.Get(HeartUrl, CommonDefine.Cookies, Encoding.UTF8).ContentData.ToString();
  267. }
  268. catch (Exception ex)
  269. {
  270. // HeartList = HttpMethods.Get(HeartUrl, CommonDefine.Cookies, Encoding.UTF8).ContentData.ToString();
  271. }
  272. if (!string.IsNullOrWhiteSpace(HeartList))
  273. {
  274. LogWriter.Write(HeartList.ToString());
  275. if (HeartList.ToString() != "window.synccheck={retcode:\"0\",selector:\"0\"}")
  276. {
  277. // Thread.CurrentThread.Abort();
  278. Console.WriteLine(HeartList.ToString());
  279. GetMsg(CommonDefine.SyncKey);
  280. CommonDefine.GetMsgSyncKey = GetSyncKey();// 理论上此处不需要赋值,如果收发消息出现问题,放开次注释
  281. }
  282. else if (HeartList.ToString() != "window.synccheck={retcode:\"0\",selector:\"7\"}")
  283. {
  284. // GetMsgSyncKey = GetSyncKey();
  285. }
  286. Console.WriteLine(HeartList.ToString());
  287. Console.WriteLine("thK's while is breaked!" + DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss"));
  288. }
  289. else
  290. {
  291. // GetMsgSyncKey = GetSyncKey();
  292. }
  293. return;
  294. }
  295. #endregion
  296. #region 获取聊天信息
  297. /// <summary>
  298. /// 获取聊天信息
  299. /// </summary>
  300. /// <param name="SyncKeyList"></param>
  301. /// <returns></returns>
  302. public static string GetMsg(SyncKeyEntity SyncKey)
  303. {
  304. string ReturnKey = string.Empty;
  305. ReceiveMsgEntity Rme = new ReceiveMsgEntity();
  306. GetMsgEntiy Gme = new GetMsgEntiy() { BaseRequest = new BaseRequestEntity() { Uin = CommonDefine.LoginResult.wxuin, Sid = CommonDefine.LoginResult.wxsid, Skey = CommonDefine.LoginResult.skey, DeviceID = MethodsHelper.GetDeviceId() }, SyncKey = SyncKey, rr = -113317163 };
  307. string PostData = JsonConvert.SerializeObject(Gme);
  308. string posturl = UrlDefine.GetChatUrl
  309. + "sid=" + CommonDefine.LoginResult.wxsid
  310. + "&skey=" + CommonDefine.LoginResult.skey
  311. + "&pass_ticket=" + CommonDefine.LoginResult.pass_ticket;
  312. string Msglist = HttpMethods.PostData(posturl, PostData, CommonDefine.Cookies, Encoding.UTF8).ContentData.ToString();
  313. try
  314. {
  315. Rme = JsonConvert.DeserializeObject<ReceiveMsgEntity>(Msglist);
  316. CommonDefine.SyncKey = Rme.SyncKey;
  317. }
  318. catch (Exception ex)
  319. {
  320. Console.WriteLine("GetMsg" + ex.Message);
  321. }
  322. try
  323. {
  324. if (Rme.AddMsgCount != 0)
  325. {
  326. //说明有消息
  327. AnalyseMsg(Rme.AddMsgList);
  328. }
  329. else
  330. {
  331. //到这 说明没有消息
  332. }
  333. }
  334. catch (Exception ex)
  335. {
  336. // KeepHeart(FristKey);
  337. Console.WriteLine("GetMsg is out Exception" + ex.Message);
  338. }
  339. return ReturnKey;
  340. }
  341. #endregion
  342. #region 获取群成员
  343. /// <summary>
  344. /// 获取群成员信息
  345. /// </summary>
  346. /// <param name="GroupList"></param>
  347. public static void GetGroupContactsMethod(List<MemberListItemEntity> GroupList)
  348. {
  349. GroupContacts GC = new GroupContacts();
  350. GC.BaseRequest = new BaseRequestEntity() { DeviceID = MethodsHelper.GetDeviceId(), Sid = CommonDefine.LoginResult.wxsid, Skey = CommonDefine.LoginResult.skey, Uin = CommonDefine.LoginResult.wxuin };
  351. List<GroupListItem> GroupNumberList = new List<GroupListItem>();
  352. for (int index = 0; index < GroupList.Count; index++)
  353. {
  354. if (GroupList[index].UserName.Contains("@@"))
  355. {
  356. GroupListItem Groupitem = new GroupListItem();
  357. Groupitem.UserName = GroupList[index].UserName;
  358. GroupNumberList.Add(Groupitem);
  359. }
  360. }
  361. GC.List = GroupNumberList;
  362. GC.Count = GroupNumberList.Count;
  363. string PostData = JsonConvert.SerializeObject(GC);
  364. string Result = HttpMethods.PostData(string.Format(UrlDefine.GetQunContactUrl, CommonDefine.LoginResult.pass_ticket), PostData, CommonDefine.Cookies, Encoding.UTF8).ContentData.ToString();
  365. if (!string.IsNullOrWhiteSpace(Result))
  366. {
  367. GroupMemberListEntity GroupMumberInfo = JsonConvert.DeserializeObject<GroupMemberListEntity>(Result);
  368. CommonDefine.GroupMemberList = GroupMumberInfo;
  369. }
  370. else
  371. {
  372. LogWriter.Write("获取群成员失败,返回结果为空!", LogPathDefine.WeChatGrouplogPath);
  373. }
  374. //GGC.List=new List<Entity.ListItem>(
  375. }
  376. #endregion
  377. #region 获取具体人信息
  378. /// <summary>
  379. /// 获取群成员昵称
  380. /// </summary>
  381. /// <param name="ali"></param>
  382. /// <returns></returns>
  383. public static GroupMemberEntity SelectGroupMumber(AddMsgListItemEntity ali)
  384. {
  385. try
  386. {
  387. string[] result = ali.Content.Split(':');
  388. var WhichGroupList = from item in CommonDefine.GroupMemberList.ContactList
  389. where item.UserName == ali.FromUserName
  390. select item;
  391. var WhichPersonList = from item in WhichGroupList.ToList().SingleOrDefault().MemberList
  392. where item.UserName == result[0]
  393. select item;
  394. return WhichPersonList.ToList<GroupMemberEntity>().SingleOrDefault();
  395. }
  396. catch (Exception ex)
  397. {
  398. LogWriter.Write("获取群成员名称失败!异常信息是:" + ex.Message, LogPathDefine.WeChatGrouplogPath);
  399. return null;
  400. }
  401. }
  402. #endregion
  403. #region 分析消息
  404. /// <summary>
  405. /// 分析消息结构
  406. /// </summary>
  407. /// <param name="MsgList"></param>
  408. private static void AnalyseMsg(List<AddMsgListItemEntity> MsgList)
  409. {
  410. try
  411. {
  412. //遍历所有消息项
  413. for (int index = 0; index < MsgList.Count; index++)
  414. {
  415. AddMsgListItemEntity ali = MsgList[index];//消息体
  416. MsgEntity me = new MsgEntity();//二次封装
  417. me.IsCanAutoReply = true;
  418. // WebwxStatusNotify(ali.FromUserName, ali.ToUserName);
  419. if (ali.FromUserName == CommonDefine.BaseContact.User.UserName) return;
  420. //取得消息来源联系人信息
  421. var CustomName = from item in CommonDefine.ContactsList.MemberList where item.UserName == ali.FromUserName select item;
  422. if (CustomName == null || CustomName.ToList().Count <= 0)
  423. {
  424. //当前联系人列表中找不到此用户
  425. try
  426. {
  427. //此处进行联系人刷新
  428. RefreshContacts();
  429. CustomName = from item in CommonDefine.ContactsList.MemberList where item.UserName == ali.FromUserName select item;
  430. if (CustomName == null || CustomName.ToList().Count <= 0)//未找到消息来源
  431. return;
  432. }
  433. catch (Exception ex)
  434. {
  435. LogWriter.Write("刷新联系人发生异常,异常信息是:" + ex.Message, LogPathDefine.ExceptionLogPath);
  436. }
  437. }
  438. MemberListItemEntity Mlie = CustomName.ToList().SingleOrDefault();
  439. try
  440. {
  441. if (Mlie.UserName.Contains("@@"))
  442. {
  443. //群消息处理
  444. GroupMemberEntity Gme = SelectGroupMumber(ali);
  445. if (Gme == null)
  446. {
  447. //刷新群成员
  448. GetGroupContactsMethod(CommonDefine.ContactsList.MemberList);
  449. Gme = SelectGroupMumber(ali);
  450. }
  451. if (ali.Content.Contains(":"))
  452. {
  453. string[] a = ali.Content.Split(':');
  454. ali.Content = Gme.NickName + ":" + a[1].Replace("<br/>", "");
  455. }
  456. me.GroupMember = Gme;
  457. }
  458. }
  459. catch (Exception ex)
  460. {
  461. LogWriter.Write("替换群成员名称失败,异常信息为:" + ex.Message, LogPathDefine.ExceptionLogPath);
  462. }
  463. //消息列表实体
  464. me.MsgOwer = Mlie;
  465. me.MsgContent = ali.Content;
  466. me.MsgOwerType = MsgOwerTypeEnum.AccepterMsg;
  467. me.IsCanAutoReply = Mlie.IsCanAutoReply;
  468. #region 储存消息
  469. if (ali.MsgType == (int)MsgTypeEnum.Voice)
  470. {
  471. me.MsgType = MsgTypeEnum.Voice;
  472. //语音消息
  473. string Url = string.Format(UrlDefine.VoiceUrl, ali.MsgId, CommonDefine.LoginResult.skey);
  474. string FileId = MethodsHelper.MsgSaveFile(DirectoryDefine.VoiceMsgPath);//获取FileId
  475. //根据FileID创建本地的语音对象
  476. List<byte> list = HttpMethods.GetFile(Url, Environment.CurrentDirectory + "\\" + DirectoryDefine.VoiceMsgPath + "\\" + FileId + ".mp3", CommonDefine.Cookies).ContentData as List<byte>;
  477. me.MsgTime = DateTime.Now;
  478. me.FileId = FileId;
  479. me.FilePath = Environment.CurrentDirectory + "\\" + DirectoryDefine.VoiceMsgPath + "\\" + me.FileId + ".mp3";
  480. }
  481. else if (ali.MsgType == (int)MsgTypeEnum.Picture)
  482. {
  483. me.MsgType = MsgTypeEnum.Picture;
  484. //图片消息
  485. string Url = string.Format(UrlDefine.ImgUrlBig, ali.MsgId, CommonDefine.LoginResult.skey);
  486. string FileId = MethodsHelper.MsgSaveFile(DirectoryDefine.ImageMsgPath);//获取FileId
  487. //根据FileID创建本地的语音对象
  488. List<byte> list = HttpMethods.GetFile(Url, Environment.CurrentDirectory + "\\" + DirectoryDefine.ImageMsgPath + "\\" + FileId + ".jpg", CommonDefine.Cookies).ContentData as List<byte>;
  489. //获取缩略图
  490. HttpMethods.GetFile(string.Format(UrlDefine.ImgUrl, ali.MsgId, CommonDefine.LoginResult.skey), Environment.CurrentDirectory + "\\" + DirectoryDefine.ImageMsgTempPath + "\\" + FileId + ".jpg", CommonDefine.Cookies);
  491. //将下载下来的MP3文件转成Base64进行储存
  492. //string Base64Str = Convert.ToBase64String(list.ToArray());
  493. me.MsgTime = DateTime.Now;
  494. me.FileId = FileId;
  495. me.FilePath = Environment.CurrentDirectory + "\\" + DirectoryDefine.ImageMsgPath + "\\" + FileId + ".jpg";//
  496. me.FileTempPath = Environment.CurrentDirectory + "\\" + DirectoryDefine.ImageMsgTempPath + "\\" + FileId + ".jpg";
  497. }
  498. else if (ali.MsgType == (int)MsgTypeEnum.Gif)
  499. {
  500. //TODO:GIF消息
  501. me.MsgType = MsgTypeEnum.Gif;
  502. //语音消息
  503. string Url = string.Format(UrlDefine.ImgUrlBig, ali.MsgId, CommonDefine.LoginResult.skey);
  504. string FileId = MethodsHelper.MsgSaveFile(DirectoryDefine.ImageMsgGifPath);//获取FileId
  505. HttpMethods.GetFile(Url, Environment.CurrentDirectory + "\\" + DirectoryDefine.ImageMsgGifPath + "\\" + FileId + ".gif", CommonDefine.Cookies);
  506. HttpMethods.GetFile(string.Format(UrlDefine.ImgUrl, ali.MsgId, CommonDefine.LoginResult.skey), Environment.CurrentDirectory + "\\" + DirectoryDefine.ImageMsgTempPath + "\\" + FileId + ".jpg", CommonDefine.Cookies);
  507. me.MsgTime = DateTime.Now;
  508. me.FileId = FileId;
  509. me.FilePath = Environment.CurrentDirectory + "\\" + DirectoryDefine.ImageMsgGifPath + "\\" + FileId + ".gif";//
  510. me.FileTempPath = Environment.CurrentDirectory + "\\" + DirectoryDefine.ImageMsgTempPath + "\\" + FileId + ".jpg";
  511. }
  512. else if (ali.MsgType == (int)MsgTypeEnum.Video)
  513. {
  514. me.MsgType = MsgTypeEnum.Video;
  515. //视频消息
  516. string Url = string.Format(UrlDefine.VideoUrl, ali.MsgId, HttpUtility.UrlEncode(CommonDefine.LoginResult.skey));
  517. string FileId = MethodsHelper.MsgSaveFile(DirectoryDefine.VideoMsgPath);//获取FileId
  518. HttpMethods.GetFile(string.Format(UrlDefine.ImgUrl, ali.MsgId, CommonDefine.LoginResult.skey), Environment.CurrentDirectory + "\\" + DirectoryDefine.ImageMsgTempPath + "\\" + FileId + ".jpg", CommonDefine.Cookies);
  519. //根据FileID创建本地的语音对象
  520. List<byte> list = HttpMethods.GetVideo(Url, Environment.CurrentDirectory + "\\" + DirectoryDefine.VideoMsgPath + "\\" + FileId + ".mp4", CommonDefine.Cookies);
  521. me.MsgTime = DateTime.Now;
  522. me.FileId = FileId;
  523. me.FilePath = Environment.CurrentDirectory + "\\" + DirectoryDefine.VideoMsgPath + "\\" + FileId + ".mp4";//
  524. me.FileTempPath = Environment.CurrentDirectory + "\\" + DirectoryDefine.ImageMsgTempPath + "\\" + FileId + ".jpg";
  525. }
  526. else if (ali.MsgType == 1 && !string.IsNullOrWhiteSpace(ali.Url))
  527. {
  528. //地图消息
  529. me.MsgType = MsgTypeEnum.Map;
  530. me.MsgUrl = ali.Url;
  531. //地图消息
  532. string Url = string.Format(UrlDefine.MapUrl, ali.MsgId);
  533. //HttpHelper.ContentType = "";
  534. string FileId = MethodsHelper.MsgSaveFile(DirectoryDefine.MapImageMsgPath);//获取FileId
  535. //根据FileID创建本地的语音对象
  536. HttpMethods.GetFile(Url, Environment.CurrentDirectory + "\\" + DirectoryDefine.MapImageMsgPath + "\\" + FileId + ".jpg", CommonDefine.Cookies);
  537. me.FilePath = Environment.CurrentDirectory + "\\" + DirectoryDefine.MapImageMsgPath + "\\" + FileId + ".jpg";
  538. me.MsgTime = DateTime.Now;
  539. }
  540. else if (ali.MsgType == (int)MsgTypeEnum.SystemMsg)
  541. {
  542. me.MsgType = MsgTypeEnum.SystemMsg;
  543. me.MsgTime = DateTime.Now;
  544. }
  545. else
  546. {
  547. me.MsgType = MsgTypeEnum.Text;
  548. me.MsgTime = DateTime.Now;
  549. }
  550. LogWriter.Write(me.MsgContent.ToString(), LogPathDefine.WeChatLogPath);
  551. CommonMethodCallBackHandlers.OnReceivedMsgAnalyseMsgCompleted(me);
  552. SetAutoRepate(CommonDefine.WhiteUserList, LoadAutoReplyConfig(ConfigDefine.WeChatAutoReplyPath), me.MsgOwer.UserName, me);
  553. #endregion
  554. }
  555. }
  556. catch (Exception ex)
  557. {
  558. LogWriter.Write(ex.Message, LogPathDefine.ExceptionLogPath);
  559. }
  560. }
  561. #endregion
  562. #region 发送消息
  563. /// <summary>
  564. /// 发送消息
  565. /// </summary>
  566. /// <param name="Msg">消息体</param>
  567. /// <param name="IsAddChatList">是否添加到聊天列表</param>
  568. /// <param name="ToName">向谁发送</param>
  569. public static bool SendToOtherMsg(string Msg = "", string ToName = "")
  570. {
  571. string SendMsg = string.Empty;
  572. string LocalMsgId = MethodsHelper.GetClientMsgId();
  573. if (!string.IsNullOrWhiteSpace(Msg))
  574. SendMsg = Msg;
  575. string chaturl = UrlDefine.ChatUrl + CommonDefine.LoginResult.pass_ticket;
  576. SendMsgBodyEntity Smbe = new SendMsgBodyEntity() { BaseRequest = new BaseRequestEntity() { DeviceID = MethodsHelper.GetDeviceId(), Uin = CommonDefine.LoginResult.wxuin, Sid = CommonDefine.LoginResult.wxsid, Skey = CommonDefine.LoginResult.skey }, Msg = new SendMsgEntity() { Type = MsgTypeEnum.Text, FromUserName = CommonDefine.BaseContact.User.UserName, ToUserName = ToName, Content = Msg, LocalID = LocalMsgId, ClientMsgId = LocalMsgId } };
  577. string PostData = JsonConvert.SerializeObject(Smbe);
  578. string Result = HttpMethods.PostData(chaturl, PostData, CommonDefine.Cookies, Encoding.UTF8, "AcceptEncoding", "gzip, deflate").ContentData.ToString();
  579. SendMsgResultEntity Sre = JsonConvert.DeserializeObject<SendMsgResultEntity>(Result);
  580. if (Sre.BaseResponse.Ret == 0)
  581. {
  582. //消息发送成功
  583. CommonMethodCallBackHandlers.OnSendMsgCompleted(true);
  584. return true;
  585. }
  586. else
  587. {
  588. Console.WriteLine("发送失败:" + Result);
  589. CommonMethodCallBackHandlers.OnSendMsgCompleted(false);
  590. return false;
  591. }
  592. }
  593. #endregion
  594. #region 同步消息
  595. /// <summary>
  596. /// 对手机端信息进行同步
  597. /// </summary>
  598. /// <param name="FromUserName"></param>
  599. /// <param name="ToUserName"></param>
  600. public static void WebwxStatusNotify(string FromUserName, string ToUserName)
  601. {
  602. NotifyPhoneEntity Npe = new NotifyPhoneEntity();
  603. BaseRequestEntity br = new BaseRequestEntity();
  604. br.DeviceID = MethodsHelper.GetDeviceId();
  605. br.Sid = CommonDefine.LoginResult.wxsid;
  606. br.Skey = CommonDefine.LoginResult.skey;
  607. br.Uin = CommonDefine.LoginResult.wxuin;
  608. Npe.BaseRequest = br;
  609. Random ran = new Random();
  610. Npe.ClientMsgId = MethodsHelper.GetClientMsgId();// "1497590764" + ((int)ran.Next(0, 9)).ToString() + ((int)ran.Next(0, 9)).ToString() + ((int)ran.Next(0, 9)).ToString();
  611. Npe.Code = "1";
  612. Npe.FromUserName = FromUserName;
  613. Npe.ToUserName = ToUserName;
  614. string PostData = JsonConvert.SerializeObject(Npe);
  615. string list = HttpMethods.PostData(UrlDefine.WexNotifyUrl + CommonDefine.LoginResult.pass_ticket, PostData, CommonDefine.Cookies, Encoding.UTF8).ContentData.ToString();
  616. if (list != null)
  617. {
  618. SendMsgResultEntity Sre = JsonConvert.DeserializeObject<SendMsgResultEntity>(list);
  619. if (Sre.BaseResponse.Ret == 0)
  620. {
  621. }
  622. //if (list.Count >= 1)
  623. //{
  624. // Console.WriteLine(list[0].ToString());
  625. //}
  626. }
  627. }
  628. #endregion
  629. #region 自动回复
  630. /// <summary>
  631. /// 设置自动回复
  632. /// </summary>
  633. /// <param name="UserList">白名单</param>
  634. /// <param name="AutoRelyList">自动回复列表</param>
  635. /// <param name="UserName">用户名</param>
  636. /// <param name="MsgContent">消息内容(不用管)</param>
  637. internal static void SetAutoRepate(List<MemberListItemEntity> UserList, List<AutoRepateEntity> AutoRelyList, string UserName, MsgEntity MsgContent)
  638. {
  639. if (UserList == null) UserList = new List<MemberListItemEntity>();
  640. if (AutoRelyList.Count == 0)
  641. {
  642. LogWriter.Write("AutoReply为空!", LogPathDefine.WeChatLogPath);
  643. return;
  644. }
  645. try
  646. {
  647. string ReplyBody = "{0}{1},回复{2}关闭自动回复,回复{3}开启自动回复";
  648. string[] GroupNumber = new string[2];
  649. if (MsgContent.MsgContent.ToString().Contains(":"))
  650. {
  651. GroupNumber = MsgContent.MsgContent.ToString().Split(':');
  652. }
  653. var data = from item in UserList where item.UserName == UserName select item;
  654. if (data != null && data.ToList().Count > 0)
  655. {
  656. //说明当前用户在白名单中,所以不能设置自动回复
  657. }
  658. else
  659. {
  660. var CommnonReplyData = from item in AutoRelyList where item.AutoRepateType == AutoRepateEnum.CommnonReply select item;
  661. var ThanksReplyData = from item in AutoRelyList where item.AutoRepateType == AutoRepateEnum.ThanksReply select item;
  662. AutoRepateEntity CommnonReplyDataEntity = CommnonReplyData.SingleOrDefault();
  663. AutoRepateEntity ThanksReplyDataEntity = ThanksReplyData.SingleOrDefault();
  664. if (MsgContent.MsgContent.ToString() == CommnonReplyDataEntity.AutoReplySwitch)
  665. {
  666. //关闭自动回复
  667. CommonDefine.ContactsList.MemberList.ForEach(p =>
  668. {
  669. if (p.UserName == UserName)
  670. {
  671. p.IsCanAutoReply = false;
  672. MsgContent.IsCanAutoReply = false;
  673. }
  674. });
  675. SendToOtherMsg(ThanksReplyDataEntity.ReplyContent, UserName);
  676. }
  677. if (MsgContent.MsgContent.ToString() == ThanksReplyDataEntity.AutoReplySwitch)
  678. {
  679. CommonDefine.ContactsList.MemberList.ForEach(p =>
  680. {
  681. if (p.UserName == UserName)
  682. {
  683. p.IsCanAutoReply = true;
  684. MsgContent.IsCanAutoReply = true;
  685. }
  686. });
  687. }
  688. if (MsgContent.IsCanAutoReply)
  689. {
  690. string GroupName = string.Empty;
  691. if (GroupNumber != null && GroupNumber.Length > 0)
  692. GroupName = GroupNumber[0];
  693. SendToOtherMsg(string.Format(ReplyBody, UserName.Contains("@@") ? "" : GroupName, CommnonReplyDataEntity.ReplyContent, CommnonReplyDataEntity.AutoReplySwitch, ThanksReplyDataEntity.AutoReplySwitch), UserName);
  694. }
  695. }
  696. }
  697. catch (Exception ex)
  698. {
  699. LogWriter.Write(ex.Message, LogPathDefine.ExceptionLogPath);
  700. }
  701. }
  702. #endregion
  703. #region 发送文件
  704. /// <summary>
  705. /// 发送文件
  706. /// </summary>
  707. /// <param name="Fe">文件类型</param>
  708. /// <param name="FileData">文件byte</param>
  709. public static void SendFile(FileEntity Fe, byte[] FileData)
  710. {
  711. Fe.BaseRequest = new BaseRequestEntity() { DeviceID = MethodsHelper.GetDeviceId(), Uin = CommonDefine.LoginResult.wxuin, Sid = CommonDefine.LoginResult.wxsid, Skey = CommonDefine.LoginResult.skey };
  712. string Boundary = "------WebKitFormBoundaryUOlSZtOip6JP4NSr";
  713. HttpMethods.AddContent("id", "WU_FILE_0", Boundary);
  714. HttpMethods.AddContent("name", Fe.FileName, Boundary);
  715. HttpMethods.AddContent("type", Fe.FileType, Boundary);
  716. HttpMethods.AddContent("lastModifiedDate", Fe.FileModiftTime.ToLocalTime().ToString(), Boundary);
  717. HttpMethods.AddContent("size", Fe.DataLen.ToString(), Boundary);
  718. HttpMethods.AddContent("mediatype", Fe.Mediatype1, Boundary);
  719. HttpMethods.AddContent("uploadmediarequest", JsonConvert.SerializeObject(Fe), Boundary);
  720. HttpMethods.AddContent("webwx_data_ticket", CommonDefine.GetCookieDictionary == null ? "" : CommonDefine.GetCookieDictionary["webwx_data_ticket"], Boundary);//"gScOa2YvEEtszEvhoxdwXCeg"
  721. HttpMethods.AddContent("pass_ticket", CommonDefine.LoginResult.pass_ticket, Boundary);//"ekYYf2P7xOH5iI+oYrf/GiGrZhE+fUEGMiXe3Pq71rb4MDe+7ICbD+kglD4ZE+Ey"
  722. HttpMethods.AddContent("filename", Fe.FileName, Fe.FileType, FileData, Boundary);
  723. HttpMethods.OptionsDataMulitData(UrlDefine.SendFileUrl, CommonDefine.Cookies, Encoding.UTF8, Boundary);
  724. HttpMethods.PostDataMulitData(UrlDefine.SendFileUrl, CommonDefine.Cookies, Encoding.UTF8, Boundary);
  725. }
  726. #endregion
  727. #region 加载自动回复配置文件
  728. /// <summary>
  729. /// 读取自动回复配置文件
  730. /// </summary>
  731. /// <param name="path"></param>
  732. /// <returns></returns>
  733. internal static List<AutoRepateEntity> LoadAutoReplyConfig(string path)
  734. {
  735. try
  736. {
  737. List<AutoRepateEntity> ResultList = new List<AutoRepateEntity>();
  738. if (!File.Exists(path))
  739. return ResultList;
  740. ResultList = JsonConvert.DeserializeObject<List<AutoRepateEntity>>(File.ReadAllText(path));
  741. if (ResultList == null)
  742. return new List<AutoRepateEntity>();
  743. else
  744. return ResultList;
  745. }
  746. catch (Exception ex)
  747. {
  748. LogWriter.Write(ex.Message, LogPathDefine.ExceptionLogPath);
  749. return new List<AutoRepateEntity>();
  750. }
  751. }
  752. #endregion
  753. }
  754. }