743 lines
34 KiB
C#
743 lines
34 KiB
C#
|
using CsharpHttpHelper;
|
|||
|
using Newtonsoft.Json;
|
|||
|
using NM_WeChat;
|
|||
|
using PCRobot.Entitys;
|
|||
|
using PCRobot.Pack;
|
|||
|
using PCRobot.Properties;
|
|||
|
using PCRobot.Utils;
|
|||
|
using System;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Concurrent;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Diagnostics;
|
|||
|
using System.Drawing;
|
|||
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
using System.Security.Cryptography;
|
|||
|
using System.Text;
|
|||
|
using System.Text.RegularExpressions;
|
|||
|
using System.Threading;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using System.Web;
|
|||
|
using System.Web.Caching;
|
|||
|
using System.Windows.Forms;
|
|||
|
|
|||
|
namespace PCRobot.PCWechat
|
|||
|
{
|
|||
|
|
|||
|
/*
|
|||
|
接口文档:https://www.showdoc.cc/WxWorkNewHook?page_id=3846144660177490
|
|||
|
/////密码:784615627.
|
|||
|
*/
|
|||
|
|
|||
|
public partial class Wechat_Xiaoxie_QY
|
|||
|
{
|
|||
|
|
|||
|
public override void AgreeAddMe(string text)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if (string.IsNullOrWhiteSpace(text)) return;
|
|||
|
|
|||
|
var reg = Regex.Match(text, @"{""user_id"":""(?<user_id>[^""]+?)"",""corp_id"":""(?<corp_id>[^""]+?)""}");
|
|||
|
if (reg.Success)
|
|||
|
{
|
|||
|
var user_id = reg.Groups["user_id"].Value;
|
|||
|
var corp_id = reg.Groups["corp_id"].Value;
|
|||
|
var __json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_ACCEPT_FRIEND_REQUEST, data = new { user_id = user_id, corp_id = corp_id } });
|
|||
|
SendWxWorkData(User.DwClientId, __json);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "-._");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void DeleteFriend(string wxid)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "._");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public override void EditCotacts(string wxid, string remark)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_MODIFY_USER_REMARK_MSG, data = new { user_id = wxid, remark = remark } });
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "*_");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 创建群
|
|||
|
/// </summary>
|
|||
|
/// <param name="wxidData"></param>
|
|||
|
public override void CreateRoom(string wxidData)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if (string.IsNullOrWhiteSpace(wxidData)) return;
|
|||
|
var wxids = wxidData.Trim().Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|||
|
if (wxids != null && wxids.Length != 0)
|
|||
|
{
|
|||
|
var json = HttpHelper.ObjectToJson(new { type = MsgType.MT_CREATE_ROOM_MSG, data = wxids });
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 邀请用户进群
|
|||
|
/// </summary>
|
|||
|
/// <param name="conversation_id"></param>
|
|||
|
/// <param name="wxid"></param>
|
|||
|
public override void InviteMemberToRoom_40Up(string conversation_id, string wxidData)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if (conversation_id.Trim().StartsWith("R:"))
|
|||
|
{
|
|||
|
var wxids = wxidData.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
|
|||
|
var json = HttpHelper.ObjectToJson(new { type = MsgType.MT_ROOM_ADD_MEMBERS_MSG, data = new { conversation_id = conversation_id, user_list = wxids } });
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + ".._.");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public override void InviteMemberToRoom_40Down(string groupid, string wxidData)
|
|||
|
{
|
|||
|
InviteMemberToRoom_40Up(groupid, wxidData);
|
|||
|
}
|
|||
|
|
|||
|
public override void DeleteRoomMember(string wxid, string room)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if (room.Trim().StartsWith("R:"))
|
|||
|
{
|
|||
|
var json = HttpHelper.ObjectToJson(new { type = MsgType.MT_ROOM_DEL_MEMBERS_MSG, data = new { conversation_id = room, user_list = new string[] { wxid } } });
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void GetContact()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_EXTERNAL_USERS_MSG, data = new { } });
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
|
|||
|
Thread.Sleep(1000);
|
|||
|
|
|||
|
json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_ROOMS_MSG, data = new { } });
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "_*");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void GetContact(bool isUpdate)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var result = GetFriendInfos(true);
|
|||
|
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
CommonResult msg = new CommonResult();
|
|||
|
msg.RobotUsername = User.Wxid;
|
|||
|
msg.RobotUsernick = User.Nickname;
|
|||
|
msg.RobotType = RobotType.客户端微信;
|
|||
|
msg.MsgId = ServerMsgID;
|
|||
|
msg.Cmd = PCRobotCMD.rcvFriendList_workWeChat;
|
|||
|
msg.Data = result == null ? string.Empty : HttpHelper.ObjectToJson(result);
|
|||
|
|
|||
|
socketClient.Send(msg);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 获取好友列表
|
|||
|
/// </summary>
|
|||
|
/// <param name="flushGroupsCache">刷新缓存数据</param>
|
|||
|
/// <returns></returns>
|
|||
|
//public override List<WorkFriendInfo> GetFriendInfos(bool flushGroupsCache = false)
|
|||
|
public override string GetFriendInfos(bool flushGroupsCache = false)
|
|||
|
{
|
|||
|
List<WorkFriendInfo> friends = null;
|
|||
|
try
|
|||
|
{
|
|||
|
#region 获取缓存数据
|
|||
|
friends = User.WorkFriends.Where(f => !f.user_id.Contains("R:")).ToList();
|
|||
|
if (!flushGroupsCache && friends.Count != 0)
|
|||
|
return JsonConvert.SerializeObject(friends);
|
|||
|
#endregion
|
|||
|
|
|||
|
if (!User.IsGetFriend)
|
|||
|
{
|
|||
|
//获取好友列表(数据库读取)
|
|||
|
var json = HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_EXTERNAL_USERS_MSG, data = new { } });
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
User.IsGetFriend = true;
|
|||
|
}
|
|||
|
|
|||
|
var result_ = Task.Factory.StartNew<List<WorkFriendInfo>>(delegate ()
|
|||
|
{
|
|||
|
DateTime end_time = DateTime.Now.AddSeconds(20);
|
|||
|
do
|
|||
|
{
|
|||
|
if (!User.IsGetFriend)
|
|||
|
{
|
|||
|
friends = User.WorkFriends.Where(f => !f.user_id.Contains("R:")).ToList();
|
|||
|
return friends;
|
|||
|
}
|
|||
|
Thread.Sleep(200);
|
|||
|
} while (end_time > DateTime.Now);
|
|||
|
return null;
|
|||
|
}).Result;
|
|||
|
//return friends;
|
|||
|
return JsonConvert.SerializeObject(friends);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "#__#");
|
|||
|
}
|
|||
|
return string.Empty;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public override void GetGroupAndFriendInfo(string groupId, string wxid)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var json = string.Empty;
|
|||
|
WorkGroupInfo group = null;
|
|||
|
if (groupId.Contains("R:"))
|
|||
|
{
|
|||
|
json = HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_ROOM_MEMBERS_MSG, data = new { conversation_id = groupId } });
|
|||
|
|
|||
|
var g = User.WorkGroups.FirstOrDefault(f => f.conversation_id == groupId);
|
|||
|
//User.WorkGroups.Clear();
|
|||
|
if (g != null)
|
|||
|
{
|
|||
|
var u = g.friends.FirstOrDefault(f => f.user_id == wxid);
|
|||
|
if (u != null)
|
|||
|
group = new WorkGroupInfo() { conversation_id = groupId, friends = new List<WorkFriendInfo>() { u }, total = g.total };
|
|||
|
}
|
|||
|
|
|||
|
if (group == null)
|
|||
|
{
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
var _group = Task.Factory.StartNew<WorkGroupInfo>(delegate ()
|
|||
|
{
|
|||
|
DateTime end_time = DateTime.Now.AddSeconds(15);
|
|||
|
do
|
|||
|
{
|
|||
|
g = User.WorkGroups.FirstOrDefault(f => f.conversation_id == groupId);
|
|||
|
if (g != null)
|
|||
|
{
|
|||
|
var u = g.friends.FirstOrDefault(f => f.user_id == wxid);
|
|||
|
if (u != null)
|
|||
|
{
|
|||
|
group = new WorkGroupInfo() { conversation_id = groupId, friends = new List<WorkFriendInfo>() { u }, total = g.total };
|
|||
|
return group;
|
|||
|
}
|
|||
|
}
|
|||
|
Thread.Sleep(200);
|
|||
|
} while (end_time > DateTime.Now);
|
|||
|
return null;
|
|||
|
}).Result;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
var msg = new WorkWechatContact();
|
|||
|
msg.RobotUsername = User.Wxid;
|
|||
|
msg.RobotUsernick = User.Nickname;
|
|||
|
msg.RobotType = RobotType.客户端企业微信;//客户端微信;
|
|||
|
msg.MsgId = ServerMsgID;
|
|||
|
msg.Cmd = PCRobotCMD.rcvContact_workWeChat;
|
|||
|
msg.Message = group == null ? string.Empty : HttpHelper.ObjectToJson(group);
|
|||
|
|
|||
|
socketClient.Send(msg);
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "/_");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void GetGroupAndFriendInfo(string groupId, string wxid, bool flush = false)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var json = string.Empty;
|
|||
|
WorkGroupInfo group = null;
|
|||
|
if (groupId.Contains("R:"))
|
|||
|
{
|
|||
|
json = HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_ROOM_MEMBERS_MSG, data = new { conversation_id = groupId } });
|
|||
|
|
|||
|
var g = User.WorkGroups.FirstOrDefault(f => f.conversation_id == groupId);
|
|||
|
//User.WorkGroups.Clear();
|
|||
|
if (g != null)
|
|||
|
{
|
|||
|
if (flush)
|
|||
|
{
|
|||
|
g.friends.Clear();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
var u = g.friends.FirstOrDefault(f => f.user_id == wxid);
|
|||
|
if (u != null)
|
|||
|
group = new WorkGroupInfo() { conversation_id = groupId, friends = new List<WorkFriendInfo>() { u }, total = g.total };
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (group == null)
|
|||
|
{
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
var _group = Task.Factory.StartNew<WorkGroupInfo>(delegate ()
|
|||
|
{
|
|||
|
DateTime end_time = DateTime.Now.AddSeconds(15);
|
|||
|
do
|
|||
|
{
|
|||
|
g = User.WorkGroups.FirstOrDefault(f => f.conversation_id == groupId);
|
|||
|
if (g != null)
|
|||
|
{
|
|||
|
var u = g.friends.FirstOrDefault(f => f.user_id == wxid);
|
|||
|
if (u != null)
|
|||
|
{
|
|||
|
group = new WorkGroupInfo() { conversation_id = groupId, friends = new List<WorkFriendInfo>() { u }, total = g.total };
|
|||
|
return group;
|
|||
|
}
|
|||
|
}
|
|||
|
Thread.Sleep(200);
|
|||
|
} while (end_time > DateTime.Now);
|
|||
|
return null;
|
|||
|
}).Result;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
var msg = new WorkWechatContact();
|
|||
|
msg.RobotUsername = User.Wxid;
|
|||
|
msg.RobotUsernick = User.Nickname;
|
|||
|
msg.RobotType = RobotType.客户端企业微信;//客户端微信;
|
|||
|
msg.MsgId = ServerMsgID;
|
|||
|
msg.Cmd = PCRobotCMD.rcvContact_workWeChat;
|
|||
|
msg.Message = group == null ? string.Empty : HttpHelper.ObjectToJson(group);
|
|||
|
|
|||
|
socketClient.Send(msg);
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "/_");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public override void GetWxidInfo(string wxid)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var json = string.Empty;
|
|||
|
|
|||
|
var u = User.WorkFriends.FirstOrDefault(f => f.user_id == wxid);
|
|||
|
if (u == null)
|
|||
|
{
|
|||
|
if (wxid.Contains("R:"))
|
|||
|
{
|
|||
|
json = HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_ROOMS_MSG, data = new { } });
|
|||
|
}
|
|||
|
else
|
|||
|
json = HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_USER_DETAIL_MSG, data = new { user_id = wxid } });
|
|||
|
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
var friend = Task.Factory.StartNew<WorkFriendInfo>(delegate ()
|
|||
|
{
|
|||
|
DateTime end_time = DateTime.Now.AddSeconds(15);
|
|||
|
do
|
|||
|
{
|
|||
|
u = User.WorkFriends.FirstOrDefault(f => f.user_id == wxid);
|
|||
|
if (u != null) return u;
|
|||
|
Thread.Sleep(200);
|
|||
|
} while (end_time > DateTime.Now);
|
|||
|
return null;
|
|||
|
}).Result;
|
|||
|
}
|
|||
|
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
var msg = new WorkWechatContact();
|
|||
|
msg.RobotUsername = User.Wxid;
|
|||
|
msg.RobotUsernick = User.Nickname;
|
|||
|
msg.RobotType = RobotType.客户端企业微信;//客户端微信;
|
|||
|
msg.MsgId = ServerMsgID;
|
|||
|
msg.Cmd = PCRobotCMD.rcvContact_workWeChat;
|
|||
|
msg.Message = u == null ? string.Empty : HttpHelper.ObjectToJson(u);
|
|||
|
|
|||
|
socketClient.Send(msg);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "_/");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void SendImage(string wxid, string file)
|
|||
|
{
|
|||
|
//try
|
|||
|
//{
|
|||
|
// var conversation_id = wxid;
|
|||
|
// if (!wxid.StartsWith("R:"))
|
|||
|
// {
|
|||
|
// conversation_id = $"S:{User.Wxid}_{wxid}";
|
|||
|
// }
|
|||
|
// var json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_IMAGE_MSG, data = new { conversation_id = conversation_id, file = file } });
|
|||
|
// SendWxWorkData(User.DwClientId, json);
|
|||
|
//}
|
|||
|
//catch (Exception ex)
|
|||
|
//{
|
|||
|
// LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message + ".-");
|
|||
|
//}
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
var conversation_id = wxid;
|
|||
|
if (!wxid.StartsWith("R:"))
|
|||
|
conversation_id = $"S:{User.Wxid}_{wxid}";
|
|||
|
|
|||
|
if (file.StartsWith("http", StringComparison.InvariantCultureIgnoreCase))
|
|||
|
{
|
|||
|
byte[] ImangByte = null;
|
|||
|
string extension = Path.GetExtension(file);
|
|||
|
extension = string.IsNullOrWhiteSpace(extension) ? ".jpg" : extension;
|
|||
|
ImangByte = new System.Net.WebClient().DownloadData(file);
|
|||
|
byte[] imageHash = new MD5CryptoServiceProvider().ComputeHash(ImangByte);
|
|||
|
|
|||
|
var path = Common.CacheFilePath(User.Wxid, conversation_id, "IMAGE", Guid.NewGuid().ToString("N"), extension);
|
|||
|
if (!File.Exists(path))
|
|||
|
{
|
|||
|
File.WriteAllBytes(path, ImangByte);
|
|||
|
}
|
|||
|
if (File.Exists(path))
|
|||
|
file = path;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!File.Exists(file))
|
|||
|
{
|
|||
|
if (Common.IsBase64(file))
|
|||
|
{
|
|||
|
var path = Common.CacheFilePath(User.Wxid, wxid, "IMAGE", Guid.NewGuid().ToString("N"), "jpg");
|
|||
|
if (Common.Base64ToFileAndSave(file, path) && File.Exists(path))
|
|||
|
{
|
|||
|
file = path;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{ }
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var json = string.Empty;
|
|||
|
if (File.Exists(file))
|
|||
|
{
|
|||
|
if (file.Trim().EndsWith(".gif", StringComparison.CurrentCultureIgnoreCase))
|
|||
|
json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_GIF_MSG, data = new { conversation_id = conversation_id, file = file } });
|
|||
|
else
|
|||
|
json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_IMAGE_MSG, data = new { conversation_id = conversation_id, file = file } });
|
|||
|
}
|
|||
|
else
|
|||
|
json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_IMAGE_MSG, data = new { conversation_id = conversation_id, file = file } });
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Debug("发送图片异常", ex.Message + ".-" + ex.StackTrace);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void SendMessage(string wxid, string message)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
//S:1688853956558440_7881301364988874
|
|||
|
//{"data":{"content":"我们","content_type":2,"conversation_id":"S:1688853956558440_7881301364988874","local_id":"61","receiver":"1688853956558440","send_time":"1584028171","sender":"7881301364988874","sender_name":"18","server_id":"1000653"},"type":11041}
|
|||
|
|
|||
|
var conversation_id = wxid;
|
|||
|
if (!wxid.StartsWith("R:"))
|
|||
|
{
|
|||
|
conversation_id = $"S:{User.Wxid}_{wxid}";
|
|||
|
}
|
|||
|
else
|
|||
|
{ }
|
|||
|
|
|||
|
var json = string.Empty;
|
|||
|
message = message.Replace("\r\n", "\n");
|
|||
|
if (Common.isXML(message))
|
|||
|
{
|
|||
|
message = message.Replace("&", "&");
|
|||
|
var title = string.Empty;
|
|||
|
var desc = string.Empty;
|
|||
|
var url = string.Empty;
|
|||
|
var image_url = string.Empty;
|
|||
|
var reg = Regex.Match(message, @"<title>(?<标题>[\w\W]+?)</title>");
|
|||
|
if (reg.Success) title = reg.Groups["标题"].Value;
|
|||
|
reg = Regex.Match(message, @"<des>(?<介绍>[\w\W]+?)</des>");
|
|||
|
if (reg.Success) desc = reg.Groups["介绍"].Value.Replace("<![CDATA[", "").Replace("]]", "");
|
|||
|
reg = Regex.Match(message, @"<url>(?<链接>[\w\W]+?)</url>");
|
|||
|
if (!reg.Success) reg = Regex.Match(message, @"<pagepath>(?<链接>[\w\W]+?)</pagepath>");
|
|||
|
if (reg.Success) url = reg.Groups["链接"].Value;
|
|||
|
reg = Regex.Match(message, @"<thumburl>(?<图片链接>[\w\W]+?)</thumburl>");
|
|||
|
if (reg.Success) image_url = reg.Groups["图片链接"].Value;
|
|||
|
if (message.Contains("<image_key1>"))
|
|||
|
{
|
|||
|
var image_key1 = string.Empty;
|
|||
|
var image_key2 = string.Empty;
|
|||
|
var image_key3 = string.Empty;
|
|||
|
var image_size = 0;
|
|||
|
var ghid = string.Empty;
|
|||
|
var pagepath = string.Empty;
|
|||
|
var regKey = Regex.Match(message, @"<image_key1>(?<image_key1>[\w\W]+?)</image_key1>", RegexOptions.IgnoreCase);
|
|||
|
if (regKey.Success)
|
|||
|
image_key1 = regKey.Groups["image_key1"].Value;
|
|||
|
regKey = Regex.Match(message, @"<image_key2>(?<image_key2>[\w\W]+?)</image_key2>", RegexOptions.IgnoreCase);
|
|||
|
if (regKey.Success)
|
|||
|
image_key2 = regKey.Groups["image_key2"].Value;
|
|||
|
regKey = Regex.Match(message, @"<image_key3>(?<image_key3>[\w\W]+?)</image_key3>", RegexOptions.IgnoreCase);
|
|||
|
if (regKey.Success)
|
|||
|
image_key3 = regKey.Groups["image_key3"].Value;
|
|||
|
regKey = Regex.Match(message, @"<image_size>(?<image_size>[\w\W]+?)</image_size>", RegexOptions.IgnoreCase);
|
|||
|
if (regKey.Success)
|
|||
|
image_size = int.Parse(regKey.Groups["image_size"].Value.XMLReplace(false));
|
|||
|
|
|||
|
regKey = Regex.Match(message, @"<username>(?<username>[\w\W]+?)</username>", RegexOptions.IgnoreCase);
|
|||
|
if (regKey.Success)
|
|||
|
ghid = regKey.Groups["username"].Value;
|
|||
|
|
|||
|
regKey = Regex.Match(message, @"<pagepath>(?<pagepath>[\w\W]+?)</pagepath>", RegexOptions.IgnoreCase);
|
|||
|
if (regKey.Success)
|
|||
|
pagepath = regKey.Groups["pagepath"].Value;
|
|||
|
|
|||
|
var weapppagethumbrawurl = string.Empty;
|
|||
|
regKey = Regex.Match(message, @"<weapppagethumbrawurl>(?<weapppagethumbrawurl>[\w\W]+?)</weapppagethumbrawurl>", RegexOptions.IgnoreCase);
|
|||
|
if (regKey.Success)
|
|||
|
weapppagethumbrawurl = regKey.Groups["weapppagethumbrawurl"].Value;
|
|||
|
|
|||
|
var _json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_MINI_PROGRAM_MSG, data = new { conversation_id = conversation_id, ghid = ghid.XMLReplace(false), wxid = conversation_id, name = title, title = desc, enterpoint = pagepath.XMLReplace(false), headimg = weapppagethumbrawurl.XMLReplace(false), image_key1 = image_key1.XMLReplace(false), image_key2 = image_key2.XMLReplace(false), image_key3 = image_key3.XMLReplace(false), image_size = image_size } });
|
|||
|
|
|||
|
SendWxWorkData(User.DwClientId, _json);
|
|||
|
return;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
image_url =
|
|||
|
json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_LINK_MSG, data = new { conversation_id = conversation_id, title = $"{title.XMLReplace(false)}", desc = $"{desc.XMLReplace(false)}", url = url.XMLReplace(false), image_url = image_url.XMLReplace(false) } });
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
var atUsername = new List<string>();
|
|||
|
var regs = Regex.Matches(message, @"\[@([^\]]+?)\]");
|
|||
|
if (regs.Count != 0 && wxid.StartsWith("R:"))
|
|||
|
{
|
|||
|
foreach (Match item in regs)
|
|||
|
{
|
|||
|
atUsername.Add(item.Groups[1].Value.Trim());
|
|||
|
}
|
|||
|
message = Regex.Replace(message, @"(\[@[^\]]+?\])", "{$@}");
|
|||
|
json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_ROOM_AT_MSG, data = new { conversation_id = conversation_id, content = message, at_list = atUsername.ToArray() } });
|
|||
|
}
|
|||
|
else
|
|||
|
json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_TEXT_MSG, data = new { conversation_id = conversation_id, content = message } });
|
|||
|
}
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
|
|||
|
//LogHelper.GetSingleObj().Debug("发送状态", ($"发送:{conversation_id} - {flag}, 内容:{message}"));
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "-.");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 发送小程序
|
|||
|
/// </summary>
|
|||
|
/// <param name="wxid">发送给谁</param>
|
|||
|
/// <param name="dataJson">发送的内容json打包</param>
|
|||
|
public override void SendProgramMessage(string wxid, string dataJson)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
/*
|
|||
|
"conversation_id": "S:16888xxxx_7881xxxxx",
|
|||
|
"ghid": "gh_52b46203a658@app",
|
|||
|
"wxid": "wx35f2a3937c9df889",
|
|||
|
"name": "博鸟绘本",
|
|||
|
"title": "博鸟绘本,最新最全的儿童绘本租赁平台~",
|
|||
|
"enterpoint": "pages/shouye/shouye.html",
|
|||
|
"headimg": "http://wx.qlogo.cn/mmhead/xxxx/96",
|
|||
|
"image_key1": "306b020102046430620201000xxxxx",
|
|||
|
"image_key2": "61706264616C7A77666875xxxx",
|
|||
|
"image_key3": "b302e94d9c6f95xxxxxx",
|
|||
|
"image_size": 56448
|
|||
|
*/
|
|||
|
|
|||
|
//个人微信/企业微信
|
|||
|
//{"data":{"content_type":78,"conversation_id":"R:10696053211018728","enterpoint":"pages/tab/home/index.html?_um_ssrc=oucfI5QRI-8SbyOTKSGYt5-ia0dk&_um_sts=1610033684099","ghid":"gh_a0d7a7672cf7@app","headimg":"http://wx.qlogo.cn/mmhead/Q3auHgzwzM43LsxpXHKd7ua7kwMZQ8WHmZlkYTzr3Tdm8sMOJ7Ypog/96","image_key1":"306b020102046430620201000204bafc490e02030f4df9020473e6607102045ff72a530436333133373039353935305f313734393433343231315f3262393764653133616335373232353633383831336564376334396563616164020100020300ab1004000201010201000400","image_key2":"61747072666A766977766D69726D6168","image_key3":"2b97de13ac57225638813ed7c49ecaad","image_size":43791,"is_pc":0,"local_id":"155","name":"啄木鸟家庭维修","receiver":"1688853956558440","send_time":"1610033747","sender":"7881302484994318","sender_name":"、","server_id":"1042188","title":"直营一口价,维修无猫腻","wxid":"wx3d6b1af0cb07fa5a"},"type":11066}
|
|||
|
|
|||
|
var conversation_id = wxid;
|
|||
|
if (!wxid.StartsWith("R:"))
|
|||
|
conversation_id = $"S:{User.Wxid}_{wxid}";
|
|||
|
|
|||
|
var json = CsharpHttpHelper.HttpExtend.JsonToDictionary(dataJson);
|
|||
|
var data = json.ContainsKey("data") ? json["data"] as Dictionary<string, object> : null;
|
|||
|
if (data == null) return;
|
|||
|
|
|||
|
//var content_type = data["content_type"]?.ToString();//内容类型 78
|
|||
|
//var conversation_id = data["conversation_id"]?.ToString();//接收者的的会话ID
|
|||
|
//var receiver = data["receiver"]?.ToString();//接收者的user_id
|
|||
|
//var sender = data["sender"]?.ToString();//发送者的user_id
|
|||
|
//var sender_name = data["sender_name"]?.ToString();//发送者昵称
|
|||
|
//var server_id = data["server_id"]?.ToString();//消息的服务器ID
|
|||
|
var enterpoint = data["enterpoint"]?.ToString();//入口点 - 链接(小程序里面的链接)
|
|||
|
var headimg = data["headimg"]?.ToString();//小程序的头像
|
|||
|
var name = data["name"]?.ToString();//小程序的名称
|
|||
|
var title = data["title"]?.ToString();//小程序标题
|
|||
|
var _wxid = data["wxid"]?.ToString();
|
|||
|
var image_size = int.Parse(data["image_size"].ToString());
|
|||
|
var image_key1 = data["image_key1"]?.ToString();
|
|||
|
var image_key2 = data["image_key2"]?.ToString();
|
|||
|
var image_key3 = data["image_key3"]?.ToString();
|
|||
|
var ghid = data["ghid"]?.ToString();
|
|||
|
|
|||
|
var _json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_MINI_PROGRAM_MSG, data = new { conversation_id = conversation_id, ghid = ghid, wxid = _wxid, name = name, title = title, enterpoint = enterpoint, headimg = headimg, image_key1 = image_key1, image_key2 = image_key2, image_key3 = image_key3, image_size = image_size } });
|
|||
|
|
|||
|
SendWxWorkData(User.DwClientId, _json);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error("发送小程序异常", ex.Message + ex.StackTrace);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void SendVideo(string wxid, string file)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var conversation_id = wxid;
|
|||
|
if (!wxid.StartsWith("R:"))
|
|||
|
{
|
|||
|
conversation_id = $"S:{User.Wxid}_{wxid}";
|
|||
|
}
|
|||
|
var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_VIDEO_MSG, data = new { conversation_id = conversation_id, file = file } });
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "-_");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void SendFile(string wxid, string file)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var conversation_id = wxid;
|
|||
|
if (!wxid.StartsWith("R:"))
|
|||
|
{
|
|||
|
conversation_id = $"S:{User.Wxid}_{wxid}";
|
|||
|
}
|
|||
|
var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_FILE_MSG, data = new { conversation_id = conversation_id, file = file } });
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "_-");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void SendCard(string to_wxid, string card_wxid)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var conversation_id = to_wxid;
|
|||
|
if (!to_wxid.StartsWith("R:"))
|
|||
|
{
|
|||
|
conversation_id = $"S:{User.Wxid}_{to_wxid}";
|
|||
|
}
|
|||
|
|
|||
|
if (card_wxid.StartsWith("R:"))
|
|||
|
{
|
|||
|
InviteMemberToRoom_40Up(card_wxid, to_wxid);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_PERSON_CARD_MSG, data = new { conversation_id = conversation_id, user_id = card_wxid } });
|
|||
|
SendWxWorkData(User.DwClientId, json);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "--");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void CloseWechat(string message)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var v = WechatClient.Users.FirstOrDefault(f => f.Value.DwClientId == User.DwClientId && f.Value.Type == WechatType.Xiaoxie_QY).Value;
|
|||
|
if (v != null)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Info("系统", $"CloseWechatQY事件退出,Uin:{v.Uin},微信:{v.Nickname}({v.Wxid})");
|
|||
|
WechatClient.RemoveUser(v, true);
|
|||
|
if (!string.IsNullOrWhiteSpace(message))
|
|||
|
PCRobotForm.ErrorMessAction?.Invoke(message);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "//");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|