old_flsystem/类库/Chat.Framework/WXSdk/Implement/WXClientImpl_IPAD.cs

4170 lines
189 KiB
C#
Raw Permalink Normal View History

2022-09-20 03:10:29 +00:00
using Chat.Framework.Utils;
using Chat.Framework.WXSdk.Events;
using Chat.Framework.WXSdk.IPAD;
using Chat.Framework.WXSdk.UIForm;
using CsharpHttpHelper;
using Google.Protobuf;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
using WechatProto;
using static Chat.Framework.WXSdk.Implement.WXClientTool;
namespace Chat.Framework.WXSdk.Implement
{
/// <summary>
/// 协议微信
/// </summary>
public class WXClientImpl_IPAD : WeixinBase
{
/// <summary>
/// 分析消息
/// </summary>
/// <param name="result"></param>
private void AnalysisMessage(string result)
{
// Util
result = result.Replace("🔑", "¥");
result = Util.RemoveEmoji(result);
2022-11-29 02:57:27 +00:00
2023-01-27 08:28:44 +00:00
// LogHelper.GetSingleObj().Debug("收到消息", result + @"
//");
2022-11-29 02:57:27 +00:00
2022-09-20 03:10:29 +00:00
var list = Util.ConvertJsonToObj<ArrayList>(result);
if (list == null) return;
int count = 0;
var guid = Guid.NewGuid();
// this.WriteLog($"{guid},Async数量{list.Count},排除重复后剩余:{count}",true);
// this.WriteLog();
foreach (Dictionary<string, object> xitem in list)
{
var time = DateTime.Now;
var item = xitem;
string json = Util.ObjectToJson(xitem);
var msgType = int.Parse(xitem["MsgType"].ToString());
//Console.WriteLine("新消息:" + json);
string md5 = Util.MD5Encrypt(json);
if (this.pack.Contains(md5))
continue;
if (this.pack.Count > 1000) this.pack.Clear();
this.pack.Add(md5);
count++;
var method = new Action(delegate ()
//Task.Factory.StartNew(delegate ()
{
var logStrbs = new StringBuilder();
try
{
var events = ChatClient.Events;
// int msgType = int.Parse(item["MsgType"].ToString());
switch (msgType)
{
case 10002://获取
{
logStrbs.Append("1_");
string content = item["Content"].ToString();
var contentreg = Regex.Match(content, @"(<sysmsg[\w\W]+/sysmsg>)");
if (contentreg.Success)
{
content = contentreg.Groups[1].Value.Replace("\n", "").Replace("\t", "");//.Replace("![CDATA[","").Replace("]]","");
XmlDocument doc = new XmlDocument();
doc.LoadXml(content);
var xml = doc.SelectSingleNode("sysmsg");
var type = xml.Attributes["type"];
if (type != null)
{
xml = xml.SelectSingleNode(type.InnerText);
switch (type.InnerText)
{
case "NewXmlChatRoomAccessVerifyApplication":
{
WXApplyGroup join = new WXApplyGroup(this);
join.Usernick = Regex.Match(xml.SelectSingleNode("text").InnerText, @"""(.*?)""想邀请").Groups[1].Value;
join.GroupId = xml.SelectSingleNode("RoomName").InnerText;
var link = xml.SelectSingleNode("link");
join.Reason = link.SelectSingleNode("invitationreason").InnerText;
join.Wxid = link.SelectSingleNode("inviterusername").InnerText;
var memberlist = link.SelectSingleNode("memberlist");
var nodes = memberlist.SelectNodes("member");
foreach (XmlNode node in nodes)
{
var member = new WXApplyGroup.ApplyGroupMember()
{
wxid = node.SelectSingleNode("username").InnerText,
headimgurl = node.SelectSingleNode("headimgurl").InnerText,
nickname = node.SelectSingleNode("nickname").InnerText,
quitchatroominfo = node.SelectSingleNode("nickname").InnerText
};
join.Members.Add(member);
}
ChatClient.Events.OnEvent(join);
}
return;
//case "delchatroommember":
// {
// }
// return;
}
}
Console.WriteLine();
}
return;
}
case 51://打开用户的聊天窗口
{
logStrbs.Append("2_");
if (item.ContainsKey("Status") && item["Status"].ToString() == "3")
{
var Content = item["Content"].ToString();
var reg = Regex.Match(Content, $"<msg>\n<op id='2'>\n<username>{item["ToUserName"]}</username>\n</op>\n</msg>");
if (reg.Success)
{
var friend = GetContact(item["ToUserName"].ToString(), true);
events.OnEvent(new WXOpenWindow(this, friend));
}
}
break;
}
case 10000://系统消息
{
logStrbs.Append("3_");
if (item.ContainsKey("Content"))
{
//{"MsgId":1647047807,"FromUserName":"wxid_8s44kddouuaj21","ToUserName":"wxid_7tki0tapwq2s22","MsgType":10000,"Content":"你已添加了千年老妖,现在可以开始聊天了。","Status":4,"ImgStatus":1,"ImgBuf":null,"CreateTime":1508670253,"MsgSource":"","PushContent":"","NewMsgId":6583959598552732769}
#region
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("新好友"))
{
var reg = Regex.Match(item["Content"].ToString(), "^你已添加了(.*?),现在可以开始聊天了。$");
if (reg.Success)
{
var friend = GetContact(item["FromUserName"].ToString(), true);
events.OnEvent(new WXNewFriend(this, friend));
break;
}
reg = Regex.Match(item["Content"].ToString(), "^(.*?)刚刚把你添加到通讯录,现在可以开始聊天了。$");
if (reg.Success)
{
//Thread.Sleep(3000);
Friend friend = null;
for (int i = 0; i < 3; i++)
{
friend = GetContact(item["FromUserName"].ToString(), true);
if (friend != null) break;
Thread.Sleep(1500);
}
//var friend = GetContact(item["FromUserName"].ToString(), true);
//LogHelper_.GetSingleObj().Info("BBBBBBBBBB", $"【{item["FromUserName"].ToString()}】 friend = " + friend);
//if (friend == null) break;
events.OnEvent(new WXNewFriend(this, friend));
break;
}
}
#endregion
#region
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("新群友"))
{
var User = this.User.User;
//你邀请"A 小叮当20 - 不懂回复帮助、A 小叮当12 - 不懂回复帮助、A 小叮当16 - 不懂回复帮助、A 小叮当19 - 不懂回复帮助"加入了群聊
var groupid = item["FromUserName"].ToString();
var reg = Regex.Match(item["Content"].ToString(), @"""(?<邀请人>.*?)""邀请""(?<新人>.*?)""加入了群聊");
if (!reg.Success)
reg = Regex.Match(item["Content"].ToString(), @"(?<邀请人>你)邀请""(?<新人>.*?)""加入了群聊");
if (!reg.Success)
reg = Regex.Match(item["Content"].ToString(), @"""(?<新人>.*?)""通过扫描""(?<邀请人>.*?)""分享的二维码加入群聊");
if (!reg.Success)
reg = Regex.Match(item["Content"].ToString(), @"""(?<新人>.*?)""通过扫描(?<邀请人>你)分享的二维码加入群聊");
if (reg.Success)
{
if (!GroupMemberCache.ContainsKey(groupid))
{
var gmNew = GetMembers(groupid, true);
if (gmNew != null)
{
if (!GroupMemberCache.ContainsKey(groupid))
GroupMemberCache.Add(groupid, gmNew.ToList());
var group = GetContact(groupid);
if (group == null) return;
events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = reg.Groups["新人"].Value, SourceNick = reg.Groups["邀请人"].Value == "你" ? Encoding.UTF8.GetString(User.Nickname.ToArray()) : reg.Groups[1].Value, SourceName = reg.Groups["邀请人"].Value == "你" ? User.Userame : "" });
return;
}
}
if (!SyncGroups.ContainsKey(groupid))
{
SyncGroups.Add(groupid, groupid);
SyncGroup();
}
break;
}
}
#endregion
}
return;
}
case 37://通过名片添加好友
{
logStrbs.Append("4_");
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("新申请"))
{
string content = item["Content"].ToString();
var reg = Regex.Match(content, @"fromusername=""(?<newFriendWxid>.*?)""[\w\W]+fromnickname=""(?<newFriendNick>.*?)""[\w\W]+content=""(?<newFriendMsg>.*?)""[\w\W]+sourceusername=""(?<sourceFriendWxid>.*?)""[\w\W]+sourcenickname=""(?<sourceFriendNick>.*?)""");
if (reg.Success)
{
events.OnEvent(new WXApplyFriend(this, reg.Groups["newFriendWxid"].ToString(), reg.Groups["newFriendNick"].ToString(), reg.Groups["newFriendMsg"].ToString(), reg.Groups["sourceFriendWxid"].ToString(), reg.Groups["sourceFriendNick"].ToString(), content));
}
}
}
return;
case 1://文本消息
case 42:
case 49:
case 47://表情动画
{
logStrbs.Append("5_");
if (item["FromUserName"].ToString() == "newsapp") return;
if (item["FromUserName"].ToString() == "weixin") return;
if (item["FromUserName"].ToString().StartsWith("gh_")) return;
if (item["Content"].ToString().Contains("[CDATA[微信转账]]") && item["FromUserName"].ToString() != User.Username)
{
logStrbs.Append("5.1_");
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("转账"))
{
logStrbs.Append("5.2_");
var content = item["Content"].ToString();
Console.WriteLine(content);
logStrbs.Append("5.3_");
var transcationid = Regex.Match(content, "transferid\u003e\u003c!\\[CDATA\\[(\\d+)\\]\\]");
var invalidtime = Regex.Match(content, "invalidtime\u003e\u003c!\\[CDATA\\[(\\d+)\\]\\]");
var money = Regex.Match(content, "<feedesc><!\\[CDATA\\[¥(.*?)\\]\\]></feedesc>");
var fromusername = item["FromUserName"].ToString();
logStrbs.Append("5.4_");
var friend = GetContact(fromusername);
logStrbs.Append("5.5_");
if (friend != null && transcationid.Success && invalidtime.Success && money.Success)
{
logStrbs.Append("5.6_");
var e = new WXReicevePay(this, friend, invalidtime.Groups[1].Value, transcationid.Groups[1].Value, double.Parse(money.Groups[1].Value));
logStrbs.Append("5.7_");
ChatClient.Events.OnEvent(e);
return;
}
}
}
logStrbs.Append("5.8_");
if (item["Content"].ToString() == "我通过了你的朋友验证请求,现在我们可以开始聊天了" && item.ContainsKey("MsgSource") && string.IsNullOrWhiteSpace(item["MsgSource"].ToString()))
{
logStrbs.Append("5.9_");
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("新好友"))
{
logStrbs.Append("5.10_");
var UserName = item["FromUserName"].ToString();
logStrbs.Append("5.11_");
if (!string.IsNullOrWhiteSpace(UserName))
{
logStrbs.Append("5.12_");
var friend = GetContact(UserName, true);
logStrbs.Append("5.13_");
events.OnEvent(new WXNewFriend(this, friend));
return;
}
}
}
logStrbs.Append("5.14_");
var reg = Regex.Match(item["FromUserName"].ToString(), "^(\\d+@chatroom)$");
bool is_phpone = false;
logStrbs.Append("5.15_");
if (item["FromUserName"].ToString() == User.Username)
{
logStrbs.Append("5.16_");
if (!reg.Success && item["ToUserName"].ToString().Contains("@")) return;
else if (ChatClient.WXSdkConfig.MsgConvertToFriend)
{
logStrbs.Append("5.17_");
item["FromUserName"] = item["ToUserName"].ToString();
is_phpone = true;
}
}
logStrbs.Append("5.18_");
if (reg.Success)//群消息
{
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("群消息"))
{
logStrbs.Append("5.19_");
string groupid = reg.Groups[1].Value;
var Content = System.Text.RegularExpressions.Regex.Match(item["Content"].ToString(), "^(.*?):\\s+([\\w\\W]+)$");
logStrbs.Append("5.20_");
var group = this.GetContact(groupid);
if (group == null)
{
logStrbs.Append("5.21_");
this.WriteLog(string.Format("获取群{0}失败。", groupid));
return;
}
logStrbs.Append("5.22_");
#region
if (!GroupMemberCache.ContainsKey(groupid))
{
logStrbs.Append("5.23_");
var gmNew = GetMembers(groupid, true);
if (gmNew != null)
{
logStrbs.Append("5.24_");
if (!GroupMemberCache.ContainsKey(groupid))
GroupMemberCache.Add(groupid, gmNew.ToList());
}
}
#endregion
logStrbs.Append("5.25_");
string wxid = Content.Groups[1].Value;
//string messsage = Content.Groups[2].Value.Replace("\n", "");
string messsage = Content.Groups[2].Value;
logStrbs.Append("5.26_");
GroupMember member = this.GetMember(groupid, wxid);
if (member == null)
{
logStrbs.Append("5.27_");
this.WriteLog(string.Format("获取群{0}成员{1}信息失败。", groupid, wxid));
break;
}
logStrbs.Append("5.28_");
events.OnEvent(new WXReceiveGroupMsg(this, member, group, messsage));
return;
}
}
else
{
logStrbs.Append("5.29_");
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("私消息"))
{
logStrbs.Append("5.30_");
string wxid = item["FromUserName"].ToString();
string messsage = item["Content"].ToString();
var friend = this.GetContact(wxid);
//if (friend == null)
//{
// //this.WriteLog(string.Format("获取微信好友{0}信息失败。", wxid));
// //break;
// var nickname = item["PushContent"].ToString().Replace(": " + messsage, "").Trim();
// friend = new Friend() { Ticket = "", Alias = wxid, UserName = wxid, MsgType = 1, ExtInfo = "", NickName = nickname, ContactType = 0, City = "Chaoyang", ChatRoomOwner = "", Remark = "", Sex = 1, Signature = "", ChatroomVersion = "0", id = 0, Province = "BeiJing", BigHeadImgUrl = "", SmallHeadImgUrl = "" };
//}
logStrbs.Append("5.31_");
var eventobj = new WXReiceveFriendMsg(this, friend, messsage);
logStrbs.Append("5.32_");
eventobj.IsRobot = is_phpone;
events.OnEvent(eventobj);
return;
}
}
break;
}
case 3://收到图片
{
logStrbs.Append("6_");
#region
//if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("图片"))
//{
// var friend = GetContact(item["FromUserName"].ToString());
// if (friend == null) return;
// var Content = item["Content"].ToString();
// var imagePath = DownlowdImage(int.Parse(item["MsgId"].ToString()), friend.UserName, int.Parse(Regex.Match(Content, " length=\"(\\d+)").Groups[1].Value));
// if (!string.IsNullOrEmpty(imagePath))
// {
// #region 缓存CDN数据
// if (ChatClient.ImageCDNs.Count >= 10000)//到达一定数量清空数据
// ChatClient.ImageCDNs.Clear();
// var MD5Hash = FileTools.GetMD5Hash(imagePath);
// if (!ChatClient.ImageCDNs.ContainsKey(MD5Hash))
// {
// var reg = Regex.Match(Content, @" aeskey=""(?<aeskey>[^""]+)"".+?cdnthumburl=""(?<cdnthumburl>[^""]+)""");
// if (reg.Success)
// {
// var aeskey = reg.Groups["aeskey"].Value;
// var cdnthumburl = reg.Groups["cdnthumburl"].Value;
// ChatClient.ImageCDNs.Add(MD5Hash, new { aeskey = aeskey, cdnurl = cdnthumburl });
// }
// }
// #endregion
// if (!friend.UserName.Contains("@"))
// {
// if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("私消息"))
// {
// bool is_phpone = false;
// if (ChatClient.WXSdkConfig.MsgConvertToFriend)
// {
// if (item.ContainsKey("FromUserName") && item["FromUserName"].ToString() == User.Username)
// {
// if (item.ContainsKey("ToUserName"))
// {
// string wxid = item["ToUserName"].ToString();
// friend = this.GetContact(wxid);
// is_phpone = true;
// }
// }
// }
// var eventobj = new WXReiceveFriendMsg(this, friend, $"[图片={imagePath}]");
// eventobj.IsRobot = is_phpone;
// events.OnEvent(eventobj);
// }
// }
// else
// {
// if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("群消息"))
// {
// var groupid = friend.UserName;
// var reg = Regex.Match(Content, "^(.*?):\\s+([\\w\\W]+)$");
// var group = this.GetContact(groupid);
// if (group == null)
// {
// this.WriteLog(string.Format("获取群{0}失败。", groupid));
// return;
// }
// string wxid = reg.Groups[1].Value;
// string messsage = $"[图片={imagePath}]";
// GroupMember member = this.GetMember(groupid, wxid);
// if (member == null)
// {
// this.WriteLog(string.Format("获取群{0}成员{1}信息失败。", groupid, wxid));
// break;
// }
// events.OnEvent(new WXReceiveGroupMsg(this, member, group, messsage));
// return;
// }
// }
// }
//}
#endregion
#region
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("图片"))
{
logStrbs.Append("6.1_");
var friend = GetContact(item["FromUserName"].ToString());
if (friend == null) return;
var Content = item["Content"].ToString();
logStrbs.Append("6.2_");
#region
var ContentTmp = Content;
if (friend.UserName.Contains("@"))
{
logStrbs.Append("6.3_");
var reg = Regex.Match(Content, "^.*?:\\s+([\\w\\W]+)$");
if (reg.Success)
ContentTmp = reg.Groups[1].Value;
}
CDNImageMsgInfo imgInfo = GetCDNImage(ContentTmp);
logStrbs.Append("6.4_");
var cdnstr = Util.HexToStr(Encoding.UTF8.GetBytes(HttpHelper.ObjectToJson(imgInfo)));
#endregion
logStrbs.Append("6.5_");
if (!friend.UserName.Contains("@"))
{
logStrbs.Append("6.6_");
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("私消息"))
{
logStrbs.Append("6.7_");
bool is_phpone = false;
if (ChatClient.WXSdkConfig.MsgConvertToFriend)
{
logStrbs.Append("6.8_");
if (item.ContainsKey("FromUserName") && item["FromUserName"].ToString() == User.Username)
{
logStrbs.Append("6.9_");
if (item.ContainsKey("ToUserName"))
{
logStrbs.Append("6.10_");
string wxid = item["ToUserName"].ToString();
logStrbs.Append("6.11_");
friend = this.GetContact(wxid);
logStrbs.Append("6.12_");
is_phpone = true;
}
}
}
var eventobj = new WXReiceveFriendMsg(this, friend, $"[图片={cdnstr}]");
logStrbs.Append("6.13_");
eventobj.IsRobot = is_phpone;
logStrbs.Append("6.14_");
events.OnEvent(eventobj);
}
}
else
{
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("群消息"))
{
logStrbs.Append("6.15_");
var groupid = friend.UserName;
var reg = Regex.Match(Content, "^(.*?):\\s+([\\w\\W]+)$");
logStrbs.Append("6.16_");
Content = reg.Groups[2].Value;
logStrbs.Append("6.17_");
var group = this.GetContact(groupid);
logStrbs.Append("6.18_");
if (group == null)
{
logStrbs.Append("6.19_");
this.WriteLog(string.Format("获取群{0}失败。", groupid));
return;
}
#region
if (!GroupMemberCache.ContainsKey(groupid))
{
logStrbs.Append("6.20_");
var gmNew = GetMembers(groupid, true);
logStrbs.Append("6.21_");
if (gmNew != null)
{
logStrbs.Append("6.22_");
if (!GroupMemberCache.ContainsKey(groupid))
GroupMemberCache.Add(groupid, gmNew.ToList());
}
}
#endregion
logStrbs.Append("6.23_");
string wxid = reg.Groups[1].Value;
logStrbs.Append("6.24_");
string messsage = $"[图片={cdnstr}]";
logStrbs.Append("6.25_");
GroupMember member = this.GetMember(groupid, wxid);
logStrbs.Append("6.26_");
if (member == null)
{
logStrbs.Append("6.27_");
this.WriteLog(string.Format("获取群{0}成员{1}信息失败。", groupid, wxid));
break;
}
logStrbs.Append("6.28_");
events.OnEvent(new WXReceiveGroupMsg(this, member, group, messsage));
}
}
}
#endregion
break;
}
case 43://收到视频
{
logStrbs.Append("7_");
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("视频"))
{
if (!item.ContainsKey("Content")) return;
string content = item["Content"].ToString();
var reg = Regex.Match(content, "aeskey=\"([^\"]+).*?cdnthumburl=\"([^\"]+)");
if (reg.Success)
{
var aeskey = reg.Groups[1].Value;
var cdnurl = reg.Groups[2].Value;
var cdnstr = Util.HexToStr(Encoding.UTF8.GetBytes(HttpHelper.ObjectToJson(new { aeskey = aeskey, cdnurl = cdnurl })));
ChatClient.Events.OnEvent(new WXWriteLog(this) { Message = $"来自{item["PushContent"]}:[视频={cdnstr}]" });
if (item.ContainsKey("FromUserName"))
{
var fromUserName = item["FromUserName"].ToString();
if (!fromUserName.Contains("@"))
{
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("私消息"))
{
var friend = GetContact(fromUserName, false);
var eventobj = new WXReiceveFriendMsg(this, friend, $"[视频={cdnstr}]");
events.OnEvent(eventobj);
}
}
else
{
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("群消息"))
{
var Content = Regex.Match(item["Content"].ToString(), "^(.*?):\\s+([\\w\\W]+)$");
var group = this.GetContact(fromUserName);
if (group == null)
{
this.WriteLog(string.Format("获取群{0}失败。", fromUserName));
return;
}
#region
if (!GroupMemberCache.ContainsKey(fromUserName))
{
var gmNew = GetMembers(fromUserName, true);
if (gmNew != null)
GroupMemberCache.Add(fromUserName, gmNew.ToList());
}
#endregion
string wxid = Content.Groups[1].Value;
string messsage = $"[视频={cdnstr}]";
GroupMember member = this.GetMember(fromUserName, wxid);
if (member == null)
{
this.WriteLog(string.Format("获取群{0}成员{1}信息失败。", fromUserName, wxid));
break;
}
events.OnEvent(new WXReceiveGroupMsg(this, member, group, messsage));
return;
}
}
}
}
}
break;
}
default:
return;
}
//47 动画表情 1 文本消息
}
catch (Exception ex)
{
this.WriteLog("解析消息异常->" + ex.Message + "-" + ex.StackTrace + " - " + logStrbs);
}
});
method.BeginInvoke(null, null);
Thread.Sleep(5);
}
}
#region
//private void NewMemberEvents(EventManage events, Friend group, string groupid, string membernicks, string sourcenick)
//{
// try
// {
// var newNick = string.Empty;
// var newName = string.Empty;
// var sourceNick = string.Empty;
// var sourceName = string.Empty;
// if (sourcenick == "你")
// {
// sourceName = this.User.Username;
// sourceNick = this.User.Nick;
// }
// else
// {
// sourceNick = sourcenick;
// }
// var msTmp = GetMembers(groupid);
// var ms = GetMembers(groupid, true);
// if (ms == null) return;
// #region 没有、分隔的昵称(就判断为只有一个用户进群)
// if (!membernicks.Contains("、"))
// {
// #region 判断昵称
// var equals = ms.Where(f => Util.RemoveEmoji(f.NickName) == membernicks).ToList();
// if (equals.Count != 0)
// {
// if (!string.IsNullOrWhiteSpace(sourceName))
// {
// if (equals.Count == 1)
// {
// if (equals[0].InviterUserName == sourceName)
// {
// events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = membernicks, MemberName = equals[0].Username, SourceNick = sourceNick, SourceName = sourceName });
// return;
// }
// else
// {
// }
// }
// else
// {
// //多个用户名称一样
// var tmps = equals.Where(f => f.InviterUserName == sourceName).ToList();
// if (tmps.Count == 1)
// {
// events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = membernicks, MemberName = tmps[0].Username, SourceNick = sourceNick, SourceName = sourceName });
// return;
// }
// }
// }
// else
// {
// }
// }
// #endregion
// }
// #endregion
// //else
// {
// #region 比较两个集合的差
// if (msTmp == null) return;
// //获取缓存中不存在的用户集合
// var result = ms.Where(a => msTmp.FirstOrDefault(b => b.Username == a.Username) == null).ToList();
// if (result.Count == 0)
// result = ms.ToList();
// if (result.Count != 0)
// {
// if (!membernicks.Contains("、"))
// {
// if (!string.IsNullOrWhiteSpace(sourceName))
// {
// var equals = result.Where(f => f.InviterUserName == sourceName).ToList();
// if (equals.Count == 1)
// {
// events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = membernicks, MemberName = equals[0].Username, SourceNick = sourceNick, SourceName = sourceName });
// return;
// }
// }
// else
// {
// var tmps = msTmp.Where(f => Util.RemoveEmoji(f.NickName) == sourceNick).Select(f => f.Username).ToList();
// if (tmps.Count == 0)
// {
// tmps = Friends.Where(f => f.Value.Remark == sourceNick).Select(f => f.Key).Where(f => !f.Contains("@")).ToList();
// }
// if (tmps.Count != 0)
// {
// if (tmps.Count == 1)
// {
// var InviterUserName = tmps[0];
// var nickTmps = result.Where(f => Util.RemoveEmoji(f.NickName) == membernicks && f.InviterUserName == InviterUserName).ToList();
// if (nickTmps.Count == 1)
// {
// events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = membernicks, MemberName = nickTmps[0].Username, SourceNick = sourceNick, SourceName = sourceName });
// return;
// }
// }
// else
// {
// //tmps.FirstOrDefault(f => f.InviterUserName == tmps.FirstOrDefault() != null)
// var nickTmps = result.Where(f => Util.RemoveEmoji(f.NickName) == membernicks && tmps.FirstOrDefault(d => d == f.InviterUserName) != null).ToList();
// if (nickTmps.Count == 1)
// {
// events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = membernicks, MemberName = nickTmps[0].Username, SourceNick = sourceNick, SourceName = sourceName });
// return;
// }
// }
// }
// }
// }
// else
// {
// var mnicks = "、" + membernicks + "、";
// if (!string.IsNullOrWhiteSpace(sourceName))
// {
// var userTmps = result.Where(f => f.InviterUserName == sourceName).ToList();
// if (userTmps.Count != 0)
// {
// //var newTmps = userTmps.Where(f => (membernicks + "、").Contains(f.NickName + "、")).ToList();
// foreach (var item in userTmps)
// {
// if (mnicks.Contains("、" + Util.RemoveEmoji(item.NickName) + "、"))
// {
// var count = userTmps.Count(f => Util.RemoveEmoji(f.NickName) == Util.RemoveEmoji(item.NickName));
// if (count == 1)
// {
// events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = item.NickName, MemberName = item.Username, SourceNick = sourceNick, SourceName = sourceName });
// Thread.Sleep(600);
// }
// else
// {
// events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = Util.RemoveEmoji(item.NickName), SourceNick = sourceNick });
// }
// }
// }
// return;
// }
// }
// else
// {
// //
// var sourceTmps = ms.Where(f => Util.RemoveEmoji(f.NickName) == sourceNick).Select(f => f.Username).ToList();
// if (sourceTmps.Count == 0)
// {
// //获取数据中的用户数据 和 缓存中的好友数据
// sourceTmps = Friends.Where(f => Util.RemoveEmoji(f.Value.Remark) == sourceNick).Select(f => f.Key).Where(f => !f.Contains("@")).ToList();
// }
// //包含的昵称用户集合
// var userTmps = result.Where(f => mnicks.Contains("、" + Util.RemoveEmoji(f.NickName) + "、")).ToList();
// if (userTmps.Count != 0)
// {
// for (int i = 0; i < userTmps.Count; i++)
// {
// var nickTmps = ms.Where(f => f.Username == userTmps[i].Username).ToList();
// var user = nickTmps.FirstOrDefault(f => sourceTmps.FirstOrDefault(d => d == f.InviterUserName) != null);//这里邀请人不查询多条件符合
// if (user != null)
// {
// events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = Util.RemoveEmoji(user.NickName), MemberName = user.Username, SourceNick = sourceNick, SourceName = sourceName });
// Thread.Sleep(600);
// }
// //else
// //{
// //}
// }
// return;
// }
// }
// return;
// }
// //events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = membernicks, SourceNick = sourceNick });
// }
// #endregion
// }
// {
// #region
// #endregion
// }
// events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = membernicks, SourceNick = sourceNick });
// }
// catch (Exception ex)
// {
// this.WriteLog("新群用户解析异常->" + ex.Message + " - " + ex.StackTrace);
// }
//}
#endregion
#region
/// <summary>
/// 群用户缓存
/// </summary>
private Dictionary<string, List<GroupMember>> GroupMemberCache = null;
private List<string> isRunGroup = new List<string>();
/// <summary>
/// 保存需要同步的群号
/// </summary>
private Dictionary<string, string> SyncGroups = new Dictionary<string, string>();
/// <summary>
/// 同步群(群新用户事件)
/// </summary>
private void SyncGroup()
{
try
{
if (SyncGroups.Count != 0)
{
var groupids = SyncGroups.Keys.ToList();
for (int i = 0; i < groupids.Count; i++)
{
var groupid = groupids[i];
if (Util.GetCache(groupid))
continue;
SyncGroups.Remove(groupid);
Util.SetCache(groupid, 60);
FlushGroup(groupid);
}
}
}
catch (Exception ex)
{ }
}
/// <summary>
/// 刷新群用户,生成新用户事件
/// </summary>
/// <param name="groupid"></param>
private void FlushGroup(string groupid)
{
try
{
if (isRunGroup.Contains(groupid)) return;
isRunGroup.Add(groupid);
if (!GroupMemberCache.ContainsKey(groupid))
{
var gmNew = GetMembers(groupid, true);
if (gmNew != null && !GroupMemberCache.ContainsKey(groupid))
GroupMemberCache.Add(groupid, gmNew.ToList());
}
if (GroupMemberCache.ContainsKey(groupid))
{
var gMembers = GroupMemberCache[groupid];
if (gMembers.Count != 0)
{
var gmOld = GroupMemberCache[groupid];
var gmNew = GetMembers(groupid, true);
if (gmNew != null)
{
GroupMemberCache[groupid] = gmNew.ToList();
var jiaojis = gmNew.Where(a => gmOld.FirstOrDefault(b => b.Username == a.Username) == null).ToList();
//if (jiaojis.Count == 0)
// jiaojis = gmNew.ToList();
if (jiaojis.Count == 0) return;
var group = GetContact(groupid);
if (group != null)
{
foreach (var item in jiaojis)
{
Friend inviter = null;
if (!string.IsNullOrWhiteSpace(item.InviterUserName))
inviter = GetContact(item.InviterUserName);
ChatClient.Events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = groupid, MemberNicks = item.NickName, MemberName = item.Username, SourceNick = item.InviterUserName == null ? string.Empty : inviter.NickName, SourceName = item.InviterUserName });
Thread.Sleep(600);
}
}
}
}
}
}
catch (Exception ex)
{ }
finally
{
try
{
isRunGroup.Remove(groupid);
}
catch (Exception)
{ }
}
}
#endregion
public override string ToString()
{
if (!string.IsNullOrEmpty(WeixinHao) && this.User != null)
{
//var data = User.Data;
//var host = Host;
if (this.Host != null && this.Socket != null && !string.IsNullOrEmpty(this.Socket.ServerIp)) this.Host.BindLongip(this.Socket.ServerIp);
var obj = new
{
data = User.Data,
host = Host,
username = WeixinHao,
password = Password,
login_type = (int)this.LoginDeviceType
};
return CsharpHttpHelper.HttpHelper.ObjectToJson(obj);
}
return base.ToString();
}
#region
/// <summary>
/// 删除好友(可以用户清理僵尸粉用)
/// </summary>
/// <param name="username">微信id</param>
/// <returns></returns>
public override string DeleteFriend(string username)
{
try
{
WechatPack send = new WechatPack(this);//创建发送对象
var result = send.Send(WechatCmd., new { Cmdid = 7, CmdBuf = username });
if (this.Friends.ContainsKey(username)) this.Friends.Remove(username);
return string.Empty;
}
catch (Exception ex)
{
return ex.Message;
}
}
///// <summary> 删除好友
///// 老版本的删除僵尸粉
///// </summary>
///// <param name="wei_xin_hao"></param>
//public void DeleteFriend(Friend friend)
//{
// try
// {
// string payloadJson = "{\"Cmdid\":7,\"CmdBuf\":\"" + friend.UserName + "\"}";
// WechatPacket send = new WechatPacket(this);
// var data = send.SendRpc(new BaseMsg
// {
// Cmd = 681,
// User = this.User,
// Payloads = ByteString.CopyFrom(Encoding.UTF8.GetBytes(payloadJson))
// });
// data = send.SendRpc(data);
// var msg = Encoding.UTF8.GetString(data);
// Console.WriteLine(msg);
// if (this.Friends.ContainsKey(friend.UserName))
// this.Friends.Remove(friend.UserName);
// }
// catch (Exception ex)
// {
// EventManage.OnEvent(this, ex.Message);
// }
//}
#endregion
#region
/// <summary>
/// 邀请入群
/// </summary>
/// <param name="username">用户wxid</param>
/// <param name="groupId">群id</param>
/// <returns></returns>
public override string InviteIntoGroup(string username, string groupId)
{
try
{
//WechatPack send = new WechatPack(this);//创建发送对象
//var result = send.SendAll(WechatCmd.删除好友, true, new { Cmdid = 7, CmdBuf = username });
//var msg = Encoding.UTF8.GetString(result);
//Console.WriteLine(msg);
//if (this.Friends.ContainsKey(username)) this.Friends.Remove(username);
//return msg;
WechatPack send = new WechatPack(this);//创建发送对象
var result = send.Send(WechatCmd., new { ChatRoom = groupId, Username = username });
var msg = Encoding.UTF8.GetString(result);
Console.WriteLine("msg = " + msg);
return msg;
//Console.WriteLine(msg);
//string payloadJson = "{\"ChatRoom\":\"" + tb_ToUsername.Text + "\",\"Username\":\"" + tb_AtUserlist.Text + "\"}";
//WechatMsg InviteChatroomUserReq = new WechatMsg
//{
// Token = ConstProtocol.MachineCode,
// Version = ConstProtocol.Version,
// TimeStamp = Utils.Time_Stamp(),
// IP = ClientIP,
// BaseMsg = new BaseMsg
// {
// Cmd = 610,
// User = vUser,
// Payloads = ByteString.CopyFrom(Encoding.UTF8.GetBytes(payloadJson))
// }
//};
//WechatMsg InviteChatroomUserRsp = client.HelloWechat(InviteChatroomUserReq, authHeader);
//byte[] body = InviteChatroomUserRsp.BaseMsg.Payloads.ToByteArray();
//byte[] buffers;
//using (WebClient c = new WebClient())
//{
// buffers = c.UploadData("http://" + shortServer + InviteChatroomUserRsp.BaseMsg.CmdUrl, body);
//}
////短链接解包判定
//if (buffers[0] != 191)
//{
// Console.WriteLine("未知包:{0}", Utils.HexToStr(buffers));
// return;
// //说明返回wx出错
//}
}
catch (Exception ex)
{
return ex.Message;
}
}
#endregion
public override string DeleteGroupMember(string username, string groupId)
{
WechatPack send = new WechatPack(this);//创建发送对象
var result = send.Send(WechatCmd., new { ChatRoom = groupId, Username = username });
var msg = Encoding.UTF8.GetString(result);
Console.WriteLine("msg = " + msg);
return msg;
}
private static string GetComputerName()
{
try
{
return System.Environment.GetEnvironmentVariable("ComputerName");
}
catch
{
return "unknow";
}
}
public WXClientImpl_IPAD(string wei_xin_hao) : this()
{
SetWeixinHao(wei_xin_hao);
this.DeviceName = WeixinHao + "_" + GetComputerName();
}
public WXClientImpl_IPAD(string WeixinHao, string data) : this()
{
this.DeviceName = WeixinHao + "_" + GetComputerName();
var _data = Util.ConvertJsonToDic(data);
var _host = _data["host"] as Dictionary<string, object>;
this.Host = new WechatHost();
var _list = _host["LongServerList"] as ArrayList;
foreach (string item in _list) this.Host.LongServerList.Add(item);
//Socket.UpdateServerIp(this.Host.LongServerList, true);
_list = _host["ShortServerList"] as ArrayList;
foreach (string item in _list) this.Host.ShortServerList.Add(item);
//Socket.UpdateServerIp(this.Host.ShortServerList, false);
this.Password = _data["password"] != null ? _data["password"].ToString() : string.Empty;
this.User = new WeixinBaseUser(_data["data"].ToString());
if (_data.ContainsKey("login_type"))
{
this.LoginDeviceType = (LoginDeviceType)int.Parse(_data["login_type"].ToString());
}
this.UUID = Util.MD5Encrypt(User.Username);
SetWeixinHao(WeixinHao);
}
private string Ime;
internal void SetWeixinHao(string wxh)
{
if (string.IsNullOrEmpty(wxh)) return;
this.WeixinHao = wxh;
if (string.IsNullOrEmpty(this.DeviceId))
{
var WXGetDeviceResult = new WXGetDevice(this);
ChatClient.Events.OnEvent(WXGetDeviceResult);
this.DeviceId = WXGetDeviceResult.DeviceInfo;
}
if ((!this.DeviceId.StartsWith("62") && !this.DeviceId.EndsWith("7f")))
{
Ime = Util.MD5Encrypt(WeixinHao + this.DeviceId);
this.DeviceId = SixTwoData(Ime);
}
}
#region
/// <summary>
/// 刷新通讯录信息(获取好友列表),刷新状态[true为更新中]
/// </summary>
public bool IsRefreshContact { get; private set; }
private void GetContact(string[] wxid)
{
_GetContact(string.Join(",", wxid));
}
private void _GetContact(string wxid)
{
try
{
// string payloadJson = "{\"UserNameList\":\"" + wxid + "\"}";
WechatPack send = new WechatPack(this);
byte[] buffers = CGetContact(User.User, Encoding.UTF8.GetBytes(CsharpHttpHelper.HttpHelper.ObjectToJson(new { UserNameList = wxid, Chatroomid = "" })));
int Seq = Util.ReadInt(buffers, 12);
var data = send.SendWx(buffers, Seq);
if (data == null) return;
byte[] encodeBuf = new byte[data.Length - 16];//提取长连接的body 去掉头16个字节
Buffer.BlockCopy(data, 16, encodeBuf, 0, data.Length - 16);
data = CUnPackGetcontact(User.User, encodeBuf);
string text = Encoding.UTF8.GetString(data);
//System.Configuration.ConfigurationManager.AppSettings["OEM"]
text = Util.RemoveEmoji(text);
Friend[] frds = Util.ConvertJsonToObj<Friend[]>(text) as Friend[];
// Console.WriteLine(text);
foreach (Friend item in frds)
{
this.Friends[item.UserName] = item;
}
Console.WriteLine();
}
catch (Exception) { }
}
/// <summary>
/// 发送卡片消息
/// </summary>
/// <param name="username"></param>
/// <param name="content"></param>
public override void SendCard(string username, string friendwxid)
{
if (friendwxid.Contains("@chatroom") || friendwxid.Contains("@im.chatroom"))
{
InviteIntoGroup(username, friendwxid);
}
else
{
//WechatPack pack = new WechatPack(this);
//var data = pack.SendAll(WechatCmd.发送消息, false,send);
var friend = GetContact(friendwxid);
if (friend == null) return;
string str = $"<msg bigheadimgurl=\"{friend.BigHeadImgUrl}\" smallheadimgurl=\"{friend.SmallHeadImgUrl}\" username=\"{friend.UserName}\" nickname=\"{friend.NickName}\" fullpy=\"{friend.UserName}\" shortpy=\"\" alias=\"{friend.Alias}\" imagestatus=\"3\" scene=\"17\" province=\"\" city=\"\" sign=\"\" sex=\"1\" certflag=\"0\" certinfo=\"\" brandIconUrl=\"\" brandHomeUrl=\"\" brandSubscriptConfigUrl=\"\" brandFlags=\"0\" regionCode=\"AU_Queensland_Gold Coast\" />";
var sendJson = new
{
ToUserName = username,
AppId = "",
Type = 42,
Content = str
};
var temp_pack = new WechatPack(this);
temp_pack.SendAll(WechatCmd., false, sendJson);
}
}
/// <summary>
/// 获得好友或群组信息
/// </summary>
public override Friend GetContact(string wxid, bool refresh = false)
{
lock (this.Friends)
{
if (refresh || !Friends.ContainsKey(wxid))
_GetContact(wxid);
if (Friends.ContainsKey(wxid)) return Friends[wxid];
else
{
return ChatClient.GetDBWechatFriend(wxid);
}
}
}
/// <summary>
/// 刷新通讯录信息(获取好友列表)
/// </summary>
public override void RefreshContact(Action<WXClientImpl_IPAD> method = null)
{
//暂时取消刷新通讯录
//return;
if (IsRefreshContact) return;
IsRefreshContact = true;
ThreadPool.QueueUserWorkItem(f =>
{
bool is_error = false;
List<string> users = new List<string>();
try
{
WriteLog("正在刷新通讯录详情...");
int CurrentWxcontactSeq = 0;
int CurrentChatRoomContactSeq = 0;
Next:
var payloadJson = new
{
CurrentWxcontactSeq = CurrentWxcontactSeq,//初始为0
CurrentChatRoomContactSeq = CurrentChatRoomContactSeq// 初始为0
};
WechatPack send = new WechatPack(this);
var data = send.Send(WechatCmd., payloadJson);
data = send.Analysis(data);
string text = Encoding.UTF8.GetString(data);
var dic = Util.ConvertJsonToDic(text);
#region 20
var count = 8;
var list = dic["UsernameLists"] as ArrayList;
if (list == null || list.Count == 0)
{
if (users.Count > 0)
{
int number = users.Count / count;
if (users.Count % count != 0) number++;
int yu = users.Count % count;
int sum = 0;
for (int i = 0; i < number; i++)
{
List<string> temp = new List<string>();
for (int j = 0; j < count; j++)
{
if (this.Status != WxStatus.线) return;
int index = i * count + j;
if (users.Count == (index)) break;
sum++;
temp.Add(users[index]);
}
if ((i + 1) != number)
{
this.WriteLog(string.Format("读取通讯录详情,{0}/{1}。", sum, users.Count));
GetContact(temp.ToArray());
Thread.Sleep(600);
}
else
{
this.WriteLog(string.Format("读取通讯录详情,{0}/{1}。", sum, users.Count));
GetContact(temp.ToArray());
}
temp.Clear();
}
}
return;
}
else
{
foreach (Dictionary<string, object> item in list)
{
//if (item["Username"].ToString().EndsWith("@chatroom"))
// users.Add(item["Username"].ToString());
users.Add(item["Username"].ToString());
}
}
#endregion
if (this.Status != WxStatus.线) return;
CurrentWxcontactSeq = int.Parse(dic["CurrentWxcontactSeq"].ToString());
CurrentChatRoomContactSeq = int.Parse(dic["CurrentChatRoomContactSeq"].ToString());
if (CurrentWxcontactSeq != 0 || CurrentChatRoomContactSeq != 0)
{
Thread.Sleep(600);
goto Next;
}
}
catch (Exception)
{
is_error = true;
}
finally
{
IsRefreshContact = false;
this.WriteLog(string.Format("读取通讯录完成!"));
#region
var groupTmps = users.Where(z => z.Contains("@chatroom")).ToList();
if (groupTmps.Count != 0)
{
foreach (var item in groupTmps)
{
if (!GroupMemberCache.ContainsKey(item))
{
var members = GetMembers(item, true);
if (members != null && members.Length != 0)
GroupMemberCache[item] = members.ToList();
Thread.Sleep(1000);
}
}
}
#endregion
if (!is_error)
{
ChatClient.Events.OnEvent(new WXRefreshContactSuccess(this));
if (method != null) method.Invoke(this);
}
else
{
}
}
});
}
/// <summary>
/// 同意添加我为好友
/// </summary>
/// <param name="token">收到的Token完整数据</param>
public override string AgreeAddMe(string token)
{
try
{
string temp = Regex.Replace(token, @"\\""", "\"");
var v2 = Regex.Match(temp, "ticket=\"([^\\s]+)\"");
var v1 = Regex.Match(temp, "encryptusername=\"([^\\s]+)\"");
var scene = 0;
var sceneReg = Regex.Match(temp, @"scene=\""([^""]+?)\""");
if (sceneReg.Success)
scene = int.Parse(sceneReg.Groups[1].Value);
// var us = Regex.Match(temp, "fromusername=\"(.*?)\"").Groups[1].Value;
// Console.WriteLine(us);
if (v1.Success && v2.Success)
{
var payloadJson = new
{
Encryptusername = v1.Groups[1].Value,//v1_
Ticket = v2.Groups[1].Value,//v2_
Type = 3,//1关注公众号2打招呼 主动添加好友3通过好友请求
Sence = scene,//1来源QQ2来源邮箱3来源微信号14群聊15手机号18附近的人25漂流瓶29摇一摇30二维码
Content = "",//打招呼内容
};
WechatPack send = new WechatPack(this);
var data = send.SendAll(WechatCmd., true, payloadJson);
string result = Encoding.UTF8.GetString(data);
if (temp.Contains(result))
{
var reg = Regex.Match(token, @"fromusername=""(?<newFriendWxid>.*?)""[\w\W]+fromnickname=""(?<newFriendNick>.*?)""[\w\W]+content=""(?<newFriendMsg>.*?)""[\w\W]+sourceusername=""(?<sourceFriendWxid>.*?)""[\w\W]+sourcenickname=""(?<sourceFriendNick>.*?)""");
if (reg.Success)
{
Task.Factory.StartNew(delegate
{
Thread.Sleep(2000);
var friend = GetContact(reg.Groups["newFriendWxid"].ToString());
//this.EventManage.OnEvent(new WXAddFriendSuccess() { FriendNick = reg.Groups["newFriendNick"].Value, FriendWxid = reg.Groups["newFriendWxid"].ToString() });
if (friend != null) ChatClient.Events.OnEvent(new WXNewFriend(this, friend));
});
}
return null;
}
else
this.WriteLog(result);
return result;
}
else
return "token 不满足指定条件";
}
catch (Exception ex)
{
return ex.Message;
}
}
/// <summary>
/// 发送图片
/// </summary>
/// <param name="img">图片字节</param>
/// <param name="username">要发送给谁</param>
public override void SendImage(byte[] img, string username)
{
int index = 0;
Stream imgStream = new MemoryStream(img);
try
{
int Startpos = 0;//起始位置
int datalen = 65535;//数据分块长度//dll img 最大缓冲区65535 在大了 wx 收不到包;
int datatotalength = (int)imgStream.Length;
string ClientImgId = User.Username + "_" + Util.TimeStamp().ToString();
while (Startpos != (int)datatotalength && index < 15)
{//
index++;
int count = 0;
if (datatotalength - Startpos > datalen)
{
count = datalen;
}
else
{
count = (int)datatotalength - Startpos;
}
byte[] data = new byte[65535];
imgStream.Seek(Startpos, SeekOrigin.Begin);
imgStream.Read(data, 0, count);
UploadImgInfo imginfo = new UploadImgInfo();
imginfo.ClientImgId = ClientImgId;
imginfo.dwStartPos = Startpos;
imginfo.dwTotalLen = datatotalength;
imginfo.dwDataLen = count;
imginfo.szImgBuf = data;
imginfo.szToUserName = username;
Startpos = Startpos + count;
Console.WriteLine("Send Img Block {0} next {1}", count, Startpos);
byte[] buffers = WXClientTool.CUploadImg(User.User, imginfo);
Console.WriteLine(buffers == null ? "null" : buffers.Length.ToString());
int Seq = Util.ReadInt(buffers, 12);
WechatPack pack = new WechatPack(this);
buffers = pack.SendWx(buffers, Seq);
//var _temp = pack.Analysis(1100, buffers);
//Console.WriteLine(Encoding.UTF8.GetString(_temp));
//长链接解包判定
if (buffers[16] != 191)
{
//说明wx返回出错
//Console.WriteLine("未知包:{0}", Util.HexToStr(buffers));
return;
}
#region xxx
//图片可以不用解包 要解的话就请求服务器好了。。。发送成功最终会返回msgid
/*
WechatMsg IMGMsgRsp = new WechatMsg
{
Token = ConstProtocol.MachineCode,
Version = ConstProtocol.Version,
TimeStamp = Utils.Time_Stamp(),
IP = ClientIP
};
IMGMsgRsp.BaseMsg = new BaseMsg
{
Cmd = -1100,
User = vUser,
};
IMGMsgRsp.BaseMsg.Payloads = ByteString.CopyFrom(buffers);
IMGMsgRsp = client.HelloWechat(IMGMsgRsp, authHeader);
buffers = IMGMsgRsp.BaseMsg.Payloads.ToByteArray();
//Console.WriteLine(Encoding.UTF8.GetString(buffers));
*/
#endregion
}
}
catch (Exception ex)
{
this.WriteLog($"发送图片失败:{ex.Message} - {ex.StackTrace}");
this.ResetConnection();
}
finally
{
imgStream.Close();
imgStream.Dispose();
}
}
//public int SendImageCount;
/// <summary>
/// 发送图片
/// </summary>
/// <param name="username">要发送给谁</param>
/// <param name="src">图片路径支持http,https</param>
public override void SendImage(string username, string address)
{
//SendImageCount++;
try
{
//if (SendImageCount % 2 == 0) SendMessage("weixin", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
byte[] ImangByte = null;
string extension = Path.GetExtension(address);
if (address.StartsWith("http", StringComparison.InvariantCultureIgnoreCase))
{
var imagePath = Util.MapFile(DateTime.Now.Ticks.ToString() + "." + extension, "Cache\\image");
FileTools.DownloadImage(address, imagePath);
address = imagePath;
}
if (File.Exists(address))
{
ImangByte = File.ReadAllBytes(address);
if (ImangByte != null && ImangByte.Length >= 3)
{
SendImage(ImangByte, username);
}
}
else
{
SendCDNImage(username, address);
}
}
catch (Exception ex)
{
this.WriteLog("发送图片失败:" + ex.Message);
this.ResetConnection();
}
}
/// <summary>
/// 发送语音文件
/// </summary>
/// <param name="username">名称</param>
/// <param name="address">地址</param>
public override void SendVoice(string username, string url)
{
try
{
byte[] buf;
if (url.StartsWith("http", StringComparison.InvariantCultureIgnoreCase))
{
buf = new WebClient().DownloadData(url);
}
else
{
using (FileStream fsRead = new FileStream(url, FileMode.Open))
{
int fsLen = (int)fsRead.Length;
buf = new byte[fsLen];
fsRead.Read(buf, 0, buf.Length);
}
}
MemoryStream imgStream = new MemoryStream(buf);
int Startpos = 0;//起始位置
int datalen = 65535;//数据分块长度
long datatotalength = imgStream.Length;
string ClientImgId = User.Username + "_" + Util.TimeStamp().ToString();
int EndFlag = 0;
while (Startpos != (int)datatotalength)
{//
int count = 0;
if (datatotalength - Startpos > datalen)
{
count = datalen;
}
else
{
count = (int)datatotalength - Startpos;
EndFlag = 1;//最后一个块
}
byte[] data = new byte[65535];//不能更改此参数 若要更改必须同步c++ 缓冲器长度
imgStream.Seek(Startpos, SeekOrigin.Begin);
imgStream.Read(data, 0, count);
UploadVoiceInfo voiceinfo = new UploadVoiceInfo();
voiceinfo.ClientMsgId = ClientImgId;
voiceinfo.dwOffset = Startpos;
voiceinfo.dwVoiceBufLength = count;
voiceinfo.dwVoiceLength = 20000;//2s语音 超长语音好像手机端就不显示 多少秒了。。
voiceinfo.dwEndFlag = EndFlag;
voiceinfo.szVoiceBuf = data;
voiceinfo.dwVoiceFormat = 4;////0->Arm 无amr音频头 2->MP3 3->WAVE 4->SILK
voiceinfo.szToUserName = username;
Startpos = Startpos + count;
byte[] buffers = WXClientTool.CUploadVoice(User.User, voiceinfo);
int Seq = Util.ReadInt(buffers, 12);
//Console.WriteLine("Send Seq {0}", Seq);
WechatPack pack = new WechatPack(this);
pack.SendWx(buffers, Seq);
}
imgStream.Close();
}
catch (Exception ex)
{
WriteLog(ex.Message);
}
}
#region
private static string Expression = "[微笑],[憨笑],[呲牙],[爱心],[啤酒],[太阳],[礼物],[抱拳],[咖啡],[调皮],[激动],[回头],[色],[愉快],[爱情],[飞吻],[跳跳],[发抖],[转圈],[献吻],[耶],[红包],[嘿哈]";
private static List<string> ExpressionList = null;
private static Random random = new Random();
public static string FindRandomExpression()
{
if (ExpressionList == null)
ExpressionList = Expression.Split(',').ToList();
return ExpressionList[random.Next(ExpressionList.Count)];
}
#endregion
/// <summary>
/// 发送文本消息
/// </summary>
/// <param name="username">用户名</param>
/// <param name="content">消息正文</param>
/// <param name="atUsername">是否艾特用户</param>
public override Task<bool> SendMessage(string _username, string _content, string _atUsername = "")
{
string username = _username;
string content = _content;
string atUsername = _atUsername;
return Task.Run(() =>
{
if (string.IsNullOrEmpty(content)) return true;
content = content.Replace("\r\n", "\n").Trim().Replace("[时间]", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
var msgs = content.Split(new string[] { "[分段]" }, StringSplitOptions.RemoveEmptyEntries);
try
{
foreach (var msg in msgs)
{
var m = msg.Trim();
if (string.IsNullOrEmpty(m)) continue;
var message = m.RandomMess();
message = message.Contains("[随机表情]") ? message.Replace("[随机表情]", FindRandomExpression()) : message;
//if (message.StartsWith("[延迟="))
//{
// var reg = Regex.Match(message, @"\[延迟=(\d+)\]");
// if (reg.Success)
// {
// message = Regex.Replace(message, @"\[延迟=(\d+)\]", "").Trim();
// // this.WriteLog($"需要延迟{reg.Groups[1].Value}秒,再发送:{message}");
// Thread.Sleep(int.Parse(reg.Groups[1].Value) * 1000);
// }
//}
message = DelayMess(message);
ChatClient.Events.OnEvent(new WXSendMessage(this, message, username));
//发送XML消息
if (message.Trim().ToLower().StartsWith("<appmsg appid=") && message.Trim().ToLower().EndsWith("</appmsg>"))
{
WechatPack pack = new WechatPack(this);
var sendJson = new
{
ToUserName = username,
AppId = "",
Type = 5,
Content = message
};
pack.SendAll(WechatCmd.XML消息, false, sendJson);
//return true;
continue;
}
//发送公告消息
var matchs = Regex.Matches(message, @"\[公告\=([^\]]+)\]", RegexOptions.IgnoreCase);
if (username.Contains("@"))
{
foreach (Match match in matchs)
{
SetRoomNotice(match.Groups[1].Value, username);
}
}
message = Regex.Replace(message, @"\[公告\=([^\]]+)\]", "");
message = DelayMess(message);
//发送图片消息
matchs = Regex.Matches(message, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase);
foreach (Match match in matchs)
{
SendImage(username, match.Groups[1].Value);
}
message = Regex.Replace(message, @"\[图片\=([^\]]+)\]", "");
message = DelayMess(message);
//发送语音消息
matchs = Regex.Matches(message, @"\[语音\=([^\]]+)\]", RegexOptions.IgnoreCase);
foreach (Match item in matchs)
{
SendVoice(username, item.Groups[1].Value);
}
message = Regex.Replace(message, @"\[语音\=([^\]]+)\]", "");
message = DelayMess(message);
matchs = Regex.Matches(message, @"\[视频\=([^\]]+)\]", RegexOptions.IgnoreCase);
foreach (Match item in matchs)
{
try
{
var temp = item.Groups[1].Value;
if (File.Exists(temp)) continue;
var video = Util.StrToHex(temp);
if (video != null)
{
var video_json = Encoding.UTF8.GetString(video);
var video_data = HttpExtend.JsonToDictionary(video_json);
if (video_data != null)
{
//SendCDNInfo(username, video_data["cdnurl"].ToString(), video_data["aeskey"].ToString(), CDNType.发送视频);
SendCDNVideo(username, video_data["cdnurl"].ToString(), video_data["aeskey"].ToString());
}
}
}
catch (Exception ex)
{ }
}
message = Regex.Replace(message, @"\[视频\=([^\]]+)\]", "");
message = DelayMess(message);
matchs = Regex.Matches(message, @"\[卡片\=([^\]]+)\]", RegexOptions.IgnoreCase);
foreach (Match item in matchs)
{
SendCard(username, item.Groups[1].Value == "自己" ? User.Username : item.Groups[1].Value);
}
message = Regex.Replace(message, @"\[卡片\=([^\]]+)\]", "");
message = DelayMess(message);
if (string.IsNullOrWhiteSpace(message)) continue;
if (message.StartsWith("\r\n")) message = message.Substring("\r\n".Length);
if (message.StartsWith("\n")) message = message.Substring("\n".Length);
WechatPack send = new WechatPack(this);
#region id
List<string> atWxidList = new List<string>();
var regTmp = Regex.Matches(message, @"(?<全部>\[@(?<账号>[A-Za-z0-9_]+)\])");
foreach (Match item in regTmp)
{
if (item.Success)
{
var name = item.Groups["账号"].Value;
atWxidList.Add(name);
var friend = GetContact(name);
if (friend != null)
message = message.Replace(item.Groups["全部"].Value, $"@{friend.NickName} ");
}
}
if (atWxidList.Count != 0)
{
atUsername = string.Join(",", atWxidList);
}
#endregion
var sendData = new { ToUserName = username, Content = message.Trim(), Type = 0, MsgSource = atUsername };
send.SetNextData(new WechatPack.PackMsg() { cmd = WechatCmd., data = sendData });
RunSendMessageQueue(send);
}
return true;
}
catch (Exception ex)
{
this.WriteLog("SendMessage ERROR:" + ex.Message);
return false;
}
});
}
/// <summary>
/// 消息延迟
/// </summary>
/// <param name="message"></param>
public string DelayMess(string message)
{
try
{
message = message.Trim();
if (message.StartsWith("[延迟="))
{
var reg = Regex.Match(message, @"\[延迟=(\d+)\]");
if (reg.Success)
{
message = Regex.Replace(message, @"\[延迟=(\d+)\]", "").Trim();
// this.WriteLog($"需要延迟{reg.Groups[1].Value}秒,再发送:{message}");
Thread.Sleep(int.Parse(reg.Groups[1].Value) * 1000);
}
}
}
catch (Exception ex)
{ }
return message;
}
/// <summary>
///
/// </summary>
private DateTime fragmentTime = DateTime.MinValue;
private int fragmentCount = 0;
/// <summary>
/// 需要发送的消息队列
/// </summary>
private ConcurrentQueue<WechatPack> SendMessageQueue { get; set; } = new ConcurrentQueue<WechatPack>();
private object lock_sendmessage = new object();
private bool lock_sendmessage_ing = false;
Thread SendMessageThread;
private void RunSendMessageQueue(WechatPack sendPack)
{
SendMessageQueue.Enqueue(sendPack);
if (lock_sendmessage_ing) return;
lock (lock_sendmessage)
{
if (lock_sendmessage_ing) return;
lock_sendmessage_ing = true;
ThreadPool.QueueUserWorkItem(x =>
{
try
{
WechatPack pack = null;
while (SendMessageQueue.TryDequeue(out pack))
{
if (this.Status == WxStatus.线)
{
pack.SendNextData();
#region ,
if (ChatClient.MessFrequentSleepTime != 0)
{
fragmentCount++;
var totalSeconds = (DateTime.Now - fragmentTime).TotalSeconds;//上次休眠的时间差
bool rest = totalSeconds > 10;
if (fragmentCount >= 10 && totalSeconds <= 10)
{
rest = true;
Thread.Sleep(ChatClient.MessFrequentSleepTime * 1000);
}
if (rest)
{
fragmentCount = 1;
fragmentTime = DateTime.Now;
}
}
// if (ChatClient.MessFrequentSleepTime != 0)
// {
// var totalSeconds = (DateTime.Now - _SendTimePoint).TotalSeconds;
// if (_SendTimePoint == DateTime.MinValue || _MessCount < 10 && totalSeconds > 10d)
// {
// _SendTimePoint = DateTime.Now;
// _MessCount = -1;
// Thread.Sleep(50);
// }
// else if (_MessCount >= 10 && totalSeconds <= 10d)
// {
// _SendTimePoint = DateTime.MinValue;
// _MessCount = -1;
// Thread.Sleep(ChatClient.MessFrequentSleepTime * 1000);
// }
// _MessCount++;
//}
#endregion
}
}
}
catch (Exception)
{
}
finally
{
lock_sendmessage_ing = false;
}
});
}
}
private Dictionary<string, string> ContactQRcodes = new Dictionary<string, string>();
/// <summary>
/// 获取联系人二维码
/// </summary>
public override Bitmap GetRobotQRcode(bool Refresh = false)
{
try
{
var username = User.Username;
WechatPack pack = new WechatPack(this);
var data = pack.SendAll(WechatCmd., true, new { Username = username });
var text = Encoding.UTF8.GetString(data);
var _dic = Util.ConvertJsonToDic(text);
var ba64 = _dic["QrcodeBuf"].ToString();
var result = WXClientTool.GetImageFromBase64(ba64);
if (result != null) ContactQRcodes[username] = ba64;
return result;
}
catch (Exception e)
{
this.WriteLog("GetContactQRcode:" + e.Message + " - " + e.StackTrace);
return null;
}
}
public override string DownlowdImage(int msgid, string fromUsername, int datatotalength)
{
try
{
List<byte> downImgData = new List<byte>();
int Startpos = 0;//起始位置
int datalen = 30720;//数据分块长度
// long datatotalength = 55843;//根据需要选择下载 高清图还是缩略图 长度自然是对应 高清长度和缩略长度
while (Startpos != (int)datatotalength)
{//
int count = 0;
if (datatotalength - Startpos > datalen)
{
count = datalen;
}
else
{
count = (int)datatotalength - Startpos;
}
var payLoadJson = new
{
MsgId = msgid,
ToUsername = fromUsername,//ToUserName 字段值
StartPos = Startpos,
TotalLen = (int)datatotalength,
DataLen = count,
CompressType = 0,//hdlength 1高清0缩略
};
WechatPack pack = new WechatPack(this);
var buffers = pack.SendAll(WechatCmd., true, payLoadJson);
//Console.WriteLine(Encoding.UTF8.GetString(buffers));
Startpos = Startpos + buffers.Length;//已实际接受的块的长度做好偏移 下次从 Startpos + buffers.Length 开始拼接
downImgData.AddRange(buffers);
}
string image = Util.MapFile(Guid.NewGuid().ToString() + ".jpg", "Cache\\Image");
using (FileStream fs = new FileStream(image, FileMode.Create))
{
fs.Write(downImgData.ToArray(), 0, downImgData.ToArray().Length);
fs.Close();
}
return image;
}
catch (Exception) { }
return string.Empty;
}
public void SnsVerify(string code, bool isHongbao, string reqKey, BankCar bank, string token, string pass)
{
//确认支付时返回的JSON
//此处只有短链接
object obj = null;
if (bank != null)
{
obj = new
{
CgiCmd = isHongbao ? 1617 : 1592,//1617支付红包返回的短信验证 1592 转账支付时候返回的短信
ReqKey = reqKey,
Bank_TYPE = bank.bank_type,
Bind_SERIAL = bank.bind_serial,//Bank_TYPE=Bind_SERIAL=CFT时 使用零钱转支付 银行卡支付请填写银行卡id 获取银行卡ID btn_GetBlankID_Click
Token = token,//在返回的json里寻找token字段
PassWord = pass,
SMSVerityCode = code,//短信验证码
PayScene = bank == null ? "37" : "21" //37使用零钱支付 21银行卡支付(如果支付不成功请联系我重新抓)
};
}
else
{
obj = new
{
Bank_TYPE = "CFT",
Bind_SERIAL = "CFT",
CgiCmd = isHongbao ? 1617 : 1592,//1617支付红包返回的短信验证 1592 转账支付时候返回的短信
ReqKey = reqKey,
Token = token,//在返回的json里寻找token字段
PassWord = pass,
SMSVerityCode = code,//短信验证码
PayScene = bank == null ? "37" : "21" //37使用零钱支付 21银行卡支付(如果支付不成功请联系我重新抓)
};
}
string json = CsharpHttpHelper.HttpHelper.ObjectToJson(obj);
WechatPack send = new WechatPack(this);
send.Send(WechatCmd., json);
}
public override string CreateChatRoom(string members)
{
try
{
WechatPack pack = new WechatPack(this);
var data = pack.Send(WechatCmd., new
{
Membernames = members,
ProtocolVer = 1,//值为 1 2 4 6 当然这里你填写3也就是mac的账号密码登陆 具体会出什么问题 自行尝试
});
var temp = pack.Analysis(data);
var rest = Encoding.UTF8.GetString(temp);
//var json = HttpHelper.ObjectToJson(rest);
Lable[] temp_list = HttpHelper.JsonToObject<Lable[]>(rest) as Lable[];
if (temp_list != null) Lables = temp_list.ToList();
}
catch (Exception ex)
{
this.WriteLog("创建群异常:" + ex.Message + " - " + ex.StackTrace);
}
return string.Empty;
}
public override string CreateChatRoom(string[] wxids)
{
try
{
if (wxids == null || wxids.Length == 0) return string.Empty;
WechatPack pack = new WechatPack(this);
var data = pack.Send(WechatCmd., new
{
Membernames = string.Join(",", wxids),
ProtocolVer = 1,//值为 1 2 4 6 当然这里你填写3也就是mac的账号密码登陆 具体会出什么问题 自行尝试
});
var temp = pack.Analysis(data);
var rest = Encoding.UTF8.GetString(temp);
//var json = HttpHelper.ObjectToJson(rest);
Lable[] temp_list = HttpHelper.JsonToObject<Lable[]>(rest) as Lable[];
if (temp_list != null) Lables = temp_list.ToList();
}
catch (Exception ex)
{
this.WriteLog("创建群异常:" + ex.Message + " - " + ex.StackTrace);
}
return string.Empty;
}
public override void AddChatRoomMember(string groupid, string members)
{
try
{
WechatPack pack = new WechatPack(this);
var payLoadJson = pack.Send(WechatCmd., new
{
Roomeid = groupid,
Membernames = members,
});
}
catch (Exception ex)
{
this.WriteLog("添加群用户异常:" + ex.Message + " - " + ex.StackTrace);
}
}
/// <summary>
/// 设置公告
/// </summary>
/// <param name="groupId"></param>
/// <param name="notice"></param>
public override void SetRoomNotice(string notice, string groupId)
{
try
{
WechatPack pack = new WechatPack(this);
pack.Send(WechatCmd., new
{
ChatRoomName = groupId,//群ID
Announcement = notice//公告内容
});
}
catch (Exception ex)
{
this.WriteLog("发送公告异常:" + ex.Message + " - " + ex.StackTrace);
}
}
[Obsolete("该方法过时,发视频使用:SendCDNVideo,发图片使用:SendCDNImage")]
public override void SendCDNInfo(string tousername, string cdnurl, string aeskey, CDNType type)
{
object payLoadJson = null;
if (type == CDNType.)
{
payLoadJson = new
{
ToUserName = tousername,
ThumbTotalLen = 2883,//中的值 cdnthumblength=\"2883\"
ThumbStartPos = 2883,////中的值 cdnthumblength=\"2883\"
VideoTotalLen = 401645,//中的值 length=\"401645\"
VideoStartPos = 401645,//中的值 length=\"401645\"
PlayLength = 2,//playlength=\"2\"
AESKey = aeskey,//aeskey=\"ad5b38f66c5849499f294a725e9719a8\"
CDNVideoUrl = cdnurl,//中的值 cdnvideourl=\"304b020100044430420201000204d26d70fe02033d0af802047130feb602045953265e0420777869645f6d307238796d61636f693670333234365f313439383632313533330201000201000400\"
};
WechatPack sendPack = new WechatPack(this);
sendPack.SendAll(WechatCmd.CDN数据, false, payLoadJson);
}
else if (type == CDNType.)
{
string ClientImgId = this.User.Username + "_" + Util.TimeStamp();
payLoadJson = JsonConvert.SerializeObject(new
{
ClientImgId = ClientImgId,
ToUserName = tousername,
StartPos = 0,
TotalLen = 31572,
DataLen = 31572,
CDNMidImgUrl = cdnurl,
AESKey = aeskey,
CDNMidImgSize = 31572,
CDNThumbImgSize = 3011,
CDNThumbImgHeight = 100,
CDNThumbImgWidth = 343
});
WechatPack sendPack = new WechatPack(this);
sendPack.SendAll(WechatCmd., false, payLoadJson);
}
}
/// <summary>
/// 发送CDN视频
/// </summary>
/// <param name="tousername"></param>
/// <param name="cdnurl"></param>
/// <param name="aeskey"></param>
public override void SendCDNVideo(string tousername, string cdnurl, string aeskey)
{
var payLoadJson = new
{
ToUserName = tousername,
ThumbTotalLen = 2883,//中的值 cdnthumblength=\"2883\"
ThumbStartPos = 2883,////中的值 cdnthumblength=\"2883\"
VideoTotalLen = 401645,//中的值 length=\"401645\"
VideoStartPos = 401645,//中的值 length=\"401645\"
PlayLength = 2,//playlength=\"2\"
AESKey = aeskey,//aeskey=\"ad5b38f66c5849499f294a725e9719a8\"
CDNVideoUrl = cdnurl,//中的值 cdnvideourl=\"304b020100044430420201000204d26d70fe02033d0af802047130feb602045953265e0420777869645f6d307238796d61636f693670333234365f313439383632313533330201000201000400\"
};
WechatPack sendPack = new WechatPack(this);
sendPack.SendAll(WechatCmd.CDN数据, false, payLoadJson);
}
public override void SendCDNImage(string tousername, string data)
{
try
{
string ClientImgId = this.User.Username + "_" + Util.TimeStamp();
var tmp = Util.StrToHex(data);
if (tmp != null)
{
var image_json = Encoding.UTF8.GetString(tmp);
var cdnImgMsg = HttpHelper.JsonToObject<CDNImageMsgInfo>(image_json) as CDNImageMsgInfo;
if (cdnImgMsg != null)
{
var payLoadJson = string.Empty;
if (!string.IsNullOrWhiteSpace(cdnImgMsg.CDNBigImgUrl))
{
payLoadJson = JsonConvert.SerializeObject(new
{
ClientImgId = ClientImgId,
ToUserName = tousername,
StartPos = cdnImgMsg.StartPos,
TotalLen = cdnImgMsg.TotalLen,
DataLen = cdnImgMsg.DataLen,
AESKey = cdnImgMsg.AESKey,
CDNMidImgUrl = cdnImgMsg.CDNMidImgUrl,
CDNMidImgSize = cdnImgMsg.CDNMidImgSize,
CDNBigImgUrl = cdnImgMsg.CDNBigImgUrl,
CDNBigImgSize = cdnImgMsg.CDNBigImgSize,
CDNThumbImgSize = cdnImgMsg.CDNThumbImgSize,
CDNThumbImgHeight = cdnImgMsg.CDNThumbImgHeight,
CDNThumbImgWidth = cdnImgMsg.CDNThumbImgWidth,
CompressType = 1,//高清
});
}
else
{
payLoadJson = JsonConvert.SerializeObject(new
{
ClientImgId = ClientImgId,
ToUserName = tousername,
StartPos = cdnImgMsg.StartPos,
TotalLen = cdnImgMsg.TotalLen,
DataLen = cdnImgMsg.DataLen,
AESKey = cdnImgMsg.AESKey,
CDNMidImgUrl = cdnImgMsg.CDNMidImgUrl,
CDNMidImgSize = cdnImgMsg.CDNMidImgSize,
CDNThumbImgSize = cdnImgMsg.CDNThumbImgSize,
CDNThumbImgHeight = cdnImgMsg.CDNThumbImgHeight,
CDNThumbImgWidth = cdnImgMsg.CDNThumbImgWidth
});
}
WechatPack sendPack = new WechatPack(this);
var result = sendPack.SendAll(WechatCmd., false, payLoadJson);
var text = Encoding.UTF8.GetString(result);
var _dic = Util.ConvertJsonToDic(text);
if (_dic != null)
{ }
//for (int i = 0; i < 10; i++)
//{
// try
// {
// if (i % 2 == 0) SendMessage("weixin", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
// }
// catch (Exception ex)
// {
// }
// Thread.Sleep(5000);
//}
}
}
}
catch (Exception ex)
{
}
}
/// <summary>
/// 发送朋友圈
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public override string SendCircle(string msg)
{
try
{
msg = msg.RandomMess().Trim();
if (msg.StartsWith("<TimelineObject>") && msg.EndsWith("</TimelineObject>"))
{
try
{
msg = Regex.Replace(msg, @"videomd5=""(.{32})""", @"videomd5=""" + Util.GetMD5Hash(Guid.NewGuid().ToByteArray()) + @"""");
msg = Regex.Replace(msg, @"md5=""(.{32})""", @"md5=""" + Util.GetMD5Hash(Guid.NewGuid().ToByteArray()) + @"""");
}
catch (Exception)
{ }
return _UplodCirele(msg);
}
else
{
if (!msg.Contains("[图片")) throw new Exception("请插入任意一张图片!");
//检测图片、如果是本地图片或非微信服务器图片、将自动上传并返回最新地址
List<string> images = null;
var match = Regex.Matches(msg, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase);
if (match.Count > 0)
{
images = new List<string>();
foreach (Match item in match)
{
images.Add(item.Groups[1].Value);
}
msg = Regex.Replace(msg, "\\[图片=.*?\\]", "").Trim();
}
var t = SendCircle(msg, images);
return t;
}
}
catch (Exception ex)
{ }
return string.Empty;
}
/// <summary>
/// 获取朋友圈
/// </summary>
/// <param name="username">微信ID</param>
/// <param name="firstPageMd5">页码</param>
/// <param name="MaxId">页码ID</param>
/// <returns></returns>
public override List<Dictionary<string, object>> FindCircle(string username, string firstPageMd5 = "", long MaxId = 0)
{
try
{
WechatPack send = new WechatPack(this);
var data = send.SendAll(WechatCmd., true, new
{
firstPageMd5 = firstPageMd5,
Username = username,//访问好友朋友圈的wxid
MaxId = MaxId //首页为0 次页朋友圈数据id 的最小值
});
var message = Encoding.UTF8.GetString(data);
//Console.WriteLine(message);
var dic = CsharpHttpHelper.HttpExtend.JsonToDictionary(message);
if (dic != null)
{
var objs = dic["SnsObjects"] as ArrayList;
if (objs == null || objs.Count == 0) throw new Exception(username + ",朋友圈没有数据!");
List<Dictionary<string, object>> _objs = new List<Dictionary<string, object>>();
foreach (Dictionary<string, object> item in objs)
{
_objs.Add(item);
}
int i, j; //先定义一下要用的变量
for (i = 0; i < _objs.Count - 1; i++)
{
for (j = i + 1; j < _objs.Count; j++)
{
var i_ = long.Parse(_objs[i]["CreateTime"].ToString());
var j_ = long.Parse(_objs[j]["CreateTime"].ToString());
if (i_ < j_) //如果第二个小于第一个数
{
//交换两个数的位置,在这里你也可以单独写一个交换方法,在此调用就行了
var temp = _objs[i]; //把大的数放在一个临时存储位置
_objs[i] = _objs[j]; //然后把小的数赋给前一个,保证每趟排序前面的最小
_objs[j] = temp; //然后把临时位置的那个大数赋给后一个
}
}
}
return _objs;
}
}
catch (Exception)
{ }
return new List<Dictionary<string, object>>();
}
/// <summary>
/// 获取朋友圈内容
/// </summary>
/// <returns></returns>
public override List<Dictionary<string, object>> FindCircles()
{
try
{
var obj = new { ClientLatestId = 0 };
WechatPack pack = new WechatPack(this);
var home = pack.SendAll(WechatCmd., true, obj);
string text = Encoding.UTF8.GetString(home);
var dic = CsharpHttpHelper.HttpExtend.JsonToDictionary(text);
if (dic != null)
{
var objs = dic["SnsObjects"] as ArrayList;
if (objs == null || objs.Count == 0) return new List<Dictionary<string, object>>();
List<Dictionary<string, object>> _objs = new List<Dictionary<string, object>>();
foreach (Dictionary<string, object> item in objs)
{
_objs.Add(item);
}
int i, j; //先定义一下要用的变量
for (i = 0; i < _objs.Count - 1; i++)
{
for (j = i + 1; j < _objs.Count; j++)
{
var i_ = long.Parse(_objs[i]["CreateTime"].ToString());
var j_ = long.Parse(_objs[j]["CreateTime"].ToString());
if (i_ < j_) //如果第二个小于第一个数
{
//交换两个数的位置,在这里你也可以单独写一个交换方法,在此调用就行了
var temp = _objs[i]; //把大的数放在一个临时存储位置
_objs[i] = _objs[j]; //然后把小的数赋给前一个,保证每趟排序前面的最小
_objs[j] = temp; //然后把临时位置的那个大数赋给后一个
}
}
}
return _objs;
}
}
catch (Exception)
{
}
return new List<Dictionary<string, object>>();
}
/// <summary>
/// 发表评论
/// </summary>
/// <param name="username">发送的微信ID</param>
/// <param name="circleId">朋友圈的ID</param>
/// <param name="content">发送的内容</param>
/// <returns></returns>
public override void SendCircleComment(string username, string circleId, string content)
{
#region
//try
//{
// WechatPack pack = new WechatPack(this);
// var result = pack.Send(WechatCmd.评论或点赞, new
// {
// ID = circleId,//朋友圈ID
// ToUsername = username,//欲被点赞的或评论的wxid 发送该朋友圈的wxid
// Type = 2,//1点赞2评论
// Content = content //评论的内容
// });
// //return Encoding.UTF8.GetString(result);
//}
//catch (Exception ex)
//{
// WriteLog("SendCircleComment Error:" + ex.Message);
//}
#endregion
//string username = _username;
//string circleId = _circleId;
//string content = _content;
if (string.IsNullOrEmpty(content)) return;
content = content.Replace("\r\n", "\n").Trim();
var msgs = content.Split(new string[] { "[分段]" }, StringSplitOptions.RemoveEmptyEntries);
//Task.Run(delegate
//{
try
{
WechatPack pack = new WechatPack(this);
foreach (var msgTmp in msgs)
{
var msg = msgTmp.RandomMess();
pack.Send(WechatCmd., new
{
ID = circleId,//朋友圈ID
ToUsername = username,//欲被点赞的或评论的wxid 发送该朋友圈的wxid
Type = 2,//1点赞2评论
Content = msg //评论的内容
});
Thread.Sleep(2450 + new Random().Next(50, 1000));
}
}
catch (Exception ex)
{
WriteLog("SendCircleComment Error:" + ex.Message);
}
//});
}
private List<Lable> Lables = new List<Lable>();
/// <summary>
/// 获取标签
/// </summary>
public override List<Lable> GetLabelList(bool refresh = false)
{
try
{
if (!refresh && Lables.Count != 0) return Lables;
WechatPack pack = new WechatPack(this);
var data = pack.Send(WechatCmd., null);
var temp = pack.Analysis(data);
var rest = Encoding.UTF8.GetString(temp);
//var json = HttpHelper.ObjectToJson(rest);
Lable[] temp_list = HttpHelper.JsonToObject<Lable[]>(rest) as Lable[];
if (temp_list != null) Lables = temp_list.ToList();
}
catch (Exception) { }
return Lables;
}
/// <summary>
/// 添加标签
/// </summary>
public override bool AddLabel(string TagName)
{
try
{
if (Lables.Count == 0) GetLabelList();
if (Lables.FirstOrDefault(f => f.LabelName == TagName) != null) return true;
string payloadJson = "{\"LabelName\":\"" + TagName + "\"}";
WechatPack pack = new WechatPack(this);
var data = pack.Send(WechatCmd., payloadJson);
var rest = pack.Analysis(data);
var json = HttpHelper.JsonToObject<Lable[]>(Encoding.UTF8.GetString(rest)) as Lable[];
if (json != null)
{
foreach (var item in json)
{
if (Lables.FirstOrDefault(f => f.LabelID == item.LabelID) == null) Lables.Add(item);
}
return true;
}
//Console.WriteLine();
}
catch (Exception)
{
}
return false;
}
/// <summary>
/// 修改标签
/// </summary>
public override bool EditUserLabel(string[] Users, List<Lable> Lable)
{
try
{
List<string> list = new List<string>();
foreach (var item in Lable) list.Add(item.LabelID);
string payloadJson = JsonConvert.SerializeObject(new
{
Labelids = string.Join(",", list),//标签id ,号分割 1,2,3,4
UserLists = string.Join(",", Users) //微信id 逗号分隔如1,2,2,
});
WechatPack pack = new WechatPack(this);
var data = pack.Send(WechatCmd., payloadJson);
//var rest = pack.Analysis(data);
//var json = Encoding.UTF8.GetString(rest);
return true;
}
catch (Exception) { }
return false;
}
/// <summary>
/// 点赞
/// </summary>
/// <param name="username"></param>
/// <param name="circleId"></param>
public override void SendCirclePraise(string username, string circleId)
{
try
{
WechatPack pack = new WechatPack(this);
var result = pack.Send(WechatCmd., new
{
ID = circleId,//朋友圈ID
ToUsername = username,//欲被点赞的或评论的wxid 发送该朋友圈的wxid
Type = 1,//1点赞2评论
Content = "" //评论的内容
});
//return Encoding.UTF8.GetString(result);
}
catch (Exception ex)
{
WriteLog("SendCirclePraise Error:" + ex.Message);
}
}
#region
private string SendCircle(string content, List<string> images = null)
{
string str = UplodCircleStr(content, images);
return _UplodCirele(str);
}
private string _UplodCirele(string content)
{
try
{
var match = Regex.Matches(content, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase);
foreach (Match item in match)
{
try
{
var url = item.Groups[1].Value;
url = UplodCircleImage(url);
if (string.IsNullOrWhiteSpace(url)) continue;
content = content.Replace($"[图片={item.Groups[1].Value}]", url);
}
catch (Exception)
{
}
}
var payloadJson = new
{
Content = Encoding.UTF8.GetBytes(content)
};
WechatPack send = new WechatPack(this);
return Encoding.UTF8.GetString(send.SendAll(WechatCmd., true, payloadJson));
}
catch (Exception ex)
{
WriteLog("发送朋友圈失败:" + ex.Message);
return null;
}
}
/// <summary>
/// 关注公众号
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
public override bool FocusWechat(string username)
{
try
{
var qr_reg = Regex.Match(username, "http://weixin.qq.com/r/([a-zA-Z0-9]+)");
string data = string.Empty;
if (qr_reg.Success) data = qr_reg.Groups[1].Value + "@qr";
else if (!Regex.Match(username, "^gh_.*?$").Success) throw new Exception("公众号格式错误,请重新输入!");
else data = username;
string payloadJson = JsonConvert.SerializeObject(new
{
Encryptusername = data,//非原始id 或扫码后的id 识别二维码后得到http://weixin.qq.com/r/RjndxWXExji5rSGm92xU 账号为RjndxWXExji5rSGm92xU@qr 直接关注即可
Ticket = "",//v2_
Type = 1,//1关注公众号2打招呼 主动添加好友3通过好友请求
Sence = 3,
Content = "",//打招呼内容
ProtocolVer = 1 //ProtocolVer 1-5
});
WechatPack pack = new WechatPack(this);
pack.SendAll(WechatCmd., false, payloadJson);
return true;
}
catch (Exception ex)
{
WriteLog("FocusWechat 异常:" + ex.Message);
}
return false;
}
public override Dictionary<string, object> SerchKeyword(string keyword)
{
try
{
WechatPack pack = new WechatPack(this);
var result = pack.Send(WechatCmd., new
{
Searchinfo = keyword
});
result = pack.Analysis(result);
var json = Encoding.UTF8.GetString(result);
return HttpExtend.JsonToDictionary(json);
}
catch (Exception ex)
{
WriteLog("SerchKeyword 异常:" + ex.Message);
}
return null;
}
/// <summary>
/// 编辑用户信息
/// </summary>
/// <param name="username">操作用户</param>
/// <param name="type">操作类型</param>
/// <param name="remark">如果Type=备注,为空表示取消备注,不为空表示备注所填写内容</param>
public override void EditContacts(string username, EditContactsType type, string remark = "")
{
for (int i = 0; i < 3; i++)
{
try
{
if (!string.IsNullOrEmpty(remark))
{
if (remark.Length > 55)
{
remark = remark.Substring(0, 55);
}
}
var payloadJson = "{\"Cmdid\":2,\"CmdBuf\":\"" + username + "\",\"BitVal\":" + (int)type + ",\"Remark\":\"" + remark + "\"}";
WechatPack pack = new WechatPack(this);
pack.Send(WechatCmd., payloadJson);
}
catch (Exception)
{
this.WriteLog($"更新用户信息[{username}]失败!" + type + "," + remark);
}
Thread.Sleep(300);
}
}
/// <summary>
/// 拼接上传信息
/// </summary>
private string UplodCircleStr(string content, List<string> images = null)
{
StringBuilder sb = new StringBuilder();
sb.Append("<TimelineObject><id>" + Util.GenerateRandomCode(20) + "</id><username>weixin</username><createTime>" + Util.TimeStamp() + "</createTime><contentDescShowType>0</contentDescShowType><contentDescScene>0</contentDescScene><private>0</private>");
sb.Append("<contentDesc>" + content + "</contentDesc>");
sb.Append("<contentattr>0</contentattr>");
sb.Append("<sourceUserName></sourceUserName><sourceNickName></sourceNickName><statisticsData></statisticsData><weappInfo><appUserName></appUserName><pagePath></pagePath></weappInfo><canvasInfoXml></canvasInfoXml><ContentObject>");
sb.Append("<contentStyle>1</contentStyle>");
sb.Append("<contentSubStyle>0</contentSubStyle>");
sb.Append("<title></title>");
sb.Append("<description></description>");
sb.Append("<contentUrl>https://support.weixin.qq.com/cgi-bin/mmsupport-bin/readtemplate?t=page/common_page__upgrade&amp;v=1</contentUrl>");
sb.Append("<mediaList>");
if (images != null)
{
foreach (string temp in images)
{
var url = UplodCircleImage(temp);
//Console.WriteLine("url=" + url);
if (string.IsNullOrEmpty(url))
continue;
sb.Append("<media>");
sb.Append("<id>" + Util.GenerateRandomCode(20) + "</id>");
sb.Append("<type>2</type>");
sb.Append("<title></title>");
sb.Append("<description></description>");
sb.Append("<private>0</private>");
sb.Append("<url type=\"1\">" + url + "</url>");
sb.Append("<thumb type=\"1\">" + url + "</thumb>");
sb.Append("<size height=\"0\" width=\"0\" totalSize=\"209026.0\"></size>");
sb.Append("</media>");
}
}
sb.Append("</mediaList>");
sb.Append("</ContentObject><actionInfo><appMsg><mediaTagName></mediaTagName><messageExt></messageExt><messageAction></messageAction></appMsg></actionInfo><appInfo><id></id></appInfo><location city=\"\" poiClassifyId=\"\" poiName=\"\" poiAddress=\"\" poiClassifyType=\"0\"></location><publicUserName></publicUserName></TimelineObject>");
return sb.ToString();
}
/// <summary>
/// 开始上传图片
/// </summary>
private string UplodCircleImage(string url)
{
try
{
var urlResult = string.Empty;
for (int i = 0; i < 8; i++)
{
byte[] data;
if (url.StartsWith("http"))
{
url = url.Replace("&amp;", "");
if (url.Contains("qpic.cn")) return url;
HttpHelper http = new HttpHelper();
var item = http.GetItem(url);
item.ResultType = CsharpHttpHelper.Enum.ResultType.Byte;
data = http.GetHtml(item).ResultByte;
}
else
{
FileInfo aFileInfo = new FileInfo(url);
using (FileStream fsRead = aFileInfo.Open(FileMode.Open))
{
int fsLen = (int)fsRead.Length;
data = new byte[fsLen];
fsRead.Read(data, 0, data.Length);
}
}
data = Util.CompressionImage(new MemoryStream(data), 25);
WechatPack send = new WechatPack(this);
byte[] result = null;
string ClientImgId = User.Username + "_" + Util.TimeStamp().ToString();
var send_data = new
{
StartPos = 0,
ClientId = ClientImgId,
TotalLen = data.Length,
Uploadbuf = data,
};
result = send.SendAll(WechatCmd., true, send_data);
urlResult = Encoding.UTF8.GetString(result);
if (string.IsNullOrWhiteSpace(urlResult))
{
Thread.Sleep(100);
continue;
}
break;
}
return urlResult;
}
catch
{
return string.Empty;
}
}
#endregion
#endregion
#region
private string HexToStr(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("x2");
}
}
return returnStr;
}
private string SixTwoData(string imei)
{
string hexStr = HexToStr(Encoding.UTF8.GetBytes(imei)).Replace(" ", "");
string str = "62706c6973743030d4010203040506090a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a2070855246e756c6c5f1020" + hexStr + "5f100f4e534b657965644172636869766572d10b0c54726f6f74800108111a232d32373a406375787d0000000000000101000000000000000d0000000000000000000000000000007f";
return str;
}
WxQrcode _loginWxQrcode;
WechatPack _loginPack;
/// <summary>
/// 获得登录图片
/// </summary>
public void FindLoginImage(LoginDeviceType type)
{
try
{
Connection();
this.User = new WeixinBaseUser(new User() { SessionKey = ByteString.CopyFrom(WXClientTool.random_encry_key), DeviceId = DeviceId });
this.LoginDeviceType = type;
_loginPack = new WechatPack(this);
var data = new
{
ProtocolVer = (int)this.LoginDeviceType,//此处只有1 3 5值
DeviceName = DeviceName
};
ChangeStatus(WxStatus.);
//WriteLog("获取二维码0");
var byteData = _loginPack.Send(WechatCmd., data);
//WriteLog("获取二维码1");
byteData = _loginPack.SendWx(byteData);
//WriteLog("获取二维码2");
byteData = _loginPack.Analysis(byteData);
//WriteLog("获取二维码3");
string _temp = Encoding.UTF8.GetString(byteData);
_loginWxQrcode = JsonConvert.DeserializeObject<WxQrcode>(_temp);
this._loginTemp = new LoginTemp();
this._loginTemp.UUId = _loginWxQrcode.Uuid;
this._loginTemp.NotifyKey = _loginWxQrcode.NotifyKey;
this._loginTemp.LongHead = _loginPack.Req.BaseMsg.LongHead;
this._loginTemp.HeadFlag = false;
ChangeStatus(WxStatus., new WXChangeStatus(this) { ImageByte = _loginWxQrcode.ImgBuf });
}
catch (Exception ex)
{
throw ex;
}
}
private LoginTemp _loginTemp;
private string UUID { get; set; }
private string DeviceType { get; set; }
class LoginTemp
{
public string UUId { get; set; }
public byte[] NotifyKey { get; set; }
public ByteString LongHead { get; set; }
public bool HeadFlag { get; set; }
}
/// <summary>
/// 实现发红包
/// </summary>
/// <param name="toUsername"></param>
/// <param name="content"></param>
/// <param name="TotalAmount"></param>
/// <param name="password"></param>
/// <param name="count"></param>
/// <param name="type"></param>
/// <param name="bank"></param>
/// <param name="param"></param>
/// <returns></returns>
public override string SendPay(string toUsername, string content, int TotalAmount, string password, int count, PayType type, BankCar bank = null, Dictionary<string, object> param = null)
{
try
{
int code = 385;
string payloadJson = string.Empty;
if (type == PayType.)
{
payloadJson = "{\"CgiCmd\":1,\"HBType\":\"0\",\"HBFrom\":\"0\",\"ToUsername\":\"" + toUsername + "\",\"Count\":\"" + count + "\",\"TotalAmount\":\"" + TotalAmount + "\",\"HBContent\":\" " + content + "\"}";
}
else
{
payloadJson = "{\"CgiCmd\":83,\"Desc\":\"" + content + "\",\"ToUsername\":\"" + toUsername + "\",\"Count\":\"" + TotalAmount + "\"}";
}
WechatPack send = new WechatPack(this);
//CMD = 385
var data = send.Send(code, payloadJson);
data = send.Analysis(data);
string text = Encoding.UTF8.GetString(data);
string ReqKey = string.Empty;
if (type == PayType.)
ReqKey = WXClientTool.BetweenArr(text, "reqkey\":\"", "\",\"scene");
else
ReqKey = WXClientTool.BetweenArr(text, "req_key\":\"", "\",\"tansfering_status");
if (bank != null)
{
payloadJson = Util.ObjectToJson(new
{
CgiCmd = 0,
ReqKey = ReqKey,
PassWord = password,
Bank_TYPE = bank.bank_type,
Bind_SERIAL = bank.bind_serial
});
}
else
{
payloadJson = Util.ObjectToJson(new
{
CgiCmd = 0,
ReqKey = ReqKey,
PassWord = password
});
}
data = send.Send(code, payloadJson);
//data = send.SendWx(data);
if (data == null)
throw new Exception("服务器繁忙,请稍后重试");
data = send.Analysis(data);
text = Encoding.UTF8.GetString(data);
//Console.WriteLine(text);
if (text.Contains("支付成功") || text.Contains("请确认银行卡是否扣款后再试")) return null;
else
{
if (param != null)
{
param["reqKey"] = ReqKey;
param["bank"] = bank;
param["isHongbao"] = type == PayType. ? true : false;
param["result"] = text;
param["pass"] = password;
}
this.WriteLog("支付失败:" + text);
return text;
}
}
catch (Exception ex)
{
if (ex.Message.Contains("请确认银行卡是否扣款后再试")) return null;
//else if (ex.Message.Contains("服务器繁忙,请稍后重试")) return null;
this.WriteLog("支付失败:" + ex.Message);
return ex.Message;
}
}
/// <summary>
/// 登录状态检测
/// </summary>
public void FindLoginStatus()
{
try
{
if (_loginWxQrcode.Status == 2)
{
return;
}
if (_loginWxQrcode == null) return;
if (_loginWxQrcode.Status == 4)
{
ChangeStatus(WxStatus.);
return;
}
if (_loginWxQrcode.Status == 1 && !_loginTemp.HeadFlag)
{
//lab_ShowMsg.Text = "已扫描 未确认";
using (WebClient _client = new WebClient())
{
_loginTemp.HeadFlag = true;
ChangeStatus(WxStatus., new WXChangeStatus(this) { ImageByte = _client.DownloadData(_loginWxQrcode.HeadImgUrl) });
}
}
this.User.User.MaxSyncKey = ByteString.CopyFrom(this._loginTemp.NotifyKey);
var data = _loginPack.Send(WechatCmd., Encoding.UTF8.GetBytes(this._loginTemp.UUId), this._loginTemp.LongHead);
data = _loginPack.SendWx(data);
data = _loginPack.Analysis(data);
var text = Encoding.UTF8.GetString(data);
_loginWxQrcode = JsonConvert.DeserializeObject<WxQrcode>(text);
if (_loginWxQrcode != null) ChatClient.Events.OnEvent(new WXScavengEvents(this) { Status = _loginWxQrcode.Status });
if (_loginWxQrcode.Status == 2)
{
UUID = Util.MD5Encrypt(_loginWxQrcode.Username);
Password = _loginWxQrcode.Password;
Login(_loginWxQrcode.Username, _loginWxQrcode.Password);
}
}
catch (Exception ex)
{
//ChatClient.Events.OnEvent(new WXWriteLog(this) { Message = ex.Message+","+ex.StackTrace} );
}
}
private LoginDeviceType LoginDeviceType = LoginDeviceType.;
/// <summary>
/// 登录密码
/// </summary>
public string Password { get; set; }
internal bool Login(string username, string userpass, string data62 = "")
{
try
{
//if (LoginDeviceType == LoginDeviceType.未知) LoginDeviceType = LoginDeviceType.Windows;
#region
Status = WxStatus.;
//构造二维码登陆封包结构
string UUid = Guid.NewGuid().ToString();//随机uuid 667D18B2-BCE3-4AA2-8ED1-7FDC19446567
string md5 = Util.MD5Encrypt(username);
this.DeviceType = string.Format("<k21>TP_lINKS_5G</k21><k22>中国移动</k22><k24>{0}:{1}:{2}:{3}:{4}:{5}</k24>", md5.Substring(0, 2), md5.Substring(2, 4), md5.Substring(4, 6), md5.Substring(6, 8), md5.Substring(8, 10), md5.Substring(8, 12)); // string DeviceType = "<k21>TP_lINKS_5G</k21><k22>中国移动</k22><k24>c1:cd:2d:1c:5b:11</k24>";//随机 单号保持同一设备信息
if (this.LoginDeviceType == LoginDeviceType.) this.LoginDeviceType = LoginDeviceType.Windows;
// "{\"Username\":\"" + username + "\",\"PassWord\":\"" + userpass + "\",\"UUid\":\"" + UUid + "\",\"DeviceType\":\"" + DeviceType + "\"}";
var payLoadJson = new
{
Username = username,
PassWord = userpass,
UUid = UUid,
DeviceType = DeviceType,
DeviceName = DeviceName,//新增的字段
ProtocolVer = (int)this.LoginDeviceType
};
//this.User = new User() { SessionKey = ByteString.CopyFrom(randomEncryKey), DeviceId = DeviceId };
int cmd = (this.LoginDeviceType == LoginDeviceType.QQBrowser) ? 380 : 1111;
if (userpass.Length <= 32 && !string.IsNullOrEmpty(data62))
{
Connection();
//this.LoginDeviceType = LoginDeviceType.Ipad;
this.DeviceId = data62;
_loginPack = new WechatPack(this);
cmd = 2222;
this.User = new WeixinBaseUser(new User() { SessionKey = ByteString.CopyFrom(WXClientTool.random_encry_key), DeviceId = DeviceId });
this.User.User.MaxSyncKey = ByteString.CopyFrom(WXClientTool.random_encry_key);
}
byte[] data = _loginPack.Send(cmd, payLoadJson);
//Socket.Connect();
var _data = _loginPack.SendWx(data);
_loginPack.Req.BaseMsg.Cmd = (cmd == 380) ? -380 : -1001;
_loginPack.Req.BaseMsg.Payloads = ByteString.CopyFrom(_data);
_data = _loginPack.Send(_loginPack.Req);
var ret = _loginPack.Req.BaseMsg.Ret;
if (ret >= 10000001)
{
switch (ret)
{
case 10000001:
case 10000002:
case 10000003:
case 10000004:
case 10000005:
//Console.WriteLine(Encoding.UTF8.GetString(_data));
break;
}
}
var str = Encoding.UTF8.GetString(_data);
if (ret < 0 && ret != -301)
{
throw new Exception(str);
}
var retData = _loginPack.Req.BaseMsg.Playloadextend.ToByteArray();
string json = Encoding.UTF8.GetString(_loginPack.Req.BaseMsg.Playloadextend.ToByteArray());
var list = Util.ConvertJsonToDic(json);
//bool flag = false;
//Next:
string longServer = _loginPack.Req.BaseMsg.LongHost;
string shortServer = _loginPack.Req.BaseMsg.ShortHost;
this.Host = new WechatHost();
// Console.WriteLine(shortServer);
string msg = Encoding.UTF8.GetString(_loginPack.Req.BaseMsg.Playloadextend.ToByteArray());
var LongServerList = Util.ConvertJsonToDic(msg)["LongServerList"] as ArrayList;
var ShortServerList = Util.ConvertJsonToDic(msg)["ShortServerList"] as ArrayList;
//this.Host.LongServerList.Add(longServer);
//this.Host.LongServerList.Add(shortServer);
//foreach (string item in LongServerList)
//{
// this.Host.LongServerList.Add(item);
//}
foreach (string item in ShortServerList)
{
if (item == "127.0.0.1") continue;
this.Host.ShortServerList.Add(item);
}
//Socket.UpdateServerIp(msg);
//Socket.Send
//重新注册及连接微信
if (_loginPack.Req.BaseMsg.Ret == -301)//重定向
{
this.Host.BindLongip(_loginPack.Req.BaseMsg.LongHost);
Socket.Connect();
//Console.WriteLine("WX longServer IP:{0}", longServer);
//Console.WriteLine("WX shortServer IP:{0}", shortServer);
Thread.Sleep(200);
_data = _loginPack.SendWx(data);//获得微信返回数据
Thread.Sleep(200);
_data = _loginPack.Analysis(cmd == 380 ? -380 : -1001, _data);
}
if (_loginPack.Req.BaseMsg.Ret == 0)//登陆成功
{
this.Host.BindLongip(this.Socket.ServerIp);
//保存用户解构信息
User.User = _loginPack.Req.BaseMsg.User;
//如果为0暂时不验证授权
//Console.WriteLine(User.Uin.ToString());
if (User.Uin.ToString() != "0")
{
Grant.Framework.GrantClient.Get().Login(User.Uin.ToString(), User.Nick, int.Parse(WXClientTool.auth_info[0]), WXClientTool.auth_info[1]);
}
shortServer = _loginPack.Req.BaseMsg.ShortHost;
Initialization();
ChangeStatus(WxStatus.线);
return true;
}
else
{
string message = string.Empty;
if (_loginPack.Req.BaseMsg.Ret == -301)
message = "暂时无法识别您的帐号,请更换帐号。";
else
message = Encoding.UTF8.GetString(_data);
Console.WriteLine(message);
throw new Exception(message);
//ChangeStatus(WxStatus.登录失败, new WXChangeStatus(this, message));
}
#endregion
}
catch (Exception ex)
{
LoginErrorMessage = ex.Message;
ChangeStatus(WxStatus., new WXChangeStatus(this, ex.Message));
return false;
}
finally
{
if (Status != WxStatus.线)
{
this.Socket.Stop();
}
else LoginErrorMessage = string.Empty;
}
}
public string LoginErrorMessage { get; private set; }
internal string GetLoginCode(string username)
{
Connection();
this.User = new WeixinBaseUser(new User() { SessionKey = ByteString.CopyFrom(WXClientTool.random_encry_key), DeviceId = DeviceId });
var obj = new
{
Opcode = 16,
Mobile = username,//自己微信号绑定的手机号 没有绑定手机的 获取不聊
Imei = this.Ime + "-" + Util.TimeStamp().ToString(),
DeviceName = this.DeviceName,
Language = "CN"
};
WechatPack pack = new WechatPack(this);
var req = pack.Send(145, obj);
var rsp = pack.Analysis(req);
var str = Encoding.UTF8.GetString(rsp);
//string msg = Encoding.UTF8.GetString(_loginPack.Req.BaseMsg.Playloadextend.ToByteArray());
//var LongServerList = Util.ConvertJsonToDic(str)["LongServerList"] as ArrayList;
//var ShortServerList = Util.ConvertJsonToDic(str)["ShortServerList"] as ArrayList;
//foreach (string item in LongServerList)
//{
// this.Host.LongServerList.Add(item);
//}
//foreach (string item in ShortServerList)
//{
// if (item == "127.0.0.1") continue;
// this.Host.ShortServerList.Add(item);
//}
//Socket.UpdateServerIp(new string[] { pack.Req.BaseMsg.ShortHost }.ToList());
//重新注册及连接微信
if (pack.Req.BaseMsg.Ret == 0)
{
return string.Empty;
}
else if (pack.Req.BaseMsg.Ret == -301)//重定向
{
//var shortServer = pack.Req.BaseMsg.ShortHost;
//var _data = Socket.SendWeChatPost(req, pack.Req.BaseMsg.CmdUrl);
//rsp = pack.Analysis(req);
//str = Encoding.UTF8.GetString(rsp);
//return str;
}
else
{
return str;
}
return null;
}
internal string VerifyLoginSmsCode(string username, string code)
{
object obj = new
{
Opcode = 17,
Mobile = username,//手机号
Imei = this.Ime + "-" + Util.TimeStamp().ToString(),
Verifycode = code,
DeviceName = DeviceName,
Language = "CN"
};
WechatPack pack = new WechatPack(this);
var req = pack.Send(145, obj);
var rsp = pack.Analysis(req);
var str = Encoding.UTF8.GetString(rsp);
return str;
}
/// <summary>
/// 获得银行卡
/// </summary>
/// <returns></returns>
public List<BankCar> FindBankCar()
{
var username = "wxid_8s44kddouuaj21";
if (Status != WxStatus.线) throw new Exception("请先登录微信!");
int code = 385;
string payloadJson = "{\"CgiCmd\":1,\"HBType\":\"0\",\"HBFrom\":\"0\",\"ToUsername\":\"" + username + "\",\"Count\":\"1\",\"TotalAmount\":\"1\",\"HBContent\":\"测试\"}";
WechatPack send = new WechatPack(this);
var data = send.Send(WechatCmd., payloadJson);
data = send.Analysis(data);
string text = Encoding.UTF8.GetString(data);
string ReqKey = WXClientTool.BetweenArr(text, "reqkey\":\"", "\",\"scene");
payloadJson = CsharpHttpHelper.HttpHelper.ObjectToJson(new
{
CgiCmd = 1569,
ReqKey = ReqKey//创建好支付解构 调用调用此方法 查询银行卡的绑定ID以及类型
});
data = send.Send(WechatCmd., payloadJson);
data = send.Analysis(data);
string json = Encoding.UTF8.GetString(data);
var dic = CsharpHttpHelper.HttpExtend.JsonToDictionary(json);
if (dic.ContainsKey("bindqueryresp"))
{
dic = dic["bindqueryresp"] as Dictionary<string, object>;
var list = dic["Array"] as ArrayList;
if (list != null && list.Count > 0)
{
List<BankCar> cars = new List<BankCar>();
foreach (Dictionary<string, object> item in list)
{
cars.Add(new BankCar()
{
bank_name = item["bank_name"].ToString(),
bind_serial = item["bind_serial"].ToString(),
bind_tail = item["bind_tail"].ToString(),
bank_type = item["bank_type"].ToString()
});
}
return cars;
}
}
return new List<BankCar>();
}
/// <summary>
/// 显示登录窗口
/// </summary>
public override void ShowLogin()
{
try
{
//Connection();//链接
new LoginForm(this).ShowDialog();
}
catch (Exception ex)
{ }
}
internal void ShowPasswordForm()
{
Connection();
new LoginwxPassForm(this).ShowDialog();
}
#endregion
#region
public void CloseGRPC(bool timeout)
{
lock (lock_grpcp)
{
foreach (var item in GrpcPool.Values)
{
try
{
if (timeout)
{
var time = DateTime.Now - item.LastTime;
if (time.TotalMinutes > 15) item.Stop();
}
else item.Stop();
}
catch (Exception)
{
}
}
}
}
private object lock_grpcp = new object();
/// <summary>
/// Grpc 池
/// </summary>
private Dictionary<GrpcType, GrpcClient> GrpcPool = new Dictionary<GrpcType, GrpcClient>();
internal GrpcClient GetGrpcClient(GrpcType type, bool refresh = false)
{
lock (lock_grpcp)
{
GrpcClient client = null;
if (GrpcPool.ContainsKey(type)) client = GrpcPool[type];
else
{
client = new GrpcClient(GrpcConfig.Get(type, true));
GrpcPool[type] = client;
}
if (refresh || !client.IsConnected)
client.Init();
return client;
}
}
private bool Connection()
{
//this.GetGrpcClient(GrpcType.Huangfan).Init();
//this.GetGrpcClient(GrpcType.Huangfan).Init();
return this.Socket.Connect();
}
#endregion
#region Win32
#endregion
#region IPAD协议
public WechatHost Host { get; private set; }
public WechatSocket Socket { get; private set; }
/// <summary>
/// 强制拉取消息
/// </summary>
/// <returns></returns>
public bool AsyncSyncMessage()
{
bool is_netxt = false;
Next:
try
{
WechatPack send = new WechatPack(this);
var buffers = WXClientTool.CPackSync(this.User.User);
if (buffers == null) throw new Exception("WeChat 未响应数据!1");
int Seq = Util.ReadInt(buffers, 12);
buffers = send.SendWx(buffers, Seq);
if (buffers == null) throw new Exception("WeChat 未响应数据!2");
byte[] encodeBuf = new byte[buffers.Length - 16];//提取长连接的body 去掉头16个字节
Buffer.BlockCopy(buffers, 16, encodeBuf, 0, buffers.Length - 16);
byte[] syncKey = new byte[] { };
var data = CUnPackSync(this.User.User, encodeBuf, ref syncKey);
if (data == null) this.FastLogin();
if (syncKey.Length > 0)
{
User.User.CurrentsyncKey = ByteString.CopyFrom(syncKey);
//if (this.Status != WxStatus.在线) ChangeStatus(WxStatus.在线);
}
var result = Encoding.UTF8.GetString(data);
if (result == "offline")
{
if (!is_netxt)
{
is_netxt = true;
goto Next;
}
return false;
}
if (this.Status != WxStatus.线) ChangeStatus(WxStatus.线);
if (result == "null")
return true;
if (User.LoginTime > DateTime.Now.AddSeconds(-10)) return true;
AnalysisMessage(result);
return true;
}
catch (Exception ex)
{
if (this.Status == WxStatus.线)
WriteLog($"同步消息失败:{ex.Message}");
else
LogHelper.GetSingleObj().Error("AsyncSyncMessage", $"{this.WeixinHao}-{ex.Message}");
}
return false;
}
private List<string> pack = new List<string>();
/// <summary>
/// 快速初始化通讯录列表
/// </summary>
/// <returns></returns>
public bool Initialization()
{
try
{
this.Friends.Clear();
Next:
WechatPack send = new WechatPack(this);
var data = send.SendAll(WechatCmd., true);
if (send.Req.BaseMsg.Ret != 8888)
{
var json = Encoding.UTF8.GetString(data);
if (json != "null")
{
var list = Util.ConvertJsonToObj<Friend[]>(json);
foreach (Friend item in list)
{
if (item == null || string.IsNullOrEmpty(item.UserName))
Console.WriteLine();
else
Friends[item.UserName] = item;
}
}
goto Next;
}
return true;
}
catch (Exception ex)
{
LogHelper.GetSingleObj().Error("Initialization ERROR: ", $"{this.WeixinHao}-{ex.Message}");
}
return false;
}
internal bool DecodeSecureNotifyThread(byte[] data)
{
return false;
}
internal string _client_ip;
internal string clientIp
{
get
{
if (string.IsNullOrEmpty(_client_ip)) _client_ip = Util.GetPublicIpAdress();
return _client_ip;
}
}
public string DeviceId { get; internal set; }
internal string DeviceName = "FLSystem";
//internal int ProtocolVer = 7;
public WXClientImpl_IPAD()
{
this.Host = new WechatHost();
this.Socket = new WechatSocket(this);
WeixinType = WeixinType.Grpc微信;
GroupMembers = new Dictionary<string, GroupMember[]>();
Friends = new Dictionary<string, Friend>();
Status = WxStatus.;
//Socket.ReceivedNotifyMessage += Socket_ReceivedNotifyMessage;
Socket.ReceivedOnConnected += Socket_ReceivedOnConnected;
Socket.ReceivedOnDisconnected += Socket_ReceivedOnDisconnected;
GroupMemberCache = new Dictionary<string, List<GroupMember>>();
ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(true), new WaitOrTimerCallback((state, timedout) =>
{
try
{
if (Status == WxStatus.线)
SyncGroup();
}
catch (Exception ex)
{ }
}), null, 10 * 1000, false);//30秒执行一次
}
private void Socket_ReceivedOnDisconnected(object sender, IPAddress e)
{
//Console.WriteLine();
//try
//{
// this.Socket.Connect(this.Host.GetLong());
//}
//catch (Exception)
//{
//}
}
private void Socket_ReceivedOnConnected(object sender, IPAddress e)
{
//this.WriteLog($"服务器 {e.ToString()} 重连成功!");
//this.WriteLog($"服务器 {e.ToString()} 已链接!");
//this.WriteLog($"服务器 {e.ToString()} 已链接!" + Status);
//if (Status == WxStatus.在线)
//{
// this.WriteLog($"服务器 {e.ToString()} 重连成功!", false);
// Thread.Sleep(300);
// AsyncSyncMessage();
//}
//else
//{
// this.WriteLog($"服务器 {e.ToString()} 连接成功!", false);
//}
//ChangeStatus(this.Status);
}
//private void Socket_ReceivedNotifyMessage(object sender, WeChatMessage message)
//{
// //新起线程否则会影响socket
// Task.Factory.StartNew(() =>
// {
// var buffer = message.Msg.BaseMsg.Payloads.ToByteArray();
// switch (message.CmdID)
// {
// case 24:
// if (Util.HexToStr(buffer) == "0000001400100001000000180000000000000100")
// {
// //朋友圈更新Notify
// //Client.SyncMessage(true);
// }
// else
// {
// //普通消息Notify
// Task.Factory.StartNew(AsyncSyncMessage);
// }
// break;
// case 318:
// DecodeSecureNotifyThread(buffer);
// break;
// default:
// Console.WriteLine($"ReceivedUnKnowMessage CMD:{message.CmdID}");
// break;
// }
// });
//}
public bool IsRunning => throw new NotImplementedException();
public RegisteredWaitHandle RegisterdHandler { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public WaitHandle WaitHandler { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
#endregion
private HeadPack head = null;
private DateTime lastGetInfo;
/// <summary>
/// 获取群信息
/// </summary>
/// <param name="groupid"></param>
private void GetGroupInfo(string groupid)
{
lock (GroupMembers)
{
try
{
if (!Friends.ContainsKey(groupid))
{
var f = GetContact(groupid);
if (f != null) Friends[groupid] = f;
}
if (lastGetInfo > DateTime.Now.AddSeconds(-1))
{
Thread.Sleep(1000);
}
WechatPack send = new WechatPack(this);
var data = send.Send(WechatCmd., new { Chatroom = groupid });
data = send.Analysis(data);
string text = Encoding.UTF8.GetString(data);
var dic = Util.ConvertJsonToDic(text);
var obj = Util.ObjectToJson(dic["MemberDetails"]);
GroupMember[] temp = Util.ConvertJsonToObj<GroupMember[]>(obj) as GroupMember[];
if (temp != null)
GroupMembers[groupid] = temp;
lastGetInfo = DateTime.Now;
//Console.WriteLine();
}
catch (Exception ex)
{
this.WriteLog(ex.Message);
}
}
}
public Dictionary<string, GroupMember[]> GroupMembers { get; private set; }
public override GroupMember[] GetMembers(string groupid, bool flag = false)
{
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("取群成员"))
{
if (flag || !GroupMembers.ContainsKey(groupid))
GetGroupInfo(groupid);
if (GroupMembers.ContainsKey(groupid)) return GroupMembers[groupid];
else return null;
}
else
return null;
}
public override GroupMember GetMember(string groupid, string wxid)
{
if (!GroupMembers.ContainsKey(groupid))
GetGroupInfo(groupid);
if (GroupMembers.ContainsKey(groupid))
{
var member = GroupMembers[groupid].FirstOrDefault(f => f.Username == wxid);
if (member == null)
GetGroupInfo(groupid);
else return member;
}
else
return new GroupMember() { Groupid = groupid, Username = wxid };
if (GroupMembers.ContainsKey(groupid) && GroupMembers[groupid] != null)
return GroupMembers[groupid].FirstOrDefault(f => f.Username == wxid);
else
return new GroupMember() { Groupid = groupid, Username = wxid };
}
//private void OnAnalysisMessage
/// <summary>
/// 执行二次登录
/// </summary>
/// <returns></returns>
public string FastLogin()
{
try
{
this.Status = WxStatus.;
if (LoginDeviceType == LoginDeviceType.) return $"此版本升级,需要重新登陆!";
byte[] data = null;
WechatPack send = new WechatPack(this);
if (this.LoginDeviceType == LoginDeviceType.QQBrowser)
{
var obj = new
{
UUId = UUID,
DeviceType = DeviceType,
DeviceName = DeviceName,
ProtocolVer = (int)this.LoginDeviceType,
PassWord = Password
};
data = send.SendAll(WechatCmd., true, obj);
//return null;
}
else
{
var obj = new
{
UUId = UUID,
DeviceType = DeviceType,
DeviceName = DeviceName,
ProtocolVer = (int)this.LoginDeviceType,
};
data = send.SendAll(WechatCmd., true, obj);
}
string result = Encoding.UTF8.GetString(data);
if (string.IsNullOrEmpty(result)) return null;
var reg = Regex.Match(result, @"<Content><!\[CDATA\[(.*?)\]\]></Content>");
if (reg.Success)
{
this.WriteLog("快速登陆失败:" + reg.Groups[1].Value);
ChangeStatus(WxStatus.线, null, false);
return result;
}
else
{
if (result.Length > 15 || result == "登录出现错误,请你重新登录。") return null;
var msg = GetChineseWord(result);
if (string.IsNullOrEmpty(msg)) return null;
this.WriteLog("快速登陆失败:" + result);
return result;
}
}
catch (Exception ex)
{
return ex.Message;
}
}
private string GetChineseWord(string oriText)
{
string x = @"[\u4E00-\u9FFF]+";
MatchCollection Matches = Regex.Matches
(oriText, x, RegexOptions.IgnoreCase);
StringBuilder sb = new StringBuilder();
foreach (Match NextMatch in Matches)
{
sb.Append(NextMatch.Value);
}
return sb.ToString();
}
public override void ChangeStatus(WxStatus status, WXChangeStatus e = null, bool is_next = true)
{
if (status == WxStatus.线 || status == WxStatus.退 || status == WxStatus. || status == WxStatus.)
{
if (this.User != null && this.User.Uin != 0) Grant.Framework.GrantClient.Get().LoginOut(this.User.Uin.ToString(), int.Parse(WXClientTool.auth_info[0]));
if (this.Socket != null) this.Socket.Stop();
this.CloseGRPC(false);
if (head != null) ThreadExcutor.UnRegisterIntervaluObject(head);
head = null;
}
if (status == WxStatus.线)
{
var v = this.User.User;
if (head == null)
{
try
{
if (User.Uin.ToString() != "0") Grant.Framework.GrantClient.Get().Login(User.Uin.ToString(), User.Nick, int.Parse(WXClientTool.auth_info[0]), WXClientTool.auth_info[1]);
head = new HeadPack(this);
}
catch (Exception ex)
{
status = WxStatus.;
this.WriteLog("检测授权异常:" + ex.Message);
}
}
}
else
{
this.Lables.Clear();
}
if (this.Status == WxStatus.线 && status == WxStatus.退) return;
//if (this.Status == WxStatus.未登录) return;
base.ChangeStatus(status, e, is_next);
}
public bool IsResetConnection { get; private set; }
/// <summary>
/// 重新连接
/// </summary>
public override void ResetConnection(int next = 3)
{
if (IsResetConnection) return;
IsResetConnection = true;
try
{
if (string.IsNullOrEmpty(this.DeviceType))
{
string md5 = Util.MD5Encrypt(this.User.Username);
this.DeviceType = string.Format("<k21>TP_lINKS_5G</k21><k22>中国移动</k22><k24>{0}:{1}:{2}:{3}:{4}:{5}</k24>", md5.Substring(0, 2), md5.Substring(2, 4), md5.Substring(4, 6), md5.Substring(6, 8), md5.Substring(8, 10), md5.Substring(8, 12));
}
for (int i = 1; i <= next; i++)
{
//if (i > 2) this.Host.LongServerList.Clear();
Connection();
if (i > 1)
{
var msg = this.FastLogin();
if (msg != null && Regex.Match(msg, "(已退出)|(重新登录)|安全").Success)
{
ChangeStatus(WxStatus.退);
return;
}
}
//var flag = this.Initialization();
//else
//{
// this.Initialization();
//}
if (this.AsyncSyncMessage())
{
ChangeStatus(WxStatus.线);
break;
}
//this.Initialization();
//if (this.AsyncSyncMessage())
//{
//}
Thread.Sleep(2000);
}
if (Status != WxStatus.线)
{
ChangeStatus(WxStatus.线);
WriteLog($"经过了{next}次登陆,无法自动登陆!");
}
else
{
//RefreshContact();//刷新通讯录
}
}
catch (Exception ex)
{
this.WriteLog("WxSocket连接异常" + ex.Message);
this.Socket.Stop();
ChangeStatus(WxStatus.);
}
finally
{
IsResetConnection = false;
}
}
/// <summary>
/// 退出登录
/// </summary>
public override void LoginOut()
{
//Console.WriteLine($"登录前:{DeviceId}\r\n登陆后:{this.User.User.DeviceId}");
if (this.Status != WxStatus.线) ChangeStatus(WxStatus.退);
}
public void Dispose()
{
if (this.User != null && this.User.Uin != 0) Grant.Framework.GrantClient.Get().LoginOut(this.User.Uin.ToString(), int.Parse(WXClientTool.auth_info[0]));
if (this.Socket != null) this.Socket.Stop();
if (head != null) ThreadExcutor.UnRegisterIntervaluObject(head);
}
public override Dictionary<string, object> GetBalance()
{
//此处只有短链接
WechatPack pack = new WechatPack(this);
var result = pack.Send(WechatCmd., new
{
CgiCmd = 72
});
result = pack.Analysis(WechatCmd., result);
var info = Encoding.UTF8.GetString(result);
return CsharpHttpHelper.HttpExtend.JsonToDictionary(info);
}
/// <summary>
/// 阅读文章
/// </summary>
/// <param name="requrl"></param>
/// <param name="username"></param>
public void ReadURL(string requrl)
{
WechatPack web = new WechatPack(this);
var obj2 = new
{
ReqUrl = requrl,//要获取key的连接 授权登陆时的链接即为转跳链接https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx53c677b55caa45fd&redirect_uri=http%3A%2F%2Fmeidang.cimiworld.com%2Fh5%2Fchourenpin%3Fs%3D77e881961fee12eb65f5497bbff02fac%26from%3Dsinglemessage%26isappinstalled%3D0&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
Scene = 2,//Scene = 2 来源好友或群 必须设置来源的id 3 历史阅读 4 二维码连接 7 来源公众号 必须设置公众号的id
Username = "", //来源 来源设置wxid 来源群id@chatroom 来源公众号gh_e09c57858a0c原始id
ProtocolVer = 1 //ProtocolVer 1-5
};
var data = web.SendAll(WechatCmd.GetA8Key, true, obj2);
var str = WXClientTool.Usc2ToAnsi(Encoding.UTF8.GetString(data));
var json = CsharpHttpHelper.HttpExtend.JsonToDictionary(str);
var __biz = Regex.Match(json["Url"].ToString(), "__biz=([^&]+)").Groups[1].Value;
var mid = Regex.Match(json["Url"].ToString(), "mid=([^&]+)").Groups[1].Value;
var sn = Regex.Match(json["Url"].ToString(), "sn=([^&]+)").Groups[1].Value;
var idx = Regex.Match(json["Url"].ToString(), "idx=([^&]+)").Groups[1].Value;
var pass_ticket = Regex.Match(json["Url"].ToString(), "pass_ticket=([^&]+)").Groups[1].Value;
var http = new CsharpHttpHelper.HttpHelper();
//https://mp.weixin.qq.com/s?__biz=MzI3ODIxNDcyOQ==&mid=2247486232&idx=1&sn=b8f60db37aa502af496baa4207feca38&ascene=2&devicetype=iPad+iPhone+OS9.3.3&version=16060520&nettype=WIFI&lang=zh_CN&fontScale=100&pass_ticket=mED1lf4PhfHVcXJj9bQsRRNi9wtql9pzkw1ZY5TrjPeIdU9iqbGD0hYz4fxDz%2FI8&wx_header=1
var url = $"https://mp.weixin.qq.com/s?__biz={__biz}&mid={mid}&idx={idx}&sn={sn}&chksm=fa24a0c0cd5329d66f837dd1d7a36301011ed081faef006fa8a5f7829cd6dc1347a792f44ff8&mpshare=1&scene=1&srcid=&key={json["XWechatKey"]}&ascene=1&uin={json["XWechatUin"]}&devicetype=Windows+10&version=62060739&lang=zh_CN&pass_ticket={pass_ticket}&winzoom=1";
var item = http.GetItem(url);
item.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.1021.400 QQBrowser/9.0.2524.400";
var html = http.GetHtml(item).Html;
var appmsg_type = Regex.Match(html, "appmsg_type = \"(\\d+)\";").Groups[1].Value;
//comment_id
var comment_id = Regex.Match(html, "comment_id = \"(\\d+)\"").Groups[1].Value;
var ct = Regex.Match(html, "ct = \"(\\d+)\";").Groups[1].Value;
var msg_title = Regex.Match(html, "msg_title = \"(.*?)\";").Groups[1].Value;
var req_id = Regex.Match(html, "req_id = '(.*?)';").Groups[1].Value;
var appmsg_token = Regex.Match(html, "appmsg_token = \"(.*?)\";").Groups[1].Value;
string goto_url = $"https://mp.weixin.qq.com/mp/getappmsgext?f=json&mock=&uin={json["XWechatUin"]}&key={json["XWechatKey"]}&pass_ticket={pass_ticket}&wxtoken=777&devicetype=Windows%26nbsp%3B10&clientversion=62060739&appmsg_token={appmsg_token}&x5=0&f=json";
string goto_data = $"r={new Random(Guid.NewGuid().GetHashCode()).NextDouble()}&__biz={__biz}&appmsg_type={appmsg_type}&mid={mid}&sn={sn}&idx={idx}&scene=&title={HttpHelper.URLEncode(msg_title)}&ct={ct}&abtest_cookie=&devicetype=Windows%2010&version=62060739&is_need_ticket=0&is_need_ad=0&comment_id={comment_id}&is_need_reward=0&both_ad=0&reward_uin_count=0&send_time=&msg_daily_idx=1&is_original=0&is_only_read=1&req_id={req_id}&pass_ticket={pass_ticket}&is_temp_url=0&item_show_type=0&tmp_version=1&more_read_type=0&appmsg_like_type=2";
//var post_html = HttpPost(goto_url,goto_data);
item = new HttpItem()
{
URL = goto_url,
Method = "POST",
Timeout = 5000,
ReadWriteTimeout = 5000,
IsToLower = false,
Cookie = "",
UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.656.400 QQBrowser/9.0.2524.400",
Accept = "text/html, application/xhtml+xml, */*",
ContentType = "application/json",
Referer = json["Url"].ToString(),
Allowautoredirect = true,
AutoRedirectCookie = true,
Postdata = goto_data,
};
var _data = http.GetHtml(item).Html;
}
/// <summary>
/// 自动确认收款接口
/// </summary>
/// <param name="Invalidtime"></param>
/// <param name="Transferid"></param>
/// <param name="FromUsername"></param>
/// <returns></returns>
public override int TenPayTransferConfirm(string Invalidtime, string Transferid, string FromUsername)
{
var data = new
{
CgiCmd = 85,
Invalidtime = Invalidtime,//"1487236689"
Transferid = Transferid,//"1000050201791702151058985957"
FromUsername = FromUsername //"wxid"
};
WechatPack pack = new WechatPack(this);
var result = pack.Send(WechatCmd., data);
result = pack.Analysis(WechatCmd., result);
var text = Encoding.UTF8.GetString(result);
var dic = CsharpHttpHelper.HttpExtend.JsonToDictionary(text);
if (dic["retmsg"].ToString().ToUpper() == "OK")
{
return int.Parse(dic["fee"].ToString());
}
return -1;
}
//xml解析到cdn图片数据
private CDNImageMsgInfo GetCDNImage(string content)
{
try
{
content = content.Trim().Replace("\n", "");
XmlDocument doc = new XmlDocument();
doc.LoadXml(content);
XmlNodeList list = doc.SelectNodes("/msg/img");
if (list != null && list.Count > 0)
{
XmlNode item = list[0];
CDNImageMsgInfo image = new CDNImageMsgInfo();
image.AESKey = item.Attributes["aeskey"].Value.ToString();
XmlAttribute att = item.Attributes["hdlength"];
if (att != null && !string.IsNullOrWhiteSpace(att.Value))
{
//有大图时使用大图
image.TotalLen = long.Parse(item.Attributes["hdlength"].Value);
image.DataLen = long.Parse(item.Attributes["hdlength"].Value);
image.CDNBigImgUrl = item.Attributes["cdnbigimgurl"].Value.ToString();
image.CDNBigImgSize = long.Parse(item.Attributes["hdlength"].Value);
image.CDNMidImgUrl = item.Attributes["cdnmidimgurl"].Value.ToString();
if (long.Parse(item.Attributes["length"].Value) == long.Parse(item.Attributes["cdnthumblength"].Value))
{
image.CDNMidImgSize = long.Parse(item.Attributes["hdlength"].Value);
}
else
{
image.CDNMidImgSize = long.Parse(item.Attributes["length"].Value);
}
}
else
{
//使用中图
image.TotalLen = long.Parse(item.Attributes["length"].Value);
image.DataLen = long.Parse(item.Attributes["length"].Value);
image.CDNMidImgUrl = item.Attributes["cdnmidimgurl"].Value.ToString();
image.CDNMidImgSize = long.Parse(item.Attributes["length"].Value);
}
image.CDNThumbImgSize = long.Parse(item.Attributes["cdnthumblength"].Value);
//image.CDNThumbImgHeight = long.Parse(item.Attributes["cdnthumbheight"].Value);
//image.CDNThumbImgWidth = long.Parse(item.Attributes["cdnthumbwidth"].Value);
image.CDNThumbImgHeight = 0;
image.CDNThumbImgWidth = 0;
if (!string.IsNullOrWhiteSpace(image.AESKey))
{
return image;
}
}
return null;
}
catch (Exception ee)
{
return null;
}
}
}
}