WeiChat.cs 38 KB

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