WeiChat.cs 39 KB

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