/// <summary> /// 发送视频消息 /// </summary> /// <param name="host"></param> /// <param name="account"></param> /// <param name="toUserNameId"></param> /// <param name="mediaId"></param> /// <returns></returns> /// https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendvideomsg?fun=async&f=json&pass_ticket=%252FX8NCpFJfNmU%252Be%252FgE2dwRCN2D8Y8EBSKunfckAJmPfCeVD4YaubkaS2e767qiyAO /// https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendvideomsg?fun=async&f=json&lang=zh_CN&pass_ticket=KwMEOlgC57Dc1AwBwr7oaHekXX0P8fJE%252Bl0cLVocIrxdWNr%252F9URPGCAEmf%252FzfjEK public static HttpTaskParams GetSendVideoMsg(string host, WxAccount account, string toUserNameId, string mediaId) { string url = string.Format("{0}?fun=async&f=json&lang=zh_CN&pass_ticket={1}", WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_SEND_VIDEO_MSG), encoding(account.PassTicket)); HttpTaskParams htp = HttpTaskParams.NewPost(url); htp.ContentType = "application/json;charset=UTF-8"; WxSendMsgReq req = new WxSendMsgReq(); req.BaseRequest = WxReqUtil.GetIdentifyReq(account); req.Scene = 0; WxSendMediaMsg msg = new WxSendMediaMsg(); msg.Type = 43;//视频 msg.MediaId = mediaId; msg.FromUserName = account.UserName; msg.ToUserName = toUserNameId; string msgId = TimeUtil.CurrentTimeMillis() + TextUtil.RandomNumber(4); msg.LocalID = msgId; msg.ClientMsgId = msgId; msg.Content = string.Empty; req.Msg = msg; htp.CustomStringContentBody = JsonConvert.SerializeObject(req); return(htp); }
public void UpdateAccountStatus() { if (wxUin != null) { WxAccount account = new WxAccount(); account.WxUin = wxUin; //account.Status = status; //logout:1 login:0 account.Sid = sessionId; account.Userid = this.chatForm.user.Id; String userSid = this.chatForm.user.userSid; DateTime timeStamp = new DateTime(1970, 1, 1); //得到1970年的时间戳 long a = (DateTime.UtcNow.Ticks - timeStamp.Ticks) / 10000000; //注意这里有时区问题,用now就要减掉8个小时 account.Timestamp = a.ToString(); String token = account.Timestamp + this.chatForm.conStr + account.Userid + userSid; account.Token = LoginForm.GetMd5(32, token); IWxAccount wxAccount = new WxAccountMapper(); Result result = wxAccount.updateStatus(account); if (result.Code != 200 && this.chatForm.sessionStatus != SessionStatus.expire) { this.chatForm.callback_showExpireBox(result.Message); } } }
/// <summary> /// 获取微信所有联系人 /// </summary> /// <param name="wxAccount"></param> /// <returns></returns> /// https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact /// ?lang=zh_CN /// &pass_ticket=9%252FuIrFpoM6CCrYsAV7mzDF0aFkHiXGlotDlmHbQokhM%253D /// &r=1501480039623 /// &seq=0 /// &skey=@crypt_77e833b9_e705acd2a3250d78bdbb1137d87afad5 public static HttpTaskParams GetContactAllParams(string host, WxAccount wxAccount) { string url = string.Format("{0}?lang=zh_CN&pass_ticket={1}&r={2}&seq=0&skey={3}", WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_CONTACT_ALL), encoding(wxAccount.PassTicket), TimeUtil.CurrentTimeMillis(), encoding(wxAccount.Skey)); return(HttpTaskParams.NewGet(url)); }
private WxContactAllResult executeGetContactAllHttpTask(string host, WxAccount wxAccount) { try { HttpTask ht = syncCreateHttpTask(WxHtpUtil.GetContactAllParams(host, wxAccount)); return(ht.ExecuteJson <WxContactAllResult>()); } catch { } return(null); }
private string executeLogout(string host, WxAccount wxAccount) { if (wxAccount == null) { return(null); } else { return(executeLogout(host, wxAccount.Skey, wxAccount.Uin, wxAccount.Sid)); } }
/// <summary> /// 获取微信状态通知 /// </summary> /// <param name="result"></param> /// <returns></returns> /// https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify /// ?lang=zh_CN /// &pass_ticket=zXbwZhRifdRRNcPjsjxyemYskxzSRQOxZF6T3HJuTpsdgPENMSMXylIlmsnrEZ5s public static HttpTaskParams GetStatusNotify(string host, WxAccount wxAccount) { string url = string.Format("{0}?lang={1}&pass_ticket={2}", WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_STATUS_NOTIFY), "zh_CN", encoding(wxAccount.PassTicket)); HttpTaskParams htp = HttpTaskParams.NewPost(url); htp.ContentType = "application/json;charset=utf-8"; htp.CustomStringContentBody = JsonConvert.SerializeObject(WxReqUtil.GetStatusNotifyReq(wxAccount)); return(htp); }
public static BoolAny <WxAccount> WxDBUpdateAccount(UserInfoJson userinfo, BaseDBContext wdb, bool isAttend) { try { WxAccount newWa = wdb.WxAccount.Find(userinfo.openid); if (newWa == null) { newWa = new WxAccount() { subscribe = isAttend, regDate = DateTime.Now, //subscribe_time = LIB.DateTimeEx.TimeStampToDateTime(userinfo.subscribe_time), subscribe_time = DateTime.Now, openid = userinfo.openid, lastDate = DateTime.Now, headimgurl = userinfo.headimgurl, nickname = userinfo.nickname, sex = userinfo.sex.ToString(), groupid = userinfo.groupid.ToString(), remark = userinfo.remark, unionid = userinfo.unionid, studentId = 0 }; wdb.WxAccount.Add(newWa); } else { newWa.subscribe = isAttend; newWa.headimgurl = userinfo.headimgurl; newWa.nickname = userinfo.nickname; newWa.sex = userinfo.sex.ToString(); newWa.groupid = userinfo.groupid.ToString(); newWa.remark = userinfo.remark; } wdb.SaveChanges(); //debug.log("WxDBUpdateAccount_DBSave", newWa); return(BoolAny <WxAccount> .succeed(newWa)); } catch (DbEntityValidationException dbEx) { debug.log("WxDBUpdateAccount_DBSave_异常", dbEx.Message); //debug.print("addAccount_error", e.Message); return(BoolAny <WxAccount> .fail(dbEx.Message)); } }
private WxSyncMsgResult executeSyncMsgHttpTask(string host, WxAccount wxAccount, WxSyncKey wxSyncKey) { try { HttpTask ht = syncCreateHttpTask(WxHtpUtil.GetSyncMsgParams(host, wxAccount, wxSyncKey)); if (ht != null) { WxSyncMsgResult result = ht.ExecuteJson <WxSyncMsgResult>(); return(result); } } catch { } return(null); }
/// <summary> /// 获取同步检查参数 /// </summary> /// <param name="account"></param> /// <param name="deviceId"></param> /// <param name="wxSyncKey"></param> /// <returns></returns> /// https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck /// ?r=1501480039641 /// &skey=%40crypt_77e833b9_e705acd2a3250d78bdbb1137d87afad5&sid=TlG7spFxhWig3TpY /// &uin=243082945 /// &deviceid=e835949820036438 /// &synckey=1_653730215%7C2_653730255%7C3_653730169%7C1000_1501462441 /// &_=1501479916949 public static HttpTaskParams GetSyncCheckParams(string host, WxAccount wxAccount, WxSyncKey wxSyncKey) { HttpTaskParams htp = HttpTaskParams.NewGet(WxHttpApi.GetWebPushUrl(host, WxHttpApi.URL_WX_MSG_CHECK)); htp.AddStringParam("skey", wxAccount.Skey); htp.AddStringParam("uin", wxAccount.Uin); htp.AddStringParam("sid", wxAccount.Sid); htp.AddStringParam("deviceid", wxAccount.DeviceId); htp.AddStringParam("synckey", WxReqUtil.GetSyncKey2String(wxSyncKey)); long millis = TimeUtil.CurrentTimeMillis(); htp.AddStringParam("r", millis.ToString()); htp.AddStringParam("_", (millis / 1000).ToString());//时间戳取反 return(htp); }
private WxSyncCheckResult executeSyncCheckHttpTask(string host, WxAccount wxAccount, WxSyncKey wxSyncKey) { try { HttpTask ht = syncCreateHttpTask(WxHtpUtil.GetSyncCheckParams(host, wxAccount, wxSyncKey)); if (ht != null) { WxSyncCheckResult result = WxRespUtil.ParseWxSyncKeyResult(ht.ExecuteString()); return(result); } } catch { } return(null); }
public async Task SetAsync(WxAccount account) { if (account.SiteId <= 0) { return; } if (account.Id > 0) { await _repository.UpdateAsync(account); } else { await _repository.InsertAsync(account); } }
/// <summary> /// 群踢人 /// </summary> /// <param name="account"></param> /// <param name="userNameId"></param> /// <param name="groupUserNameId"></param> /// <returns></returns> public static HttpTaskParams GetGroupContactDelMember(string host, WxAccount account, string userNameId, string groupUserNameId) { string url = string.Format("{0}?fun=delmember&lang=zh_CN&pass_ticket={1}", WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_GROUP_DEL_MEMBER), encoding(account.PassTicket)); HttpTaskParams htp = HttpTaskParams.NewPost(url); htp.ContentType = "application/json;charset=UTF-8"; WxGroupMemberReq req = new WxGroupMemberReq(); req.BaseRequest = WxReqUtil.GetIdentifyReq(account); req.DelMemberList = userNameId; req.ChatRoomName = groupUserNameId; htp.CustomStringContentBody = JsonConvert.SerializeObject(req); return(htp); }
/// <summary> /// 已经关注 /// </summary> /// <returns></returns> public static Boolean WxIsAttendByDB(string openid) { bool attend = false; using (BaseDBContext wdb = new BaseDBContext()) { WxAccount newWa = wdb.WxAccount.Find(openid); if (newWa == null) { attend = false; } else { attend = newWa.subscribe; } } return(attend); }
public Result updateStatus(WxAccount account) { Result result = new Result(); HttpClient http = new HttpClient(new HttpClientHandler()); http.DefaultRequestHeaders.ExpectContinue = false; try { String url = Uri.server_address + "index.php?m=Home&c=Rawdata&a=updateWxAccountStatus"; String jsondata = JsonHelper.SerializeObject(account); var content = new StringContent(jsondata, Encoding.UTF8, "application/json"); //await异步等待回应 var response = http.PostAsync(url, content).Result; //确保HTTP成功状态值 response.EnsureSuccessStatusCode(); //await异步读取最后的JSON String resdata = response.Content.ReadAsStringAsync().Result; JObject o = JObject.Parse(resdata); int code = (int)o.SelectToken("code"); String msg = (String)o.SelectToken("message"); result.Code = code; result.Message = msg; } catch (Exception e) { log.Error(e.Message, e); result.Code = 500; result.Message = "网络异常或请求超时"; } finally { http.Dispose(); } return(result); }
/// <summary> /// 新增或更新关注用户信息 /// </summary> /// <returns></returns> public static BoolAny <WxAccount> WxDBUpdateAccount(string openid, BaseDBContext wdb, bool isAttend) { try { WxAccount newWa = wdb.WxAccount.Find(openid); if (isAttend) { if (newWa == null) { newWa = new WxAccount() { subscribe = true, regDate = DateTime.Now, subscribe_time = DateTime.Now, openid = openid, lastDate = DateTime.Now }; wdb.WxAccount.Add(newWa); } else { newWa.subscribe = true; } //debug.log("WxDBUpdateAccount_string_Attend", newWa); } else { //debug.log("WxDBUpdateAccount_string_UnAttend", newWa); if (newWa != null) { newWa.subscribe = false; } } wdb.SaveChanges(); return(BoolAny <WxAccount> .succeed(newWa)); } catch (Exception e) { //debug.print("addAccount_error", e.Message); return(BoolAny <WxAccount> .fail(e.Message)); } }
/// <summary> /// 批量获取联系人,包含个人和组 /// </summary> /// <param name="wxAccount"></param> /// <param name="groupUserNames"></param> /// <returns></returns> /// //https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact /// ?type=ex /// &r=1498291861743 /// &lang=zh_CN /// &pass_ticket=ga8bxGb9YQJLWhU6RA6FMamJy0wqnD7QuWP9k%252F9tlTb8O1uUkgcZ7YbjNg3bEkYH public static HttpTaskParams GetBatchContactParams(string host, WxAccount wxAccount, List <string> groupUserNameIds) { string url = string.Format("{0}?type=ex&r={1}&lang=zh_CN&pass_ticket={2}", WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_CONTACT_BATCH), TimeUtil.CurrentTimeMillis(), encoding(wxAccount.PassTicket)); HttpTaskParams htp = HttpTaskParams.NewPost(url); htp.ContentType = "application/json;charset=utf-8"; WxBatchContactReq req = new WxBatchContactReq(); req.BaseRequest = WxReqUtil.GetIdentifyReq(wxAccount); req.Count = CollectionUtil.Size(groupUserNameIds); req.List = WxReqUtil.GetBatchContactItemList(groupUserNameIds); htp.CustomStringContentBody = JsonConvert.SerializeObject(req); return(htp); }
public static HttpTaskParams GetUploadImage(string host, WxAccount account, string toUserNameId, string imagePath) { string url = string.Format("{0}?f=json", WxHttpApi.GetFileUploadUrl(host, WxHttpApi.URL_WX_FILE_UPLOAD)); HttpTaskParams htp = HttpTaskParams.NewPost(url); FileInfo info = new FileInfo(imagePath); htp.AddStringParam("id", "WU_FILE_" + fileCount); htp.AddStringParam("name", info.Name); htp.AddStringParam("type", "image/jpeg"); htp.AddStringParam("lastModifiedDate", info.LastWriteTime.ToString("r", DateTimeFormatInfo.InvariantInfo)); htp.AddStringParam("size", info.Length.ToString()); htp.AddStringParam("mediatype", "pic"); htp.AddStringParam("webwx_data_ticket", account.DataTicket); htp.AddStringParam("pass_ticket", account.PassTicket); htp.AddFileParam("filename", imagePath, WxReqUtil.GetImageMimeType(info)); htp.AddStringParam("uploadmediarequest", WxReqUtil.GetUploadMediaRequestBody(account, toUserNameId, info, imagePath)); return(htp); }
/// <summary> /// 同步获取更新消息 /// </summary> /// <param name="account"></param> /// <param name="syncKey"></param> /// <returns></returns> /// https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync /// ?sid=XbUcBWzGt6NPu5jO /// &skey=@crypt_55085584_cf738edf865a9c101021022d1c732ae6 /// &lang=zh_CN /// &pass_ticket=lBIvUtbeb5e%252BMIDHLr5QVehuJDPbW3NEgMSh87ILAOv3ue1HdLtSV%252B8AK0ULznEL public static HttpTaskParams GetSyncMsgParams(string host, WxAccount account, WxSyncKey syncKey) { string url = string.Format("{0}?sid={1}&skey={2}&pass_ticket={3}&lang={4}", WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_MSG_PULL), encoding(account.Sid), encoding(account.Skey), encoding(account.PassTicket), "zh_CN"); HttpTaskParams htp = HttpTaskParams.NewPost(url); htp.ContentType = "application/json;charset=UTF-8"; WxWebSyncReq req = new WxWebSyncReq(); req.BaseRequest = WxReqUtil.GetIdentifyReq(account); req.SyncKey = syncKey; req.rr = (~(TimeUtil.CurrentTimeMillis() / 1000)).ToString();//时间戳取反 htp.CustomStringContentBody = JsonConvert.SerializeObject(req); return(htp); }
/// <summary> /// 同步AccessToken /// </summary> /// <returns></returns> public async Task <string> GetAccessTokenAsync() { try { WxAccount account = await databaseFixture.Db.WxAccount.FindAsync(); if (account.AccessTokenCreateTime == null || account.AccessTokenCreateTime.Value.AddSeconds(6000) < DateTime.Now) { try { string accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token"; var request = new RestRequest(Method.GET); request.AddParameter("grant_type", "client_credential"); request.AddParameter("appid", account.AppId); request.AddParameter("secret", account.AppSecret); var client = new RestClient(accessTokenUrl); IRestResponse response = await client.ExecuteTaskAsync(request); AccessToken accessToken = JsonConvert.DeserializeObject <AccessToken>(response.Content); account.AccessToken = accessToken.access_token; account.AccessTokenCreateTime = DateTime.Now; await databaseFixture.Db.WxAccount.UpdateAsync(account); return(accessToken.access_token); } catch (Exception ex) { return(null); } } else { return(account.AccessToken); } } catch (Exception ex) { return(null); } }
public static AccountSession CreateAccountSession(WxAccount wa, Student s) { debug.log("CreateAccountSession", wa); if (wa == null /*|| !wa.subscribe*/) { return(null); } var g = s == null?null: s.StudentGroup == null?null: s.StudentGroup.FirstOrDefault(); return(new AccountSession() { ExpDate = DateTime.Now.AddDays(accountExpDay), //groupName =s==null?"": g==null?"":g.Name, openid = wa.openid, studentId = s == null ? 0 : s.Id, workId = s == null ? "" : s.WorkID, name = s == null ? "" : s.Name, LoginDate = DateTime.Now, }); }
private void executeStatusNotifyHttpTask(string host, WxAccount wxAccount) { try { HttpTask ht = syncCreateHttpTask(WxHtpUtil.GetStatusNotify(host, wxAccount)); if (ht != null) { WxSendMsgResult msgResult = ht.ExecuteJson <WxSendMsgResult>(); #if Debug if (msgResult == null) { Console.WriteLine("status notify result = null"); } else { Console.WriteLine("status notify result ret code = " + msgResult.BaseResponse.Ret + ", msg id=" + msgResult.MsgID); } #endif } } catch { } }
/// <summary> /// 上传视频文件 /// </summary> /// <param name="host"></param> /// <param name="account"></param> /// <param name="toUserNameId"></param> /// <param name="videoPath"></param> /// <returns></returns> /// https://file.wx.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json public static HttpTaskParams GetUploadVideo(string host, WxAccount account, string toUserNameId, string videoPath) { string url = string.Format("{0}?f=json", WxHttpApi.GetFileUploadUrl(host, WxHttpApi.URL_WX_FILE_UPLOAD)); HttpTaskParams htp = HttpTaskParams.NewPost(url); FileInfo info = new FileInfo(videoPath); htp.AddStringParam("id", "WU_FILE_" + fileCount); htp.AddStringParam("name", info.Name); htp.AddStringParam("type", WxReqUtil.GetVideoMimeType(info));//"video/mp4" htp.AddStringParam("lastModifiedDate", info.LastWriteTime.ToString("r", DateTimeFormatInfo.InvariantInfo)); htp.AddStringParam("size", info.Length.ToString()); htp.AddStringParam("chunks", "1"); //分段数,这里一次上传,不分段 htp.AddStringParam("chunk", "0"); //第几段 htp.AddStringParam("mediatype", "video"); htp.AddStringParam("uploadmediarequest", WxReqUtil.GetUploadMediaRequestBody(account, toUserNameId, info, videoPath)); htp.AddStringParam("webwx_data_ticket", account.DataTicket); htp.AddStringParam("pass_ticket", account.PassTicket); htp.AddFileParam("filename", videoPath); return(htp); }
/// <summary> /// 取消关注 /// </summary> /// <returns></returns> public static Boolean WxCancelAttend(string openid) { try { using (BaseDBContext wdb = new BaseDBContext()) { WxAccount newWa = wdb.WxAccount.Find(openid); if (newWa != null) { newWa.subscribe = false; newWa.lastDate = DateTime.Now; wdb.SaveChanges(); } wdb.SaveChanges(); } } catch (Exception e) { //debug.print("cancelAttend", e.Message); return(false); } return(true); }
private void DownloadWxAccount(DateTime beginDate, DateTime endDate, string type) { do { string date = beginDate.ToString("yyyyMMdd"); //date格式:20180808 //type格式: //【ALL 所有订单信息 //SUCCESS 成功支付的订单 //REFUND 退款订单 //REVOKED 撤销的订单】 string result = DownloadBill.Run(date, type); int currentIndex = 0; //当前索引 string line = ""; //每行内容 int count = 0; //总行数 int maxCount = 0; //所需读取数据数 //读取流 StringReader reader = null; #region 计算读取数 reader = new StringReader(result); while (line != null) { line = reader.ReadLine(); count++; } //所需读取数据数 maxCount = count - 4; //重置 line = ""; //关闭流 reader.Close(); #endregion #region 校验是否需要保存数据 #region 过滤条件 List <DataFilter> filters = new List <DataFilter>(); //大于等于起始日期 filters.Add(new DataFilter { comparison = "gteq", field = "PayTime", type = "date", value = beginDate.ToString("yyyy-MM-dd 00:00:00") }); //小于等于起始日期 filters.Add(new DataFilter { comparison = "lteq", field = "PayTime", type = "date", value = beginDate.ToString("yyyy-MM-dd 23:59:59") }); #endregion //校验是否需要保存微信账单 bool isSave = wxAccountDao.CheckIsSave(filters, maxCount); if (isSave) { //需要保存 //删除历史数据 wxAccountDao.Delete(filters); } else { //不需要保存 //增加天数 beginDate = beginDate.AddDays(1); continue; } #endregion #region 保存数据 reader = new StringReader(result); //不读取超出的数据 while (line != null && currentIndex <= maxCount) { line = reader.ReadLine(); #region 读取数据行 if (currentIndex > 0) { string[] accounts = line.Split(','); //店铺名称 string storeName = accounts[20].Trim().Split(' ')[0]; //支付方式 string payModel = ""; //门店名称分割出支付方式时,因提供的格式不对有可能分割出现报错 try { payModel = accounts[20].Trim().Split(' ')[1]; } catch (Exception) { } //费率 decimal rate = Convert.ToDecimal(accounts[23].Trim().Split('%')[0]); WxAccount entity = new WxAccount { PayTime = Convert.ToDateTime(accounts[0].Trim()), //交易时间 AppId = accounts[1].Trim(), //AppID MchId = accounts[2].Trim(), //商户号 SpecialMchId = accounts[3].Trim(), //特约商户号 DeviceId = accounts[4].Trim(), //设备号 OrderNo = accounts[5].Trim(), //微信订单号 MchOrderNo = accounts[6].Trim(), //商户订单号 UserOpenId = accounts[7].Trim(), //用户OpenId PayType = accounts[8].Trim(), //交易类型 PayState = accounts[9].Trim(), //交易状态 PayBank = accounts[10].Trim(), //付款银行 MoneyType = accounts[11].Trim(), //货币种类 DiscountsTotal = Convert.ToDecimal(accounts[12].Trim()), //应结订单金额 CouponPrice = Convert.ToDecimal(accounts[13].Trim()), //代金券金额 RefundOrderNo = accounts[14].Trim(), //微信退款单号 MchRefundOrderNo = accounts[15].Trim(), //商户退款单号 RefundPrice = Convert.ToDecimal(accounts[16].Trim()), //退款金额 CouponRefundPrice = Convert.ToDecimal(accounts[17].Trim()), //充值券退款金额 RefundType = accounts[18].Trim(), //退款类型 RefundState = accounts[19].Trim(), //退款状态 StoreName = storeName, //店铺名称 PayModel = payModel, //支付方式 DataPackage = accounts[21].Trim(), //商户数据包 ServicePrice = Convert.ToDecimal(accounts[22].Trim()), //手续费 Rate = rate, //费率 Total = Convert.ToDecimal(accounts[24].Trim()), //订单金额 SendRefundPrice = Convert.ToDecimal(accounts[25].Trim()), //申请退款金额 RateRemark = accounts[26].Trim() //费率备注 }; wxAccountDao.Stateless_Insert(entity); } #endregion currentIndex++; } //关闭流 reader.Close(); #endregion //增加天数 beginDate = beginDate.AddDays(1); } while (beginDate <= endDate); }
public CustomMessageHandler(IWxManager wxManager, IWxChatRepository wxChatRepository, WxAccount account, Stream inputStream, PostModel postModel, int maxRecordCount = 0, bool onlyAllowEncryptMessage = false) : base(inputStream, postModel, maxRecordCount, onlyAllowEncryptMessage) { _wxManager = wxManager; _wxChatRepository = wxChatRepository; _wxAccount = account; }
private void TreeView1_AfterSelect(object sender, TreeViewEventArgs e) { string wxid = e.Node.Tag as string; string id = e.Node.Name; switch (wxid) { case "通讯录": { panel1.Hide(); panel3.Hide(); panel2.Show(); panel2.Dock = DockStyle.Fill; this.dataGridView1.DataSource = null; using (SqliteDbContext context = new SqliteDbContext()) { this.dataGridView1.DataSource = context.WxFriends .Where(friend => friend.Type == 3) .ToList(); } break; } case "公众号": { panel1.Hide(); panel3.Hide(); panel2.Show(); panel2.Dock = DockStyle.Fill; this.dataGridView1.DataSource = null; using (SqliteDbContext context = new SqliteDbContext()) { this.dataGridView1.DataSource = context.WxFriends .Where(friend => friend.Type == 0) .ToList(); } break; } case "应用程序": { panel1.Hide(); panel3.Hide(); panel2.Show(); panel2.Dock = DockStyle.Fill; this.dataGridView1.DataSource = null; using (SqliteDbContext context = new SqliteDbContext()) { this.dataGridView1.DataSource = context.WxFriends .Where(friend => friend.Type == 33) .ToList(); } break; } case "聊天记录": { Name = "聊天记录"; panel1.Hide(); panel2.Hide(); panel3.Show(); dataGridView2.Show(); panel3.Dock = DockStyle.Fill; this.dataGridView2.Rows.Clear(); this.richTextBoxEx1.Clear(); using (SqliteDbContext context = new SqliteDbContext()) { this.dataGridView2.Rows.AddRange( context.WxFriends .Where(friend => friend.Type == 3) .Select(new Func <WxFriend, DataGridViewRow>((f) => { var row = new DataGridViewRow(); row.CreateCells(this.dataGridView2, new[] { f.NickName, context.WxMessages.Count(m => m.WxId == f.WxId).ToString() }); return(row); })) .ToArray()); } break; } case "群聊天记录": { panel1.Hide(); panel2.Hide(); panel3.Show(); dataGridView2.Show(); panel3.Dock = DockStyle.Fill; this.dataGridView2.Rows.Clear(); this.richTextBoxEx1.Clear(); using (SqliteDbContext context = new SqliteDbContext()) { this.dataGridView2.Rows.AddRange( context.WxFriends .Where(friend => friend.Type == 4) .Select(new Func <WxFriend, DataGridViewRow>((f) => { var row = new DataGridViewRow(); row.CreateCells(this.dataGridView2, new[] { f.NickName, context.WxMessages.Count(m => m.WxId == f.WxId).ToString() }); return(row); })) .ToArray()); } break; } case "朋友圈": { Name = "朋友圈"; panel1.Hide(); panel2.Hide(); panel3.Show(); dataGridView2.Show(); panel3.Dock = DockStyle.Fill; this.dataGridView2.Rows.Clear(); this.richTextBoxEx1.Clear(); using (SqliteDbContext context = new SqliteDbContext()) { this.dataGridView2.Rows.AddRange( context.WxFriends .Where(friend => friend.Type == 3) .Select(new Func <WxFriend, DataGridViewRow>((f) => { var row = new DataGridViewRow(); row.CreateCells(this.dataGridView2, new[] { f.NickName, context.WxSns.Count(s => s.WxId == f.WxId).ToString() }); return(row); })) .ToArray()); } break; } case "新朋友": { panel1.Hide(); panel3.Hide(); panel2.Show(); panel2.Dock = DockStyle.Fill; this.dataGridView1.DataSource = null; using (SqliteDbContext context = new SqliteDbContext()) { this.dataGridView1.DataSource = context.WxNewFriend.ToList(); } break; } default: { panel2.Hide(); panel3.Hide(); panel1.Show(); panel1.Dock = DockStyle.Fill; WxAccount acc = null; using (SqliteDbContext context = new SqliteDbContext()) { acc = context.WxAccounts.FirstOrDefault(a => a.WxId == wxid); } if (acc == null) { if (Types != null && Types.Count > 0) { foreach (TreeNodeTypes tnt in Types) { if (Convert.ToString(tnt.Id) == id) { lblCode.Text = tnt.Value; lblName.Text = tnt.Name; label8.Text = string.Empty; label9.Text = string.Empty; label10.Text = string.Empty; break; } } } } else { lblCode.Text = acc.WxId; lblName.Text = acc.Sign; label8.Text = acc.Phone; label9.Text = acc.NickName; label10.Text = acc.District; } break; } } }
/// <summary> 执行消息同步循环 </summary> /// <param name="wxAccount"></param> /// <param name="wxSyncKey"></param> private int executeSyncMsgLoop(string host, WxAccount wxAccount, WxSyncKey wxSyncKey) { //默认账号离线状态 int code = WxResultCode.ACCOUNT_OFFLINE; while (true) { WxSyncCheckResult syncCheckResult = executeSyncCheckHttpTask(host, wxAccount, wxSyncKey); #if Debug Console.WriteLine("host = " + host + ", synckey reuslt = " + (syncCheckResult == null ? "null" : syncCheckResult.Retcode.ToString())); #endif if (!syncCheckLoginInState()) { //检测登录状态 break; } else if (syncCheckResult == null) { //心跳请求异常 } else if (syncCheckResult.IsStateSuccess)//0 { //心跳请求成功 if (syncCheckResult.Selector != 0) { //有消息需要同步 WxSyncMsgResult syncMsgResult = executeSyncMsgHttpTask(host, wxAccount, wxSyncKey); #if Debug Console.WriteLine("websync reuslt = " + (syncMsgResult == null ? "null" : syncMsgResult.BaseResponse.Ret.ToString())); #endif if (!syncCheckLoginInState()) { //检测登录状态 break; } else if (syncMsgResult == null) { //同步消息请求异常 } else if (syncMsgResult.IsStateSuccess) { //同步消息请求成功 wxSyncKey = syncMsgResult.SyncCheckKey; OnWxTaskReceiveMsgHandler?.Invoke(wxAccount, syncMsgResult); } else { //同步消息请求失败 code = syncCheckResult.Retcode; break; } } } else { //心跳请求失败 code = syncCheckResult.Retcode; break; } ThreadUtil.Sleep(1000); if (!syncCheckLoginInState()) { break; } } return(code); }
/// <summary> 线程任务 </summary> private void run() { //初始化cookie容器 mCookieContainer = new CookieContainer(); //获取微信登录随机设备Id string deviceId = WxUtil.GetRandomDeviceId(); #if Debug Console.WriteLine("WxTask login device id = " + deviceId); #endif //获取登录uid------------------------------------------ WxLoginUidResult loginUidResult = executeLoginUidHttpTask(); #if Debug Console.WriteLine("WxTask login uid = " + (loginUidResult == null ? "null" : loginUidResult.Uid)); #endif if (!syncCheckLoginingState()) { return; } //检测uid if (!WxResultUtil.CheckLoginUidResult(loginUidResult)) { callbackLoginFailed(WxLoginCode.UID_ERROR); return; } //获取微信登录二维码----------------------------------------------- byte[] qrCodeBytes = executeLoginQrCodeHttpTask(loginUidResult.Uid); #if Debug Console.WriteLine("WxTask login qrcode = " + (qrCodeBytes == null ? "null" : "has qr code")); #endif if (!syncCheckLoginingState()) { return; } if (qrCodeBytes == null) { callbackLoginFailed(WxLoginCode.QRCODE_ERROR); return; } //二维码回调 OnWxTaskLoginQrCodeHandler?.Invoke(qrCodeBytes); //检测扫描登录----------------------------------------------------------------- WxLoginScanResult loginScanResult = executeLoginScanHttpTask(loginUidResult.Uid); #if Debug Console.WriteLine("WxTask login scan = " + (loginScanResult == null ? "null" : loginScanResult.ToString())); #endif if (!syncCheckLoginingState()) { return; } if (!WxResultUtil.CheckLoginScanResult(loginScanResult)) { if (WxResultUtil.CheckLoginScanExpired(loginScanResult)) { callbackLoginFailed(WxLoginCode.SCAN_EXPIRED); } else { callbackLoginFailed(WxLoginCode.SCAN_ERROR); } return; } //开始登录操作回调----------------------------------- OnWxTaskLoginPreHandler?.Invoke(); //登录步骤完成,已获取各种唯一标识符,如果该步完成,手机端显示已登录-------------------------- WxLoginIdsResult loginIdsResult = executeLoginRedirectUriHttpTask(loginScanResult.RedirectUri); #if Debug Console.WriteLine("WxTask login ids = " + (loginIdsResult == null ? "null" : loginIdsResult.ToString())); #endif //设置全局host if (WxResultUtil.CheckLoginIdsResult(loginIdsResult)) { setHost(loginIdsResult.RouteHost); } if (!syncCheckLoginingState()) { if (WxResultUtil.CheckLoginIdsResult(loginIdsResult)) { executeLogout(GetHost(), loginIdsResult.Skey, loginIdsResult.Uin, loginIdsResult.Sid); } return; } if (!WxResultUtil.CheckLoginIdsResult(loginIdsResult)) { if (WxResultUtil.CheckLoginIdsAccountClosure(loginIdsResult))/*loginIdsResult != null && loginIdsResult.IsAccountException()*/ { callbackLoginFailed(WxLoginCode.IDS_ACCOUNT_CLOSURE); } else { callbackLoginFailed(WxLoginCode.IDS_ERROR); } return; } //访问初始化接口,这里面才有昵称-------------------------------------------------------- WxLoginInitResult loginInitResult = executeLoginInitHttpTask(GetHost(), loginIdsResult, deviceId); #if Debug Console.WriteLine("WxTask login init = " + (loginInitResult == null ? "null" : loginInitResult.ToString())); #endif if (!syncCheckLoginingState()) { executeLogout(GetHost(), loginIdsResult.Skey, loginIdsResult.Uin, loginIdsResult.Sid); return; } if (!WxResultUtil.CheckResultSuccess(loginInitResult)) { callbackLoginFailed(WxLoginCode.INIT_ERROR); executeLogout(GetHost(), loginIdsResult.Skey, loginIdsResult.Uin, loginIdsResult.Sid); return; } //创建登录账号对象-------------------------------------------------------- WxAccount wxAccount = WxUtil.CreateWxAccount(loginIdsResult, loginInitResult, deviceId); //标记登录状态 syncSetLoginState(STATE_LOGINED); //发送状态通知消息,一定要发 if (syncCheckLoginInState()) { executeStatusNotifyHttpTask(GetHost(), wxAccount); } //微信登录成功回调 OnWxTaskLoginSuccessHandler?.Invoke(wxAccount); //微信初始化回调 OnWxTaskLoginInitHandler?.Invoke(wxAccount, loginInitResult); //获取所有联系人,一定要先获取 if (syncCheckLoginInState()) { WxContactAllResult contactAllResult = executeGetContactAllHttpTask(GetHost(), wxAccount); if (WxResultUtil.CheckResultSuccess(contactAllResult) && syncCheckLoginInState()) { OnWxTaskLoginGetContactAllHandler?.Invoke(wxAccount, contactAllResult.MemberList); } } //开始循环同步消息 int syncCode = WxResultCode.ACCOUNT_OFFLINE; if (syncCheckLoginInState()) { syncCode = executeSyncMsgLoop(GetHost(), wxAccount, loginInitResult.SyncKey); } //先给登出回调,再做登出请求操作 WxLogoutCode code = syncGetLogoutCode(syncCode); OnWxTaskLogoutHandler?.Invoke(wxAccount, code); string result = executeLogout(GetHost(), wxAccount); #if Debug Console.WriteLine("WxTask logout WxLogoutCode = " + code + ", nickName=" + wxAccount.NickName); #endif }
private void DataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e) { try { DataGridViewCheckBoxCell dgcc = (DataGridViewCheckBoxCell)this.dataGridView2.Rows[e.RowIndex].Cells[0]; Boolean flag = Convert.ToBoolean(dgcc.Value); dgcc.Value = flag == true ? false : true; } catch (Exception) { } if (e.RowIndex < 0) { return; } using (SqliteDbContext context = new SqliteDbContext()) { richTextBoxEx1.Clear(); string nickName = this.dataGridView2.Rows[e.RowIndex].Cells[0].Value as string; WxFriend friend = context.WxFriends.FirstOrDefault(f => f.NickName == nickName);//仅查找一条数据 WxAccount account = context.WxAccounts.FirstOrDefault(a => a.Id == 1); if (friend == null)//如果没有找到 { return; } if (Name == "聊天记录") { //(treeView1.selectedNode.Name == “name1”) var messages = context.WxMessages // .Where(m => m.WxId == friend.WxId) .OrderBy(m => m.CreateTime) .ToList(); messages.ForEach(m => { if (m.IsSend == 1) { richTextBoxEx1.SelectionAlignment = HorizontalAlignment.Right; richTextBoxEx1.SelectionColor = Color.DimGray; richTextBoxEx1.SelectionBackColor = Color.WhiteSmoke; richTextBoxEx1.AppendText("("); richTextBoxEx1.AppendText($"{account.NickName}"); richTextBoxEx1.AppendText(")"); richTextBoxEx1.AppendText($"{account.WxId}"); System.Drawing.Image img = System.Drawing.Image.FromFile(@"D:\UDisk\avator" + account.AvatarPath); Bitmap bmp = new Bitmap(img, 25, 22); Clipboard.SetDataObject(bmp); DataFormats.Format dataFormat = DataFormats.GetFormat(DataFormats.Bitmap); if (richTextBoxEx1.CanPaste(dataFormat)) { richTextBoxEx1.Paste(dataFormat); } richTextBoxEx1.AppendText("\n"); richTextBoxEx1.SelectionColor = Color.Red; } else { richTextBoxEx1.SelectionAlignment = HorizontalAlignment.Left; richTextBoxEx1.SelectionColor = Color.DimGray; richTextBoxEx1.SelectionBackColor = Color.Blue; System.Drawing.Image img = System.Drawing.Image.FromFile(@"D:\UDisk\avator" + friend.AvatarPath); Bitmap bmp = new Bitmap(img, 25, 22); Clipboard.SetDataObject(bmp); DataFormats.Format dataFormat = DataFormats.GetFormat(DataFormats.Bitmap); if (richTextBoxEx1.CanPaste(dataFormat)) { richTextBoxEx1.Paste(dataFormat); } richTextBoxEx1.AppendText("("); richTextBoxEx1.AppendText($"{friend.NickName}"); richTextBoxEx1.AppendText(")"); richTextBoxEx1.AppendText($"{m.WxId}\n"); } //在sqlite的message表里面,有的对话的path字段含有空格,需要使用Replace进行去除 if (string.IsNullOrEmpty(m.Path.Replace(" ", ""))) //message是单纯的对话消息 或者 是含有url链接的消息 { SelectUrl.print_msg_or_url(m.Content, richTextBoxEx1); //该方法在打印message内容的同时能够识别url //Console.WriteLine("是对话或者链接:"+m.Content); } else//说明message是文件类型的消息,这时候应当能够点击链接并打开文件 { //Console.WriteLine("文件类型:" + m.Content); SelectUrl.print_file(m.Path, richTextBoxEx1); } richTextBoxEx1.AppendText($"{m.CreateTime}\n\n\n"); }); } else if (Name == "朋友圈") { var sns = context.WxSns .Where(s => s.WxId == friend.WxId) .OrderBy(s => s.CreateTime) .ToList(); sns.ForEach(s => { richTextBoxEx1.SelectionAlignment = HorizontalAlignment.Left; richTextBoxEx1.SelectionColor = Color.DimGray; System.Drawing.Image img = System.Drawing.Image.FromFile(@"D:\UDisk\avator" + friend.AvatarPath); Bitmap bmp = new Bitmap(img, 25, 22); Clipboard.SetDataObject(bmp); DataFormats.Format dataFormat = DataFormats.GetFormat(DataFormats.Bitmap); if (richTextBoxEx1.CanPaste(dataFormat)) { richTextBoxEx1.Paste(dataFormat); } richTextBoxEx1.AppendText("("); richTextBoxEx1.AppendText($"{friend.NickName}"); richTextBoxEx1.AppendText(")"); richTextBoxEx1.AppendText($"{s.WxId}\n"); richTextBoxEx1.SelectionColor = Color.Blue; richTextBoxEx1.AppendText($"{s.Content}\n"); richTextBoxEx1.AppendText($"{s.CreateTime}\n\n\n\n"); richTextBoxEx1.SelectionBackColor = Color.WhiteSmoke; }); } } }