2456 lines
136 KiB
C#
2456 lines
136 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 class Wechat_Xiaoxie_QY : BaseApi
|
|||
|
{
|
|||
|
#region 注入等操作
|
|||
|
public delegate void AcceptCallbackFunc(uint dwClientId);
|
|||
|
public delegate void RecvCallbackFunc(uint dwClientId, IntPtr intPtr, uint dwSize);
|
|||
|
public delegate void CloseCallbackFunc(uint dwClientId);
|
|||
|
|
|||
|
private static AcceptCallbackFunc m_AcceptCallbackFunc;
|
|||
|
private static RecvCallbackFunc m_RecvCallbackFunc;
|
|||
|
private static CloseCallbackFunc m_CloseCallbackFunc;
|
|||
|
|
|||
|
// 引入DLL导出函数
|
|||
|
//[DllImport("Bin\\WeChatServer_QY.dll")]
|
|||
|
[DllImport("Bin\\WxWorkLoader.dll")]
|
|||
|
public static extern bool InitWxWorkSocket(AcceptCallbackFunc acceptCallback,
|
|||
|
RecvCallbackFunc recvCallback, CloseCallbackFunc closeCallback);
|
|||
|
|
|||
|
[DllImport("Bin\\WxWorkLoader.dll")]
|
|||
|
public static extern uint InjectWxWork(byte[] strDllPath, byte[] strWxWorkExePath);
|
|||
|
|
|||
|
[DllImport("Bin\\WxWorkLoader.dll")]
|
|||
|
public static extern uint InjectWxWorkMultiOpen(byte[] strDllPath, byte[] strWxWorkExePath);
|
|||
|
|
|||
|
[DllImport("Bin\\WxWorkLoader.dll")]
|
|||
|
public static extern bool SendWxWorkData(uint dwClienId, byte[] strJsonData);
|
|||
|
|
|||
|
[DllImport("Bin\\WxWorkLoader.dll")]
|
|||
|
public static extern bool DestroyWxWork();
|
|||
|
|
|||
|
[DllImport("Bin\\WxWorkLoader.dll")]
|
|||
|
public static extern uint InjectWxWorkPid(int dwPid, byte[] strDllPath);
|
|||
|
|
|||
|
[DllImport("Bin\\WxWorkLoader.dll")]
|
|||
|
public static extern bool UseUtf8();
|
|||
|
|
|||
|
[DllImport("Bin\\WxWorkLoader.dll")]
|
|||
|
public static extern bool GetUserWxWorkVersion(StringBuilder v);
|
|||
|
|
|||
|
[DllImport("Bin\\WxWorkLoader.dll", EntryPoint = "SendWxWorkData")]
|
|||
|
public static extern bool _SendWxWorkData(uint dwClienId, byte[] strJsonData);
|
|||
|
|
|||
|
public bool SendWxWorkData(uint dwClienId, string strJsonData)
|
|||
|
{
|
|||
|
var ss = User.DwClientId;
|
|||
|
if (WechatClient.IsDebug)
|
|||
|
LogHelper.GetSingleObj().Debug("_调试发送_", $"{dwClienId} -> {strJsonData} - {User != null} - 微信id:{User?.Wxid}");
|
|||
|
|
|||
|
if (User != null && !string.IsNullOrEmpty(User.Wxid))
|
|||
|
{
|
|||
|
var json = HttpExtend.JsonToDictionary(strJsonData);
|
|||
|
var type = json["type"].ToString();
|
|||
|
MsgType msgType;
|
|||
|
if (!Enum.TryParse(type, out msgType))
|
|||
|
{
|
|||
|
if (WechatClient.IsDebug)
|
|||
|
LogHelper.GetSingleObj().Debug("调试发送@转换失败", $"{dwClienId} -> type:{type}");
|
|||
|
return false;
|
|||
|
}
|
|||
|
switch (msgType)
|
|||
|
{
|
|||
|
//截取发送消息 - 为是否是辅助输入提供判断
|
|||
|
|
|||
|
case MsgType.MT_SEND_TEXT_MSG:// 发送文本消息
|
|||
|
case MsgType.MT_SEND_IMAGE_MSG:// 发送图片消息
|
|||
|
case MsgType.MT_SEND_FILE_MSG:// 发送文件消息
|
|||
|
case MsgType.MT_SEND_FOLDER_MSG:// 发送目录消息
|
|||
|
case MsgType.MT_SEND_LINK_MSG:// 发送链接消息
|
|||
|
//case MsgType.MT_SEND_PERSON_CARD_MSG:// 发送个人名片
|
|||
|
case MsgType.MT_SEND_VIDEO_MSG:// 发送视频
|
|||
|
{
|
|||
|
json = json["data"] as Dictionary<string, object>;
|
|||
|
|
|||
|
string conversation_id = json["conversation_id"].ToString();
|
|||
|
var to_wxid = conversation_id;
|
|||
|
if (conversation_id.StartsWith("S:"))//私人消息处理一下,群消息不用管
|
|||
|
{
|
|||
|
to_wxid = conversation_id.Replace($"S:{User.Wxid}_", "");
|
|||
|
}
|
|||
|
string message = string.Empty;
|
|||
|
if (json.ContainsKey("content")) message = json["content"].ToString();
|
|||
|
else if (json.ContainsKey("card_wxid")) message = json["card_wxid"].ToString();
|
|||
|
else if (json.ContainsKey("file")) message = json["file"].ToString();
|
|||
|
//else if (json.ContainsKey("user_id")) message = json["user_id"].ToString();
|
|||
|
if (!string.IsNullOrEmpty(message))
|
|||
|
{
|
|||
|
Common.SetCache(User.Wxid, to_wxid, message);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
return _SendWxWorkData(dwClienId, Encoding.UTF8.GetBytes(strJsonData));
|
|||
|
}
|
|||
|
|
|||
|
static string DllPath = HttpExtend.MapFile($"WxWorkHelper_{Version}.dll", "Bin");
|
|||
|
|
|||
|
|
|||
|
//private const string Version = "3.0.27.2701";
|
|||
|
//private const string PcMd5 = "DE820FFBA84BC8E4C89A9C4857420BB7";//3.0.27.2701
|
|||
|
|
|||
|
//private const string Version = "3.1.1.3001";
|
|||
|
//private const string PcMd5 = "7EBF31BC0617397614E72907260B2A15";//3.1.1.3001
|
|||
|
|
|||
|
private const string Version = "3.1.10.3010";
|
|||
|
private const string PcMd5 = "5E7DF89ECC5FC04F1ECB96C1EE72F17E";//3.1.10.3010
|
|||
|
|
|||
|
public override string GetVersion()
|
|||
|
{
|
|||
|
return Version;
|
|||
|
}
|
|||
|
|
|||
|
public Wechat_Xiaoxie_QY(WechatUser User) : base(User) { }
|
|||
|
|
|||
|
public static void Install()
|
|||
|
{
|
|||
|
if (IsQYInstall) return;
|
|||
|
try
|
|||
|
{
|
|||
|
m_AcceptCallbackFunc = WxAcceptCallback;
|
|||
|
m_RecvCallbackFunc = WxRecvCallback;
|
|||
|
m_CloseCallbackFunc = WxCloseCallback;
|
|||
|
|
|||
|
UseUtf8();
|
|||
|
// 初始化Callback
|
|||
|
InitWxWorkSocket(m_AcceptCallbackFunc, m_RecvCallbackFunc, m_CloseCallbackFunc);
|
|||
|
|
|||
|
StringBuilder sb = new StringBuilder();
|
|||
|
|
|||
|
var path1 = HttpExtend.MapPath("WXWork");
|
|||
|
var path2 = HttpExtend.MapPath("WXWork\\" + Version);
|
|||
|
|
|||
|
InitPc();
|
|||
|
}
|
|||
|
catch (Exception)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
IsQYInstall = true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 是否替换
|
|||
|
/// </summary>
|
|||
|
private static bool IsReplace = false;
|
|||
|
/// <summary>
|
|||
|
/// pj文件需要杀死进程,并替换文件
|
|||
|
/// </summary>
|
|||
|
public static void PJFileReplace()
|
|||
|
{
|
|||
|
if (IsReplace) return;
|
|||
|
IsReplace = true;
|
|||
|
try
|
|||
|
{
|
|||
|
KillPc();
|
|||
|
|
|||
|
var path2 = HttpExtend.MapPath("WXWork\\" + Version);
|
|||
|
var fixName = HttpExtend.MapFile("Fix2.dll", path2);
|
|||
|
var msimgName = HttpExtend.MapFile("msimg32.dll", path2);
|
|||
|
//if (!Environment.Is64BitOperatingSystem)
|
|||
|
//{
|
|||
|
// #region 32位系统
|
|||
|
// //Util.WriteResource(fixName, Resources.Fix2_QY_32);
|
|||
|
// //Util.WriteResource(msimgName, Resources.msimg32_QY_32);
|
|||
|
// #endregion
|
|||
|
//}
|
|||
|
//else
|
|||
|
//{
|
|||
|
// #region 64位系统
|
|||
|
// Util.WriteResource(fixName, Resources.Fix2_QY);
|
|||
|
// Util.WriteResource(msimgName, Resources.msimg32_QY);
|
|||
|
// #endregion
|
|||
|
//}
|
|||
|
|
|||
|
//Util.WriteResource(fixName, Resources.Fix2_QY);
|
|||
|
//Util.WriteResource(msimgName, Resources.msimg32_QY);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
throw ex;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 杀死注入 pc
|
|||
|
/// </summary>
|
|||
|
/// <param name="isInject"></param>
|
|||
|
private static void KillPc(bool isInject = false)
|
|||
|
{
|
|||
|
Process[] MyProcesses = Process.GetProcesses();
|
|||
|
|
|||
|
var path1 = HttpExtend.MapPath("WXWork");
|
|||
|
var path2 = HttpExtend.MapPath("WXWork\\" + Version);
|
|||
|
foreach (Process MyProcess in MyProcesses)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var name = MyProcess.ProcessName.ToUpper();
|
|||
|
if (name == "WXWORK" && MyProcess.MainModule.FileName.StartsWith(path1))
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
//判断微信版本
|
|||
|
if (MyProcess.MainModule.FileName.StartsWith(path2))
|
|||
|
{
|
|||
|
var id = MyProcess.Id;
|
|||
|
if (isInject)
|
|||
|
{
|
|||
|
var result = Task<bool>.Factory.StartNew(delegate
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var WechatWinFile = CsharpHttpHelper.HttpExtend.MapFile("WXWork.exe", $"WXWork\\{Version}");
|
|||
|
var md5 = Common.GetMD5Hash(WechatWinFile).ToUpper();
|
|||
|
if (!File.Exists(WechatWinFile) || md5 != PcMd5.ToUpper())
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Info("系统", $"开始企业注入进程:{id}...");
|
|||
|
var uin = InjectWxWorkPid(id, Encoding.UTF8.GetBytes(DllPath));
|
|||
|
LogHelper.GetSingleObj().Info("系统", $"注入企业成功:{id},句柄ID:{uin}");
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception)
|
|||
|
{ }
|
|||
|
return false;
|
|||
|
}).Wait(20000);
|
|||
|
if (!result)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Info("系统cc", "杀死企业进程:" + MyProcess.Id);
|
|||
|
MyProcess.Kill();
|
|||
|
}
|
|||
|
catch (Exception)
|
|||
|
{ }
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Info("主动dd", "杀死进程:" + MyProcess.Id);
|
|||
|
MyProcess.Kill();
|
|||
|
}
|
|||
|
catch (Exception)
|
|||
|
{ }
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception)
|
|||
|
{ }
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static void InitPc()
|
|||
|
{
|
|||
|
if (Util.IsLinshi())
|
|||
|
PJFileReplace();
|
|||
|
else
|
|||
|
{
|
|||
|
IsReplace = false;
|
|||
|
var isZanYong = DeletePJFile();
|
|||
|
|
|||
|
KillPc(!isZanYong);
|
|||
|
if (isZanYong)
|
|||
|
{
|
|||
|
isZanYong = DeletePJFile();
|
|||
|
if (isZanYong)
|
|||
|
throw new Exception("文件处理异常,,");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 破解文件是否暂用
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
private static bool DeletePJFile()
|
|||
|
{
|
|||
|
var isZanYong = false;
|
|||
|
var path2 = HttpExtend.MapPath("WXWork\\" + Version);
|
|||
|
|
|||
|
var fixName = HttpExtend.MapFile("Fix2.dll", path2);
|
|||
|
var msimgName = HttpExtend.MapFile("msimg32.dll", path2);
|
|||
|
try
|
|||
|
{
|
|||
|
if (File.Exists(fixName))
|
|||
|
File.Delete(fixName);
|
|||
|
if (File.Exists(msimgName))
|
|||
|
File.Delete(msimgName);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
isZanYong = true;
|
|||
|
}
|
|||
|
return isZanYong;
|
|||
|
}
|
|||
|
|
|||
|
private static string RemoteCache = "get_login_code_cache_workwechat";
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 等待登录结果
|
|||
|
/// </summary>
|
|||
|
public static Dictionary<string, string> WaitLoginResult = new Dictionary<string, string>();
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 远程登录微信
|
|||
|
/// </summary>
|
|||
|
public static List<RemoteLoginCode> RemoteLoginCodes = new List<RemoteLoginCode>();
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// pc微信登录二维码
|
|||
|
/// </summary>
|
|||
|
/// <param name="ServerMsgID"></param>
|
|||
|
public static void LoginQrcode(string ServerMsgID)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
RemoteLoginCode result = null;
|
|||
|
try
|
|||
|
{
|
|||
|
string downloadsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
|
|||
|
var wxConfig = HttpExtend.MapFile(@"Config.cfg", downloadsPath + @"\WXWork\Global");
|
|||
|
if (File.Exists(wxConfig))
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
File.Delete(wxConfig);
|
|||
|
}
|
|||
|
catch (Exception)
|
|||
|
{ }
|
|||
|
StartWechat(true);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
result = new RemoteLoginCode() { pid = -1, rType = RobotType.客户端企业微信, b64Md5 = ex.Message };
|
|||
|
}
|
|||
|
|
|||
|
if (result == null)
|
|||
|
{
|
|||
|
result = Task.Factory.StartNew<RemoteLoginCode>(delegate ()
|
|||
|
{
|
|||
|
var awaitTime = DateTime.Now.AddSeconds(10);
|
|||
|
do
|
|||
|
{
|
|||
|
Thread.Sleep(200);
|
|||
|
Cache cache = HttpRuntime.Cache;
|
|||
|
object item = cache[RemoteCache];
|
|||
|
if (item != null)
|
|||
|
{
|
|||
|
cache.Remove(RemoteCache);
|
|||
|
var r = item as RemoteLoginCode;
|
|||
|
return r;
|
|||
|
}
|
|||
|
} while (awaitTime >= DateTime.Now);
|
|||
|
return null;
|
|||
|
}).Result;
|
|||
|
}
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
var msg = new CommonResult();
|
|||
|
msg.RobotUsername = string.Empty;
|
|||
|
msg.RobotUsernick = string.Empty;
|
|||
|
msg.RobotType = RobotType.客户端企业微信;
|
|||
|
msg.MsgId = ServerMsgID;
|
|||
|
msg.Cmd = PCRobotCMD.rcvLoginCode_workWeChat;
|
|||
|
msg.Data = result == null ? string.Empty : JsonConvert.SerializeObject(result);
|
|||
|
|
|||
|
socketClient.Send(msg);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 卸载安装
|
|||
|
/// </summary>
|
|||
|
public static void UnInstall()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
//DestroyWxWork();
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "..");
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
private static Dictionary<uint, int> MT_APP_READY_MSG_BIND = new Dictionary<uint, int>();
|
|||
|
|
|||
|
private static readonly object Friend_Lock = new object();
|
|||
|
|
|||
|
// 接收消息回调
|
|||
|
private static void WxRecvCallback(uint _dwClient, IntPtr intPtr, uint dwSize)
|
|||
|
{
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
byte[] body = new byte[dwSize];
|
|||
|
Marshal.Copy(intPtr, body, 0, body.Length);
|
|||
|
var recvData = Encoding.UTF8.GetString(body).Replace("\0", "").Trim();//再转成UTF8
|
|||
|
|
|||
|
var dwClientid = _dwClient;
|
|||
|
|
|||
|
if (WechatClient.IsDebug)
|
|||
|
LogHelper.GetSingleObj().Debug("调试企业收到文本消息", $"{dwClientid} -> {recvData}\r\n");
|
|||
|
|
|||
|
//var method = new Action(delegate ()
|
|||
|
Task.Factory.StartNew(delegate ()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
Console.WriteLine("企业收到消息:" + recvData);
|
|||
|
|
|||
|
var json = CsharpHttpHelper.HttpExtend.JsonToDictionary(recvData);
|
|||
|
var type = json["type"].ToString();
|
|||
|
var data = json.ContainsKey("data") ? json["data"] as Dictionary<string, object> : null;
|
|||
|
|
|||
|
MsgType msgType;
|
|||
|
if (!Enum.TryParse(type, out msgType)) return;
|
|||
|
Console.WriteLine($"dwClientid = {dwClientid}");
|
|||
|
switch (msgType)
|
|||
|
{
|
|||
|
case MsgType.MT_APP_READY_MSG:
|
|||
|
MT_APP_READY_MSG_BIND[dwClientid] = int.Parse(data["pid"].ToString());
|
|||
|
break;
|
|||
|
case MsgType.MT_PARAMS_ERROR_MSG:
|
|||
|
{ }
|
|||
|
break;
|
|||
|
case MsgType.MT_USER_LOGIN://登陆消息
|
|||
|
{
|
|||
|
var wxid = data["user_id"].ToString();
|
|||
|
var user = WechatClient.GetUser(wxid, dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
user.Nickname = data["username"].ToString();
|
|||
|
user.HeaderUrl = data["avatar"].ToString();
|
|||
|
//user.DBFile = data["wx_user_dir"].ToString();
|
|||
|
user.Pid = MT_APP_READY_MSG_BIND.ContainsKey(dwClientid) ? MT_APP_READY_MSG_BIND[dwClientid] : 0; //uint.Parse(data["pid"].ToString());
|
|||
|
user.Phone = data["mobile"].ToString();
|
|||
|
user.Uin = wxid;
|
|||
|
WechatClient.OnRefUserEvent(user, WaitLoginResult);
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_USER_LOGOUT:
|
|||
|
{
|
|||
|
var wxid = data["user_id"].ToString();
|
|||
|
var user = WechatClient.Users.FirstOrDefault(f => f.Key == wxid).Value;
|
|||
|
if (user != null)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Info("系统", $"LogOut_QY事件退出,Uin:{user.Uin},微信:{user.Nickname}({wxid})");
|
|||
|
WechatClient.RemoveUser(user);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_LOGIN_QRCODE_MSG:
|
|||
|
{
|
|||
|
//{"data":{"file":"C:\\Users\\秒单客006\\Documents\\WXWork\\Global\\Image\\089d9de9-cc40-458a-af4a-b39a04e2f95f.jpg"},"type":11028}
|
|||
|
if (!data.ContainsKey("file")) return;
|
|||
|
if (MT_APP_READY_MSG_BIND.ContainsKey(dwClientid))
|
|||
|
{
|
|||
|
var file = data["file"].ToString();
|
|||
|
|
|||
|
if (File.Exists(file))
|
|||
|
{
|
|||
|
var cfBase64 = Common.ConvertImageToBase64(Image.FromFile(file));
|
|||
|
|
|||
|
var codeInfo = new RemoteLoginCode() { pid = MT_APP_READY_MSG_BIND[dwClientid], cImgB64 = cfBase64, b64Md5 = HttpHelper.ToMD5(cfBase64), rType = RobotType.客户端企业微信, t = HttpExtend.GetTimeStamp(DateTime.Now) };
|
|||
|
|
|||
|
Cache cache = HttpRuntime.Cache;
|
|||
|
//查找 md5 的缓存,不存在则返回null
|
|||
|
object item = cache[RemoteCache];
|
|||
|
cache.Insert(RemoteCache, codeInfo, null, DateTime.Now.AddSeconds(3), Cache.NoSlidingExpiration);
|
|||
|
|
|||
|
RemoteLoginCodes.Add(codeInfo);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_MINIAPP_MSG://收到小程序
|
|||
|
{
|
|||
|
//个人微信/企业微信
|
|||
|
//{"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}
|
|||
|
|
|||
|
if (data == null) return;
|
|||
|
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
|
|||
|
//var content_type = data["content_type"]?.ToString();//内容类型 78
|
|||
|
//var conversation_id = data["conversation_id"]?.ToString();//接收者的的会话ID
|
|||
|
//var enterpoint = data["enterpoint"]?.ToString();//入口点 - 链接(小程序里面的链接)
|
|||
|
//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 content_type = data["content_type"]?.ToString();//内容类型 78
|
|||
|
var conversation_id = data["conversation_id"]?.ToString();//接收者的的会话ID
|
|||
|
var enterpoint = data["enterpoint"]?.ToString();//入口点 - 链接(小程序里面的链接)
|
|||
|
var headimg = data["headimg"]?.ToString();//小程序的头像
|
|||
|
var name = data["name"]?.ToString();//小程序的名称
|
|||
|
var receiver = data["receiver"]?.ToString();// 接收者的user_id
|
|||
|
var sender = data["sender"]?.ToString();// 发送者的user_id
|
|||
|
var sender_name = data["sender_name"]?.ToString();//发送者昵称
|
|||
|
var title = data["title"]?.ToString();//小程序标题
|
|||
|
var wxid = data["wxid"]?.ToString();
|
|||
|
var server_id = data["server_id"]?.ToString();//消息的服务器ID
|
|||
|
|
|||
|
var isSend = false;
|
|||
|
var RobotUsername = string.Empty;
|
|||
|
var RobotUsernick = string.Empty;
|
|||
|
var FromUsername = string.Empty;
|
|||
|
var FromUsernick = string.Empty;
|
|||
|
|
|||
|
//if (content_type != "78")//0自己发送的消息
|
|||
|
//{
|
|||
|
// if (!WechatClient.IsAuxiliaryInput(sender, receiver, enterpoint))
|
|||
|
// {
|
|||
|
// Console.WriteLine("此消息被过滤,因为是机器人自己发送的:" + enterpoint);
|
|||
|
// return;
|
|||
|
// }
|
|||
|
|
|||
|
// var ass = WechatClient.IsAssistance(sender, receiver, dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
// if (ass.type == WechatClient.AssistanceType.终止) return;
|
|||
|
// isSend = ass.type == WechatClient.AssistanceType.辅助;
|
|||
|
|
|||
|
// RobotUsername = ass.robotName;
|
|||
|
// RobotUsernick = ass.robotNick;
|
|||
|
// FromUsername = ass.fromName;
|
|||
|
// FromUsernick = ass.fromNick;
|
|||
|
//}
|
|||
|
//else
|
|||
|
//{
|
|||
|
var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (user == null)
|
|||
|
return;
|
|||
|
RobotUsername = user.Wxid;
|
|||
|
RobotUsernick = user.Nickname;
|
|||
|
FromUsername = sender;
|
|||
|
FromUsernick = sender_name;
|
|||
|
//}
|
|||
|
var wmsg = new WorkWechatReceiveMsg();
|
|||
|
wmsg.Cmd = PCRobotCMD.rcvTxt_workWeChat;
|
|||
|
wmsg.IsSend = isSend;
|
|||
|
wmsg.RobotUsername = RobotUsername;
|
|||
|
wmsg.RobotUsernick = RobotUsernick;
|
|||
|
wmsg.RobotType = RobotType.客户端企业微信;
|
|||
|
wmsg.FromMessageType = WechatMsgType.文本;
|
|||
|
|
|||
|
if (conversation_id.Contains("R:"))
|
|||
|
{
|
|||
|
wmsg.FromGroupid = conversation_id;
|
|||
|
wmsg.FromUsername = sender;
|
|||
|
wmsg.FromUsernick = sender_name;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
wmsg.FromUsername = FromUsername;
|
|||
|
wmsg.FromUsernick = FromUsernick;
|
|||
|
}
|
|||
|
wmsg.FromMessage = enterpoint.Replace("pages/index/index.html?goods_id=", "https://mobile.yangkeduo.com/goods.html?goods_id=").Replace("pages/item/detail/detail.html?sku=", @"https://item.jd.com/");
|
|||
|
|
|||
|
socketClient.Send(wmsg);
|
|||
|
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_TEXT_MSG://收到文本
|
|||
|
{
|
|||
|
|
|||
|
if (data == null) return;
|
|||
|
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
|
|||
|
var content_type = data["content_type"]?.ToString(); //企业微信消息类型
|
|||
|
|
|||
|
#region 文本消息
|
|||
|
|
|||
|
#region 消息样式
|
|||
|
//{"data":{"content":"我17","content_type":2,"conversation_id":"S:1688853956558440_7881301610989604","local_id":"19","receiver":"1688853956558440","send_time":"1584013142","sender":"7881301610989604","sender_name":"17","server_id":"1000481"},"type":11041} - 通过好友返回的数据
|
|||
|
//{"data":{"content":"哦哦哦","content_type":2,"conversation_id":"S:1688853956558440_7881301610989604","local_id":"33","receiver":"1688853956558440","send_time":"1584014191","sender":"7881301610989604","sender_name":"17","server_id":"1000520"},"type":11041} - 别人给我发了条消息
|
|||
|
//{"data":{"content":"图婆","content_type":2,"conversation_id":"S:1688853956558440_7881301610989604","local_id":"36","receiver":"1688853956558440","send_time":"1584014736","sender":"7881301610989604","sender_name":"17","server_id":"1000542"},"type":11041}
|
|||
|
|
|||
|
//{"data":{"content":"哦哦哦","content_type":0,"conversation_id":"S:1688853956450720_1688853956558440","local_id":"22","receiver":"1688853956450720","send_time":"1584013962","sender":"1688853956558440","sender_name":"华","server_id":"1000498"},"type":11041} - 收到自己发的消息
|
|||
|
//{"data":{"content":"给我发条消息","content_type":0,"conversation_id":"S:1688853956450720_1688853956558440","local_id":"23","receiver":"1688853956450720","send_time":"1584014066","sender":"1688853956558440","sender_name":"华","server_id":"1000500"},"type":11041}
|
|||
|
|
|||
|
//{"data":{"content":"饿的","content_type":0,"conversation_id":"R:10696053211008104","local_id":"42","receiver":"R:10696053211008104","send_time":"1584015069","sender":"1688853956558440","sender_name":"吴嘉华","server_id":"1000574"},"type":11041} - 收到自己发送的群消息
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
//{"data":{"at_list":[],"content":"我是机器学习","content_type":2,"conversation_id":"S:1688853764215634_7881300713013122","local_id":"27946","receiver":"1688853764215634","send_time":"1589009390","sender":"7881300713013122","sender_name":"机器学习","server_id":"1088720"},"type":11041}
|
|||
|
//0、2 - 发送的文字 (0)
|
|||
|
if (content_type == "0" || content_type == "2")
|
|||
|
{
|
|||
|
var content = data["content"]?.ToString(); //文本消息内容
|
|||
|
var conversation_id = data["conversation_id"]?.ToString(); //会话ID
|
|||
|
var local_id = data["local_id"]?.ToString(); //消息的本地ID
|
|||
|
var receiver = data["receiver"]?.ToString(); //接收者的user_id
|
|||
|
var send_time = data["send_time"]?.ToString(); //消息时间戳
|
|||
|
var sender = data["sender"]?.ToString(); //发送者的user_id
|
|||
|
var sender_name = data["sender_name"]?.ToString(); //发送者昵称
|
|||
|
var server_id = data["server_id"]?.ToString(); //消息的服务器ID
|
|||
|
|
|||
|
var isSend = false;
|
|||
|
var RobotUsername = string.Empty;
|
|||
|
var RobotUsernick = string.Empty;
|
|||
|
var FromUsername = string.Empty;
|
|||
|
var FromUsernick = string.Empty;
|
|||
|
|
|||
|
if (content_type == "0")//0自己发送的消息
|
|||
|
{
|
|||
|
if (!WechatClient.IsAuxiliaryInput(sender, receiver, content))
|
|||
|
{
|
|||
|
Console.WriteLine("此消息被过滤,因为是机器人自己发送的:" + content);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var ass = WechatClient.IsAssistance(sender, receiver, dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (ass.type == WechatClient.AssistanceType.终止) return;
|
|||
|
isSend = ass.type == WechatClient.AssistanceType.辅助;
|
|||
|
|
|||
|
RobotUsername = ass.robotName;
|
|||
|
RobotUsernick = ass.robotNick;
|
|||
|
FromUsername = ass.fromName;
|
|||
|
FromUsernick = ass.fromNick;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (user == null)
|
|||
|
return;
|
|||
|
RobotUsername = user.Wxid;
|
|||
|
RobotUsernick = user.Nickname;
|
|||
|
FromUsername = sender;
|
|||
|
FromUsernick = sender_name;
|
|||
|
}
|
|||
|
var wmsg = new WorkWechatReceiveMsg();
|
|||
|
wmsg.Cmd = PCRobotCMD.rcvTxt_workWeChat;
|
|||
|
wmsg.IsSend = isSend;
|
|||
|
wmsg.RobotUsername = RobotUsername;
|
|||
|
wmsg.RobotUsernick = RobotUsernick;
|
|||
|
wmsg.RobotType = RobotType.客户端企业微信;
|
|||
|
wmsg.FromMessageType = WechatMsgType.文本;
|
|||
|
|
|||
|
if (conversation_id.Contains("R:"))
|
|||
|
{
|
|||
|
wmsg.FromGroupid = conversation_id;
|
|||
|
wmsg.FromUsername = sender;
|
|||
|
wmsg.FromUsernick = sender_name;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
wmsg.FromUsername = FromUsername;
|
|||
|
wmsg.FromUsernick = FromUsernick;
|
|||
|
}
|
|||
|
wmsg.FromMessage = content;
|
|||
|
|
|||
|
socketClient.Send(wmsg);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_IMG_MSG://收到图片
|
|||
|
{
|
|||
|
#region 图片消息
|
|||
|
|
|||
|
#region 消息样式
|
|||
|
|
|||
|
//{"data":{"content_type":101,"conversation_id":"R:10696053211008104","file_name":"7305d3cd-e94f-47db-a604-ce079e6c9ac5.jpg","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Image\\2020-03\\7305d3cd-e94f-47db-a604-ce079e6c9ac5.jpg","file_size":19457,"local_id":"73","receiver":"1688853956558440","send_time":"1584028981","sender":"7881301364988874","sender_name":"18","server_id":"1000677"},"type":11042} - 别人在群发的图片
|
|||
|
|
|||
|
//{"data":{"content_type":101,"conversation_id":"S:1688853956558440_7881301364988874","file_name":"29c9c19d-e8d7-4cb0-95b5-e1a7d385003a.jpg","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Image\\2020-03\\29c9c19d-e8d7-4cb0-95b5-e1a7d385003a.jpg","file_size":19457,"local_id":"74","receiver":"1688853956558440","send_time":"1584029032","sender":"7881301364988874","sender_name":"18","server_id":"1000680"},"type":11042} - 别人私聊发的图片
|
|||
|
|
|||
|
//{"data":{"content_type":14,"conversation_id":"R:10696053211008104","file_name":"0f7890b8ea01f7205a76d1195dab66b0.png","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Image\\2020-03\\0f7890b8ea01f7205a76d1195dab66b0.png","file_size":1627,"local_id":"75","receiver":"R:10696053211008104","send_time":"1584029085","sender":"1688853956558440","sender_name":"吴嘉华","server_id":"1000685"},"type":11042} - 自己群里发的图片
|
|||
|
|
|||
|
//{"data":{"content_type":14,"conversation_id":"S:1688853956558440_7881301364988874","file_name":"9c6d1a59d8f122fc85c3435ea2aa46fc.jpg","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Image\\2020-03\\9c6d1a59d8f122fc85c3435ea2aa46fc.jpg","file_size":178092,"local_id":"76","receiver":"7881301364988874","send_time":"1584029534","sender":"1688853956558440","sender_name":"吴嘉华","server_id":"1000689"},"type":11042} - 自己私聊发的图片
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
//14、101 (14)
|
|||
|
|
|||
|
if (data == null) return;
|
|||
|
|
|||
|
var content_type = data["content_type"]?.ToString(); //企业微信消息类型
|
|||
|
|
|||
|
if (content_type == "14") return;
|
|||
|
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (user == null)
|
|||
|
return;
|
|||
|
|
|||
|
var conversation_id = data["conversation_id"]?.ToString(); //会话ID
|
|||
|
var local_id = data["local_id"]?.ToString(); //消息的本地ID
|
|||
|
var receiver = data["receiver"]?.ToString(); //接收者的user_id
|
|||
|
var send_time = data["send_time"]?.ToString(); //消息时间戳
|
|||
|
var sender = data["sender"]?.ToString(); //发送者的user_id
|
|||
|
var sender_name = data["sender_name"]?.ToString(); //发送者昵称
|
|||
|
var server_id = data["server_id"]?.ToString(); //消息的服务器ID
|
|||
|
var file_path = data["file_path"]?.ToString(); //图片路径
|
|||
|
|
|||
|
var wmsg = new WorkWechatReceiveMsg();
|
|||
|
wmsg.Cmd = PCRobotCMD.rcvImg_workWeChat;
|
|||
|
wmsg.RobotType = RobotType.客户端企业微信;
|
|||
|
wmsg.IsSend = false;
|
|||
|
wmsg.RobotUsername = user.Wxid;
|
|||
|
wmsg.RobotUsernick = user.Nickname;
|
|||
|
|
|||
|
wmsg.FromMessage = $"[图片={file_path}]";
|
|||
|
wmsg.FromMessageType = WechatMsgType.图片;
|
|||
|
|
|||
|
if (conversation_id.Contains("R:"))
|
|||
|
{
|
|||
|
wmsg.FromGroupid = conversation_id;
|
|||
|
wmsg.FromUsername = sender;
|
|||
|
wmsg.FromUsernick = sender_name;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
wmsg.FromUsername = sender;
|
|||
|
wmsg.FromUsernick = sender_name;
|
|||
|
}
|
|||
|
wmsg.FromMessage = string.Empty;
|
|||
|
|
|||
|
socketClient.Send(wmsg);
|
|||
|
#endregion
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_VIDEO_MSG://收到视频
|
|||
|
{
|
|||
|
#region 收到视频
|
|||
|
|
|||
|
#region 消息样式
|
|||
|
//{"data":{"content_type":103,"conversation_id":"S:1688853956558440_7881301364988874","duration":1,"file_name":"video.MP4","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Video\\2020-03\\video.MP4","file_size":198490,"height":960,"local_id":"77","receiver":"1688853956558440","send_time":"1584031142","sender":"7881301364988874","sender_name":"18","server_id":"1000691","width":544},"type":11043} - 别人发
|
|||
|
|
|||
|
//{"data":{"content_type":23,"conversation_id":"S:1688853956558440_7881301364988874","duration":1,"file_name":"video.MP4","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Video\\2020-03\\video.MP4","file_size":198490,"height":960,"local_id":"78","receiver":"7881301364988874","send_time":"1584031203","sender":"1688853956558440","sender_name":"吴嘉华","server_id":"1000696","width":544},"type":11043} - 自己发
|
|||
|
#endregion
|
|||
|
|
|||
|
//23、103 (23)
|
|||
|
|
|||
|
if (data == null) return;
|
|||
|
|
|||
|
var content_type = data["content_type"]?.ToString(); //企业微信消息类型
|
|||
|
|
|||
|
if (content_type == "23") return;
|
|||
|
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (user == null)
|
|||
|
return;
|
|||
|
|
|||
|
var conversation_id = data["conversation_id"]?.ToString(); //会话ID
|
|||
|
var local_id = data["local_id"]?.ToString(); //消息的本地ID
|
|||
|
var receiver = data["receiver"]?.ToString(); //接收者的user_id
|
|||
|
var send_time = data["send_time"]?.ToString(); //消息时间戳
|
|||
|
var sender = data["sender"]?.ToString(); //发送者的user_id
|
|||
|
var sender_name = data["sender_name"]?.ToString(); //发送者昵称
|
|||
|
var server_id = data["server_id"]?.ToString(); //消息的服务器ID
|
|||
|
var file_path = data["file_path"]?.ToString(); //图片路径
|
|||
|
|
|||
|
var wmsg = new WorkWechatReceiveMsg();
|
|||
|
wmsg.Cmd = PCRobotCMD.rcvFile_workWeChat;
|
|||
|
wmsg.RobotType = RobotType.客户端企业微信;
|
|||
|
wmsg.IsSend = false;
|
|||
|
wmsg.RobotUsername = user.Wxid;
|
|||
|
wmsg.RobotUsernick = user.Nickname;
|
|||
|
|
|||
|
wmsg.FromMessage = $"[视频={file_path}]";
|
|||
|
wmsg.FromMessageType = WechatMsgType.视频;
|
|||
|
|
|||
|
if (conversation_id.Contains("R:"))
|
|||
|
{
|
|||
|
wmsg.FromGroupid = conversation_id;
|
|||
|
wmsg.FromUsername = sender;
|
|||
|
wmsg.FromUsernick = sender_name;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
wmsg.FromUsername = sender;
|
|||
|
wmsg.FromUsernick = sender_name;
|
|||
|
}
|
|||
|
wmsg.FromMessage = string.Empty;
|
|||
|
|
|||
|
socketClient.Send(wmsg);
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_VOICE_MSG://收到语音
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_FILE_MSG://收到文件
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_LOCATION_MSG://收到位置
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_LINK_CARD_MSG://收到链接
|
|||
|
{
|
|||
|
#region 链接消息
|
|||
|
|
|||
|
#region 消息样式
|
|||
|
//{"data":{"content_type":13,"conversation_id":"S:1688853956558440_7881301364988874","desc":"【正品险·全国联保】听音乐、语音遥控家电的人工智能音箱","image_url":"","local_id":"82","receiver":"1688853956558440","send_time":"1584033150","sender":"7881301364988874","sender_name":"18","server_id":"1000715","title":"78元 小米(MI)小爱音箱 Play全新小爱同学升级版智能人工蓝牙WiFi音响 拼多多","url":"https://mobile.yangkeduo.com/goods1.html?goods_id=19287381820&page_from=35&share_uin=H3Z5B2UR6DQLWBIKN24YVO5XPQ_GEXDA&refer_share_id=e0d9d244358640aa853a8dcd1ff84216&refer_share_uid=4918926726&refer_share_channel=message&refer_share_form=card"},"type":11047} - 别人发送的私聊链接
|
|||
|
|
|||
|
//{"data":{"content_type":13,"conversation_id":"R:10696053211008104","desc":"【正品险·全国联保】听音乐、语音遥控家电的人工智能音箱","image_url":"","local_id":"85","receiver":"1688853956558440","send_time":"1584034341","sender":"7881301364988874","sender_name":"18","server_id":"1000724","title":"78元 小米(MI)小爱音箱 Play全新小爱同学升级版智能人工蓝牙WiFi音响 拼多多","url":"https://mobile.yangkeduo.com/goods1.html?goods_id=19287381820&page_from=35&share_uin=H3Z5B2UR6DQLWBIKN24YVO5XPQ_GEXDA&refer_share_id=e0d9d244358640aa853a8dcd1ff84216&refer_share_uid=4918926726&refer_share_channel=message&refer_share_form=card"},"type":11047} - 别人发送的群聊链接
|
|||
|
|
|||
|
|
|||
|
//{"data":{"content_type":13,"conversation_id":"S:1688853956558440_7881301364988874","desc":"【正品险·全国联保】听音乐、语音遥控家电的人工智能音箱","image_url":"https://wework.qpic.cn/wwpic/51458_1ermIpIgTJu-_11_1584034011/0","local_id":"83","receiver":"7881301364988874","send_time":"1584034011","sender":"1688853956558440","sender_name":"吴","server_id":"1000720","title":"78元 小米(MI)小爱音箱 Play全新小爱同学升级版智能人工蓝牙WiFi音响 拼多多","url":"https://mobile.yangkeduo.com/goods1.html?goods_id=19287381820&page_from=35&share_uin=H3Z5B2UR6DQLWBIKN24YVO5XPQ_GEXDA&refer_share_id=e0d9d244358640aa853a8dcd1ff84216&refer_share_uid=4918926726&refer_share_channel=message&refer_share_form=card"},"type":11047} - 自己发送的私聊
|
|||
|
|
|||
|
//{"data":{"content_type":13,"conversation_id":"R:10696053211008104","desc":"【正品险·全国联保】听音乐、语音遥控家电的人工智能音箱","image_url":"https://wework.qpic.cn/wwpic/51458_1ermIpIgTJu-_11_1584034011/0","local_id":"84","receiver":"R:10696053211008104","send_time":"1584034246","sender":"1688853956558440","sender_name":"吴","server_id":"1000722","title":"78元 小米(MI)小爱音箱 Play全新小爱同学升级版智能人工蓝牙WiFi音响 拼多多","url":"https://mobile.yangkeduo.com/goods1.html?goods_id=19287381820&page_from=35&share_uin=H3Z5B2UR6DQLWBIKN24YVO5XPQ_GEXDA&refer_share_id=e0d9d244358640aa853a8dcd1ff84216&refer_share_uid=4918926726&refer_share_channel=message&refer_share_form=card"},"type":11047} - 自己发送的群聊
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
var content_type = data["content_type"]?.ToString();
|
|||
|
//if (content_type != "13") return;
|
|||
|
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
|
|||
|
var conversation_id = data["conversation_id"]?.ToString(); //会话ID
|
|||
|
var desc = data["desc"]?.ToString(); //链接描述
|
|||
|
var image_url = data["image_url"]?.ToString(); //链接缩略图url
|
|||
|
var local_id = data["local_id"]?.ToString(); //消息的本地ID
|
|||
|
var receiver = data["receiver"]?.ToString(); //接收者的user_id
|
|||
|
var send_time = data["send_time"]?.ToString(); //消息时间戳
|
|||
|
var sender = data["sender"]?.ToString(); //发送者的user_id
|
|||
|
var sender_name = data["sender_name"]?.ToString(); //发送者昵称
|
|||
|
var server_id = data["server_id"]?.ToString(); //消息的服务器ID
|
|||
|
var title = data["title"]?.ToString(); //链接标题
|
|||
|
var url = data["url"]?.ToString(); //链接url
|
|||
|
|
|||
|
var isSend = false;
|
|||
|
var RobotUsername = string.Empty;
|
|||
|
var RobotUsernick = string.Empty;
|
|||
|
var FromUsername = string.Empty;
|
|||
|
var FromUsernick = string.Empty;
|
|||
|
|
|||
|
|
|||
|
var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (user == null)
|
|||
|
return;
|
|||
|
if (user.Wxid == sender) //0自己发送的消息
|
|||
|
{
|
|||
|
if (!WechatClient.IsAuxiliaryInput(sender, receiver, url))
|
|||
|
{
|
|||
|
Console.WriteLine("此消息被过滤,因为是机器人自己发送的:" + url);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var ass = WechatClient.IsAssistance(sender, receiver, dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (ass.type == WechatClient.AssistanceType.终止) return;
|
|||
|
isSend = ass.type == WechatClient.AssistanceType.辅助;
|
|||
|
|
|||
|
RobotUsername = ass.robotName;
|
|||
|
RobotUsernick = ass.robotNick;
|
|||
|
FromUsername = ass.fromName;
|
|||
|
FromUsernick = ass.fromNick;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
RobotUsername = user.Wxid;
|
|||
|
RobotUsernick = user.Nickname;
|
|||
|
FromUsername = sender;
|
|||
|
FromUsernick = sender_name;
|
|||
|
}
|
|||
|
|
|||
|
var wmsg = new WorkWechatReceiveMsg();
|
|||
|
wmsg.Cmd = PCRobotCMD.rcvTxt_workWeChat;
|
|||
|
wmsg.IsSend = isSend;
|
|||
|
wmsg.RobotUsername = RobotUsername;
|
|||
|
wmsg.RobotUsernick = RobotUsernick;
|
|||
|
wmsg.RobotType = RobotType.客户端企业微信;
|
|||
|
wmsg.FromMessageType = WechatMsgType.文本;
|
|||
|
|
|||
|
if (conversation_id.Contains("R:"))
|
|||
|
{
|
|||
|
wmsg.FromGroupid = conversation_id;
|
|||
|
wmsg.FromUsername = sender;
|
|||
|
wmsg.FromUsernick = sender_name;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
wmsg.FromUsername = FromUsername;
|
|||
|
wmsg.FromUsernick = FromUsernick;
|
|||
|
}
|
|||
|
wmsg.FromMessage = url;
|
|||
|
|
|||
|
socketClient.Send(wmsg);
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_EMOTION_MSG://收到表情
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_RED_PACKET_MSG://收到红包
|
|||
|
{
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_PERSON_CARD_MSG://收到个人名片
|
|||
|
{
|
|||
|
//{"data":{"content":"推荐噢噢噢哦哦","content_type":2,"conversation_id":"S:1688853956558440_7881301364988874","local_id":"81","receiver":"1688853956558440","send_time":"1584031525","sender":"7881301364988874","sender_name":"18","server_id":"1000703"},"type":11041}
|
|||
|
|
|||
|
/*
|
|||
|
{"data":{"avatar":"http://wx.qlogo.cn/mmhead/PiajxSqBRaELtKaBvIBMGI7xTZdLA9mZglMaZQxPeBASJT1lCXCJnKg/0","content_type":41,"conversation_id":"S:1688853956558440_7881301364988874","local_id":"80","nickname":"??欧尼桑","receiver":"1688853956558440","send_time":"1584031525","sender":"7881301364988874","sender_name":"18","server_id":"1000700","source":"微信","user_id":"7881301516989639"},"type":11050}
|
|||
|
收到消息:{"data":{"content":"推荐噢噢噢哦哦","content_type":2,"conversation_id":"S:1688853956558440_7881301364988874","local_id":"81","receiver":"1688853956558440","send_time":"1584031525","sender":"7881301364988874","sender_name":"18","server_id":"1000703"},"type":11041}
|
|||
|
*/
|
|||
|
|
|||
|
//var content = data["content"]?.ToString();
|
|||
|
//var content_type = data["content_type"]?.ToString();
|
|||
|
//var conversation_id = data["conversation_id"]?.ToString();
|
|||
|
//var local_id = data["local_id"]?.ToString();
|
|||
|
//var receiver = data["receiver"]?.ToString();
|
|||
|
//var send_time = data["send_time"]?.ToString();
|
|||
|
//var sender = data["sender"]?.ToString();
|
|||
|
//var sender_name = data["sender_name"]?.ToString();
|
|||
|
//var server_id = data["server_id"]?.ToString();
|
|||
|
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_OTHER_MSG:
|
|||
|
break;
|
|||
|
case MsgType.MT_SEARCH_USER_MSG://查询联系人
|
|||
|
break;
|
|||
|
case MsgType.MT_ADD_SEARCH_USER_MSG://添加查询的联系人
|
|||
|
break;
|
|||
|
case MsgType.MT_MODIFY_USER_REMARK_MSG://修改用户备注
|
|||
|
break;
|
|||
|
case MsgType.MT_MODIFY_USER_DESC_MSG:
|
|||
|
break;
|
|||
|
case MsgType.MT_MODIFY_EXTERNAl_USER_PHONES_MSG:
|
|||
|
break;
|
|||
|
case MsgType.MT_MODIFY_EXTERNAl_USER_COMPANY_MSG:
|
|||
|
break;
|
|||
|
case MsgType.MT_CREATE_ROOM_MSG:
|
|||
|
{
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_MODIFY_ROOM_NAME_MSG:
|
|||
|
break;
|
|||
|
case MsgType.MT_ROOM_ADD_MEMBERS_MSG:
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_ROOM_DEL_MEMBERS_MSG://删除群成员
|
|||
|
break;
|
|||
|
case MsgType.MT_RECV_FRIEND_REQUEST://接收好友请求
|
|||
|
{
|
|||
|
//{"data":{"avatar":"http://wx.qlogo.cn/mmhead/0T8yO33zeeg33jJCQibIWobapj6GX4xFBbOECtmG9VdkYpnzyiaUr5iag/0","corp_id":"1970325134026788","nickname":"17","sex":2,"user_id":"7881301610989604","verify":"我17"},"type":11063}
|
|||
|
|
|||
|
//{"data":{"avatar":"http://wx.qlogo.cn/mmhead/PiajxSqBRaEI8qvnXF9KjgTpvaSAzfhbE2kGoIspb7ibbEHGZEQxRibAQ/0","corp_id":"1970325134026788","nickname":"助将","sex":0,"user_id":"7881303410988876","verify":"欧珀new"},"type":11063}
|
|||
|
|
|||
|
//{"data":{"avatar":"http://wx.qlogo.cn/mmhead/zroWGtm5tmsxaCHfI2ibibuBxtzsZc6brAIDCicIianoDYI/0","corp_id":"1970325134026788","nickname":"Boom","sex":1,"user_id":"7881303336175964","verify":"我是Boom"},"type":11063}
|
|||
|
|
|||
|
if (data == null) return;
|
|||
|
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
|
|||
|
var avatar = data["avatar"]?.ToString();//头像
|
|||
|
var corp_id = data["corp_id"]?.ToString();//公司id
|
|||
|
var nickname = data["nickname"]?.ToString();//申请人昵称
|
|||
|
var sex = data["sex"]?.ToString();//性别
|
|||
|
var user_id = data["user_id"]?.ToString();//用户id
|
|||
|
var verify = data["verify"]?.ToString();//申请摘要
|
|||
|
var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (user == null)
|
|||
|
return;
|
|||
|
var wXApply = new WorkWechatApplyFriend();
|
|||
|
wXApply.Cmd = PCRobotCMD.applyFriend_workWeChat;
|
|||
|
wXApply.RobotUsername = user.Wxid;
|
|||
|
wXApply.RobotUsernick = user.Nickname;
|
|||
|
wXApply.RobotType = RobotType.客户端企业微信;
|
|||
|
wXApply.Message = verify;
|
|||
|
wXApply.NewFriendWxid = user_id;
|
|||
|
wXApply.NewFriendNick = nickname;
|
|||
|
wXApply.OldFriendWxid = string.Empty;
|
|||
|
wXApply.OldFriendNick = string.Empty;
|
|||
|
|
|||
|
wXApply.Token = CsharpHttpHelper.HttpHelper.ObjectToJson(new { user_id = user_id, corp_id = corp_id });
|
|||
|
|
|||
|
//记录申请人,用于记录
|
|||
|
if (!FriendRequestRecord.ContainsKey(user_id))
|
|||
|
FriendRequestRecord.TryAdd(user_id, new FriendInfo() { account = user_id, avatar = avatar, nickname = nickname, sex = int.Parse(sex), wxid = user_id });
|
|||
|
|
|||
|
socketClient.Send(wXApply);
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_ACCEPT_FRIEND_REQUEST://接受加好友请求
|
|||
|
break;
|
|||
|
case MsgType.MT_GET_OWNER_INFO_MSG:// 获取自己信息
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_GET_INNER_USERS_MSG:// 获取内部联系人列表
|
|||
|
{
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_GET_EXTERNAL_USERS_MSG:// 获取外部联系列表
|
|||
|
{
|
|||
|
#region 外部联系列表
|
|||
|
|
|||
|
#region 消息样式
|
|||
|
//{"data":[{"avatar":"http://wx.qlogo.cn/mmhead/GPyw0pGicibl4KQicb5bXGu2SibrykeGOH5IicK2d8LTfbA11zNB2A2SoKg/0","conversation_id":"S:1688853956558440_7881301364988874","corp_id":"1970325134026788","desc":"","external_job":"","nickname":"","position":"","realname":"","remark":"","sex":2,"user_id":"7881301364988874","username":"18"},{"avatar":"http://wx.qlogo.cn/mmhead/0T8yO33zeeg33jJCQibIWobapj6GX4xFBbOECtmG9VdkYpnzyiaUr5iag/0","conversation_id":"S:1688853956558440_7881301610989604","corp_id":"1970325134026788","desc":"","external_job":"","nickname":"","position":"","realname":"","remark":"","sex":0,"user_id":"7881301610989604","username":"17"},{"avatar":"http://wx.qlogo.cn/mmhead/Q3auHgzwzM6CiaVp63VVTIRySkxia2KSGQ6hrYAvAkkjoMpl4wFjyhIA/0","conversation_id":"S:1688853956558440_7881302509911391","corp_id":"1970325134026788","desc":"","external_job":"","nickname":"","position":"","realname":"","remark":"千年老妖","sex":1,"user_id":"7881302509911391","username":"千年老妖"}],"type":11037}
|
|||
|
#endregion
|
|||
|
|
|||
|
var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (user == null)
|
|||
|
return;
|
|||
|
var client = WechatClient.GetApi(user) as Wechat_Xiaoxie_QY;
|
|||
|
if (!user.IsGetFriend) return;
|
|||
|
try
|
|||
|
{
|
|||
|
if (data == null)
|
|||
|
{
|
|||
|
lock (Friend_Lock)
|
|||
|
{
|
|||
|
var _data = json.ContainsKey("data") ? json["data"] as ArrayList : null;
|
|||
|
if (_data == null) return;
|
|||
|
|
|||
|
for (int i = 0; i < _data.Count; i++)
|
|||
|
{
|
|||
|
var item = _data[i] as Dictionary<string, object>;
|
|||
|
var f = new WorkFriendInfo();
|
|||
|
f.avatar = item["avatar"]?.ToString();
|
|||
|
f.conversation_id = item["conversation_id"]?.ToString();
|
|||
|
//f.desc = item["desc"]?.ToString();
|
|||
|
f.nickname = item["nickname"]?.ToString();
|
|||
|
f.position = item["position"]?.ToString();
|
|||
|
f.realname = item["realname"]?.ToString();
|
|||
|
f.remark = item["remark"]?.ToString();
|
|||
|
f.sex = int.Parse(item["sex"]?.ToString());
|
|||
|
f.user_id = item["user_id"]?.ToString();
|
|||
|
f.username = item["username"]?.ToString();
|
|||
|
|
|||
|
//var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
//if (user == null)
|
|||
|
// return;
|
|||
|
|
|||
|
var friend = user.WorkFriends.FirstOrDefault(z => z.user_id == f.user_id);
|
|||
|
if (friend == null)
|
|||
|
user.WorkFriends.Add(f);
|
|||
|
}
|
|||
|
}
|
|||
|
#region xx
|
|||
|
//var nmss = new List<List<WorkFriendInfo>>();
|
|||
|
//var mis = new List<WorkFriendInfo>();
|
|||
|
//var count = 40;
|
|||
|
//var rem = _data.Count % count;
|
|||
|
//var num = _data.Count / count;
|
|||
|
|
|||
|
//for (int i = 0; i < _data.Count; i++)
|
|||
|
//{
|
|||
|
// var item = _data[i] as Dictionary<string, object>;
|
|||
|
// var f = new WorkFriendInfo();
|
|||
|
|
|||
|
// f.avatar = item["avatar"]?.ToString();
|
|||
|
// f.conversation_id = item["conversation_id"]?.ToString();
|
|||
|
// f.corp_id = item["corp_id"]?.ToString();
|
|||
|
// f.desc = item["desc"]?.ToString();
|
|||
|
// f.external_job = item["external_job"]?.ToString();
|
|||
|
// f.nickname = item["nickname"]?.ToString();
|
|||
|
// f.position = item["position"]?.ToString();
|
|||
|
// f.realname = item["realname"]?.ToString();
|
|||
|
// f.remark = item["remark"]?.ToString();
|
|||
|
// f.sex = int.Parse(item["sex"]?.ToString());
|
|||
|
// f.nickname = item["username"]?.ToString();
|
|||
|
// f.user_id = item["user_id"]?.ToString();
|
|||
|
|
|||
|
// //f.manager_wxid = item["manager_wxid"]?.ToString();
|
|||
|
// //f.is_manager = int.Parse(item["is_manager"].ToString());
|
|||
|
|
|||
|
// mis.Add(f);
|
|||
|
// if (mis.Count >= count)
|
|||
|
// {
|
|||
|
// nmss.Add(mis);
|
|||
|
// mis = new List<WorkFriendInfo>();
|
|||
|
// }
|
|||
|
// else if (nmss.Count == num && mis.Count == rem)
|
|||
|
// {
|
|||
|
// nmss.Add(mis);
|
|||
|
// }
|
|||
|
//}
|
|||
|
//var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
//if (user == null) return;
|
|||
|
//var socketClient = EasySoc.GetSocket();
|
|||
|
//foreach (var item in nmss)
|
|||
|
//{
|
|||
|
// var msg = new WorkWechatContactList();
|
|||
|
// msg.RobotUsername = user.Wxid;
|
|||
|
// msg.RobotUsernick = user.Nickname;
|
|||
|
// msg.RobotType = RobotType.客户端企业微信;
|
|||
|
|
|||
|
// msg.Cmd = PCRobotCMD.rcvContactList_workWeChat;
|
|||
|
// msg.Message = HttpHelper.ObjectToJson(new Dictionary<string, List<WorkFriendInfo>>() { { "data", item } });
|
|||
|
|
|||
|
// socketClient.Send(msg);
|
|||
|
// Thread.Sleep(5);
|
|||
|
//}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|
|||
|
catch { }
|
|||
|
finally
|
|||
|
{
|
|||
|
user.IsGetFriend = false;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_GET_ROOMS_MSG:// 获取群聊列表
|
|||
|
{
|
|||
|
//{"data":[{"conversation_id":"R:1970325073072411","create_user_id":"1688853956450720","is_manager":0,"nickname":"成都秒单客网络科技有限公司","total":5},{"conversation_id":"R:10696053211008104","create_user_id":"1688853956558440","is_manager":1,"nickname":"吴嘉华、18、17","total":3}],"type":11038}
|
|||
|
|
|||
|
if (data == null)
|
|||
|
{
|
|||
|
lock (Friend_Lock)
|
|||
|
{
|
|||
|
var _data = json.ContainsKey("data") ? json["data"] as ArrayList : null;
|
|||
|
if (_data == null) return;
|
|||
|
|
|||
|
var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (user == null)
|
|||
|
return;
|
|||
|
|
|||
|
for (int i = 0; i < _data.Count; i++)
|
|||
|
{
|
|||
|
var item = _data[i] as Dictionary<string, object>;
|
|||
|
var f = new WorkFriendInfo();
|
|||
|
|
|||
|
f.avatar = string.Empty;
|
|||
|
f.user_id = item["conversation_id"]?.ToString();
|
|||
|
f.manager_wxid = item["create_user_id"]?.ToString();
|
|||
|
f.is_manager = int.Parse(item["is_manager"]?.ToString());
|
|||
|
f.nickname = item["nickname"]?.ToString();
|
|||
|
f.username = item["nickname"]?.ToString();
|
|||
|
f.remark = item["nickname"]?.ToString();
|
|||
|
|
|||
|
f.manager_wxid = item["create_user_id"]?.ToString();
|
|||
|
f.is_manager = int.Parse(item["is_manager"]?.ToString());
|
|||
|
|
|||
|
var friend = user.WorkFriends.FirstOrDefault(z => z.user_id == f.user_id);
|
|||
|
if (friend == null)
|
|||
|
user.WorkFriends.Add(f);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_GET_USER_DETAIL_MSG:// 获取用户详细信息
|
|||
|
{
|
|||
|
//{"data":{"avatar":"http://wx.qlogo.cn/mmhead/GPyw0pGicibl4KQicb5bXGu2SibrykeGOH5IicK2d8LTfbA11zNB2A2SoKg/0","conversation_id":"S:1688853956558440_7881301364988874","desc":"","nickname":"","position":"","realname":"","remark":"","sex":2,"user_id":"7881301364988874","username":"18"},"type":11039} 获取到用户数据
|
|||
|
//{"data":{"user_id":"7881302447012216"},"type":11039} 获取的用户不存在
|
|||
|
if (!data.ContainsKey("conversation_id")) return;
|
|||
|
lock (Friend_Lock)
|
|||
|
{
|
|||
|
var f = new WorkFriendInfo();
|
|||
|
f.avatar = data["avatar"]?.ToString();
|
|||
|
f.conversation_id = data["conversation_id"]?.ToString();
|
|||
|
if (data.ContainsKey("desc"))
|
|||
|
f.desc = data["desc"]?.ToString();
|
|||
|
else
|
|||
|
f.desc = string.Empty;
|
|||
|
f.nickname = data["nickname"]?.ToString();
|
|||
|
f.position = data["position"]?.ToString();
|
|||
|
f.realname = data["realname"]?.ToString();
|
|||
|
f.remark = data["remark"]?.ToString();
|
|||
|
f.sex = int.Parse(data["sex"]?.ToString());
|
|||
|
f.user_id = data["user_id"]?.ToString();
|
|||
|
f.username = data["username"]?.ToString();
|
|||
|
|
|||
|
var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (user == null)
|
|||
|
return;
|
|||
|
|
|||
|
var friend = user.WorkFriends.FirstOrDefault(z => z.user_id == f.user_id);
|
|||
|
if (friend != null)
|
|||
|
if (!user.WorkFriends.TryTake(out friend)) return;
|
|||
|
user.WorkFriends.Add(f);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_GET_ROOM_MEMBERS_MSG:// 获取群成员列表
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
#region 数据样式
|
|||
|
/*
|
|||
|
{"data":{"conversation_id":"R:10696053211008104","member_list":[{"avatar":"https://wework.qpic.cn/bizmail/FxrNrXCeEh8Kwv4ia3iahWCbkR7Y0VqoBnGSHAyhDIefRGkL7tT76SsA/0","conversation_id":"S:1688853956558440_1688853956558440","desc":"","nickname":"","position":"","realname":"吴嘉华","remark":"","sex":1,"user_id":"1688853956558440","username":"吴嘉华"},{"avatar":"http://wx.qlogo.cn/mmhead/GPyw0pGicibl4KQicb5bXGu2SibrykeGOH5IicK2d8LTfbA11zNB2A2SoKg/0","conversation_id":"S:1688853956558440_7881301364988874","desc":"","nickname":"","position":"","realname":"","remark":"","sex":2,"user_id":"7881301364988874","username":"18"},{"avatar":"http://wx.qlogo.cn/mmhead/0T8yO33zeeg33jJCQibIWobapj6GX4xFBbOECtmG9VdkYpnzyiaUr5iag/0","conversation_id":"S:1688853956558440_7881301610989604","desc":"","nickname":"","position":"","realname":"","remark":"","sex":0,"user_id":"7881301610989604","username":"17"}]},"type":11040}
|
|||
|
|
|||
|
{"data":{"conversation_id":"R:1970325073072411","member_list":[{"avatar":"http://wework.qpic.cn/bizmail/UBH52fian6zLyTQm2YeWIEonTIT0snwXSojzt7AjPbWk0CBqbRBtshA/0","conversation_id":"S:1688853956558440_1688853956450720","desc":"","nickname":"","position":"","realname":"聂红利","remark":"","sex":1,"user_id":"1688853956450720","username":"千年老妖"},{"avatar":"https://wework.qpic.cn/bizmail/FxrNrXCeEh8Kwv4ia3iahWCbkR7Y0VqoBnGSHAyhDIefRGkL7tT76SsA/0","conversation_id":"S:1688853956558440_1688853956558440","desc":"","nickname":"","position":"","realname":"吴嘉华","remark":"","sex":1,"user_id":"1688853956558440","username":"吴嘉华"},{"avatar":"http://wework.qpic.cn/bizmail/AU8vqVRBac5HFiaTI2qxv3RNr8Kib0wFyicBQZkvs06ayzBhlHE7dCAmA/0","conversation_id":"S:1688853956558440_1688853956589484","desc":"","nickname":"","position":"","realname":"","remark":"","sex":2,"user_id":"1688853956589484","username":"白龙马"},{"avatar":"http://p.qpic.cn/wwhead/duc2TvpEgSTPk74IwG7Bs8GzMNxjerMmg94LwYswvGEoKMZcpTicE7vkLsDwGdh8BcVJLibuGFXbc/0","conversation_id":"S:1688853956558440_10977528187716586","desc":"","nickname":"","position":"","realname":"","remark":"","sex":1,"user_id":"10977528187716586","username":"嘿嘿"},{"avatar":"http://p.qpic.cn/wwhead/duc2TvpEgSTPk74IwG7Bs8GzMNxjerMmg94LwYswvGEoKMZcpTicE7vkLsDwGdh8BcVJLibuGFXbc/0","conversation_id":"S:1688853956558440_10977528187716587","desc":"","nickname":"","position":"","realname":"","remark":"","sex":1,"user_id":"10977528187716587","username":"测试机器人"}]},"type":11040}
|
|||
|
*/
|
|||
|
#endregion
|
|||
|
|
|||
|
lock (Friend_Lock)
|
|||
|
{
|
|||
|
//{"data":{"conversation_id":"R:10696053211018728","member_list":[{"acctid":"WuJiaHua","avatar":"http://wework.qpic.cn/bizmail/FxrNrXCeEh8Kwv4ia3iahWCbkR7Y0VqoBniaJ5hrlKggVaibBXIxmOBb8A/0","corp_id":"1970325073072411","invite_user_id":"1688853956558440","nickname":"洪荒老道","position":"","realname":"吴嘉华","remark":"","sex":1,"user_id":"1688853956558440","username":"洪荒老道"},{"acctid":"","avatar":"http://wx.qlogo.cn/mmhead/FrdAUicrPIibe0Dd7mWcTkmSz8GHQp6YWcVzd4g62zicVnTPGI3G9S5vA/0","corp_id":"1970325134026788","invite_user_id":"1688853956558440","nickname":"","position":"","realname":"","remark":"ID3110-。/V1/T1/i1","sex":0,"user_id":"7881301536005932","username":"摸鱼樊"},{"acctid":"","avatar":"http://wx.qlogo.cn/mmhead/0T8yO33zeeg33jJCQibIWobapj6GX4xFBbOECtmG9VdkYpnzyiaUr5iag/0","corp_id":"1970325134026788","invite_user_id":"1688853956558440","nickname":"","position":"","realname":"","remark":"","sex":2,"user_id":"7881301610989604","username":"17"},{"acctid":"","avatar":"http://wx.qlogo.cn/mmhead/Q3auHgzwzM5qa6vY8BQAoN1ViclaTAFFuknicOeMHNluZcXyTQLUrKKg/0","corp_id":"1970325134026788","invite_user_id":"1688853956558440","nickname":"","position":"","realname":"","remark":"21","sex":2,"user_id":"7881302484994318","username":"、"},{"acctid":"","avatar":"http://wx.qlogo.cn/mmhead/ibhzWy4ibIEpCGTLwEuhBf4rqKAvx4bXHicib6uWPaZrtGtRPtv8UrUgSQ/0","corp_id":"1970325134026788","invite_user_id":"1688853956558440","nickname":"","position":"","realname":"","remark":"E-b-Coco-▲-Υ-","sex":0,"user_id":"7881303377020975","username":"Coco"}]},"type":11040}
|
|||
|
|
|||
|
var conversation_id = data["conversation_id"].ToString();
|
|||
|
|
|||
|
//var username = data["username"].ToString();
|
|||
|
var member_list = data["member_list"] as ArrayList;
|
|||
|
if (member_list == null) return;
|
|||
|
|
|||
|
var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
if (user == null)
|
|||
|
return;
|
|||
|
|
|||
|
var group = user.WorkGroups.FirstOrDefault(z => z.conversation_id == conversation_id);
|
|||
|
if (group == null)
|
|||
|
{
|
|||
|
group = new WorkGroupInfo() { conversation_id = conversation_id, total = member_list.Count, friends = new List<WorkFriendInfo>() };
|
|||
|
user.WorkGroups.Add(group);
|
|||
|
}
|
|||
|
else
|
|||
|
group.total = member_list.Count;
|
|||
|
for (int i = 0; i < member_list.Count; i++)
|
|||
|
{
|
|||
|
//{"account":"","avatar":"http://wx.qlogo.cn/mmhead/ver_1/klibauQfLYtmfniaYAzsV9l6V4cSHmdDhniaTmJ6aGo0z035JTkB5QWrOUbAPnJnP4YXTMuKKmwNBMNv2Fbj5ia9icNicYeXGXbbsRiagGFKryASro/132","city":"","country":"","nickname":"陈建","province":"","remark":"","sex":0,"wxid":"wxid_e1j30jf2k5zdk022"}
|
|||
|
|
|||
|
//{"avatar":"http://wework.qpic.cn/bizmail/UBH52fian6zLyTQm2YeWIEonTIT0snwXSojzt7AjPbWk0CBqbRBtshA/0","conversation_id":"S:1688853956558440_1688853956450720","desc":"","nickname":"","position":"","realname":"利","remark":"","sex":1,"user_id":"1688853956450720","username":"千妖"}
|
|||
|
|
|||
|
var item = member_list[i] as Dictionary<string, object>;
|
|||
|
|
|||
|
var f = new WorkFriendInfo();
|
|||
|
|
|||
|
f.avatar = item["avatar"]?.ToString();
|
|||
|
f.conversation_id = conversation_id;
|
|||
|
//f.corp_id = item["corp_id"]?.ToString();
|
|||
|
//f.desc = item["desc"]?.ToString();
|
|||
|
//f.external_job = item["external_job"]?.ToString();
|
|||
|
f.nickname = item["nickname"]?.ToString();
|
|||
|
f.position = item["position"]?.ToString();
|
|||
|
f.realname = item["realname"]?.ToString();
|
|||
|
f.remark = item["remark"]?.ToString();
|
|||
|
f.sex = int.Parse(item["sex"]?.ToString());
|
|||
|
f.nickname = item["username"]?.ToString();
|
|||
|
f.user_id = item["user_id"]?.ToString();
|
|||
|
|
|||
|
var friend = group.friends.FirstOrDefault(z => z.user_id == f.user_id);
|
|||
|
if (friend == null)
|
|||
|
group.friends.Add(f);
|
|||
|
}
|
|||
|
}
|
|||
|
#region xx
|
|||
|
//var nmss = new List<List<WorkFriendInfo>>();
|
|||
|
//var mis = new List<WorkFriendInfo>();
|
|||
|
//var count = 20;
|
|||
|
//var rem = member_list.Count % count;
|
|||
|
//var num = member_list.Count / count;
|
|||
|
|
|||
|
//for (int i = 0; i < member_list.Count; i++)
|
|||
|
//{
|
|||
|
// //{"account":"","avatar":"http://wx.qlogo.cn/mmhead/ver_1/klibauQfLYtmfniaYAzsV9l6V4cSHmdDhniaTmJ6aGo0z035JTkB5QWrOUbAPnJnP4YXTMuKKmwNBMNv2Fbj5ia9icNicYeXGXbbsRiagGFKryASro/132","city":"","country":"","nickname":"陈建","province":"","remark":"","sex":0,"wxid":"wxid_e1j30jf2k5zdk022"}
|
|||
|
|
|||
|
// //{"avatar":"http://wework.qpic.cn/bizmail/UBH52fian6zLyTQm2YeWIEonTIT0snwXSojzt7AjPbWk0CBqbRBtshA/0","conversation_id":"S:1688853956558440_1688853956450720","desc":"","nickname":"","position":"","realname":"聂红利","remark":"","sex":1,"user_id":"1688853956450720","username":"千年老妖"}
|
|||
|
|
|||
|
// var item = member_list[i] as Dictionary<string, object>;
|
|||
|
|
|||
|
// var f = new WorkFriendInfo();
|
|||
|
|
|||
|
// f.avatar = item["avatar"]?.ToString();
|
|||
|
// f.conversation_id = item["conversation_id"]?.ToString();
|
|||
|
// //f.corp_id = item["corp_id"]?.ToString();
|
|||
|
// f.desc = item["desc"]?.ToString();
|
|||
|
// //f.external_job = item["external_job"]?.ToString();
|
|||
|
// f.nickname = item["nickname"]?.ToString();
|
|||
|
// f.position = item["position"]?.ToString();
|
|||
|
// f.realname = item["realname"]?.ToString();
|
|||
|
// f.remark = item["remark"]?.ToString();
|
|||
|
// f.sex = int.Parse(item["sex"]?.ToString());
|
|||
|
// f.nickname = item["username"]?.ToString();
|
|||
|
// f.user_id = item["user_id"]?.ToString();
|
|||
|
|
|||
|
// mis.Add(f);
|
|||
|
// if (mis.Count >= count)
|
|||
|
// {
|
|||
|
// nmss.Add(mis);
|
|||
|
// mis = new List<WorkFriendInfo>();
|
|||
|
// }
|
|||
|
// else if (nmss.Count == num && mis.Count == rem)
|
|||
|
// {
|
|||
|
// nmss.Add(mis);
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
//var socketClient = EasySoc.GetSocket();
|
|||
|
//var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY);
|
|||
|
//if (user == null) return;
|
|||
|
//foreach (var item in nmss)
|
|||
|
//{
|
|||
|
// var msg = new WorkWechatGroupMember();
|
|||
|
// msg.RobotUsername = user.Wxid;
|
|||
|
// msg.RobotUsernick = user.Nickname;
|
|||
|
// msg.RobotType = RobotType.客户端微信;
|
|||
|
|
|||
|
// msg.Cmd = PCRobotCMD.rcvGroupMember_workWeChat;
|
|||
|
|
|||
|
// var g = new WorkGroupInfo();
|
|||
|
// g.conversation_id = conversation_id;
|
|||
|
// g.member_list = item;
|
|||
|
// msg.Message = HttpHelper.ObjectToJson(new Dictionary<string, WorkGroupInfo>() { { "data", g } });
|
|||
|
|
|||
|
// socketClient.Send(msg);
|
|||
|
// Thread.Sleep(5);
|
|||
|
//}
|
|||
|
#endregion
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case MsgType.MT_ROOM_ADD_MEMBER_NOTIFY_MSG://群成员新增通知
|
|||
|
{
|
|||
|
if (data == null) return;
|
|||
|
|
|||
|
var memberList = data["member_list"] as ArrayList;
|
|||
|
if (memberList == null || memberList.Count == 0) return;
|
|||
|
|
|||
|
var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie);
|
|||
|
if (user == null)
|
|||
|
return;
|
|||
|
|
|||
|
var client = WechatClient.GetApi(user) as Wechat_Xiaoxie_QY;
|
|||
|
|
|||
|
var socketClient = EasySoc.GetSocket();
|
|||
|
//var avatar = data["avatar"].ToString();//头像
|
|||
|
//var is_manager = data["is_manager"].ToString();//
|
|||
|
//var manager_wxid = data["manager_wxid"].ToString();//管理账号
|
|||
|
//var room_nick = data["nickname"].ToString();//群昵称
|
|||
|
//var room_wxid = data["room_wxid"].ToString();//群账号
|
|||
|
//var total_member = int.Parse(data["total_member"].ToString());//群人数
|
|||
|
|
|||
|
//var member_list = data["member_list"] as ArrayList;
|
|||
|
//if (member_list != null && member_list.Count != 0)
|
|||
|
//{
|
|||
|
// var member = member_list[0] as Dictionary<string, object>;
|
|||
|
// var avatar_user = member["avatar"].ToString();//头像
|
|||
|
// var invite_by = member["invite_by"].ToString();//邀请者wxid
|
|||
|
// var nickname = member["nickname"].ToString();//新用户昵称
|
|||
|
// var wxid = member["wxid"].ToString();//新用户账号
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// WechatNewMemer newMember = new WechatNewMemer();
|
|||
|
// newMember.Cmd = PCRobotCMD.newMember;
|
|||
|
// newMember.RobotType = RobotType.客户端微信;
|
|||
|
// newMember.RobotUsername = user.Wxid;
|
|||
|
// newMember.RobotUsernick = user.Nickname;
|
|||
|
|
|||
|
// newMember.SourceNick = string.Empty;
|
|||
|
// newMember.SourceName = (string.IsNullOrWhiteSpace(invite_by) || invite_by == user.Wxid) ? string.Empty : invite_by;
|
|||
|
// newMember.MemberNick = nickname;
|
|||
|
// newMember.MemberName = wxid;
|
|||
|
// newMember.GroupId = room_wxid;
|
|||
|
// newMember.GroupNick = room_nick;
|
|||
|
// newMember.TotalMember = total_member;
|
|||
|
|
|||
|
// socketClient.Send(newMember);
|
|||
|
//}
|
|||
|
//op_user_id 邀请用户的昵称
|
|||
|
//op_user_name 邀请用户的账号
|
|||
|
var room_conversation_id = data["room_conversation_id"]?.ToString();
|
|||
|
var room_name = data["room_name"]?.ToString();
|
|||
|
var op_user_name = data["op_user_name"]?.ToString();
|
|||
|
var op_user_id = data["op_user_id"]?.ToString();
|
|||
|
|
|||
|
for (int i = 0; i < memberList.Count; i++)
|
|||
|
{
|
|||
|
var item = memberList[i] as Dictionary<string, object>;
|
|||
|
|
|||
|
WechatNewMemer newMember = new WechatNewMemer();
|
|||
|
newMember.Cmd = PCRobotCMD.newMember_workWeChat;
|
|||
|
newMember.RobotType = RobotType.客户端企业微信;
|
|||
|
newMember.RobotUsername = user.Wxid;
|
|||
|
newMember.RobotUsernick = user.Nickname;
|
|||
|
|
|||
|
newMember.SourceNick = op_user_name;
|
|||
|
newMember.SourceName = op_user_id;
|
|||
|
newMember.MemberNick = item["name"]?.ToString(); ;
|
|||
|
newMember.MemberName = item["user_id"]?.ToString(); ;
|
|||
|
newMember.GroupId = room_conversation_id;
|
|||
|
newMember.GroupNick = room_name;
|
|||
|
newMember.TotalMember = 0;
|
|||
|
|
|||
|
socketClient.Send(newMember);
|
|||
|
Thread.Sleep(50);
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
//Console.WriteLine("解析消息异常:" + ex.Message + "," + recvData);
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + ".._" + recvData);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "_.");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static ConcurrentDictionary<string, FriendInfo> FriendRequestRecord = new ConcurrentDictionary<string, FriendInfo>();
|
|||
|
|
|||
|
private static void WxCloseCallback(uint dwClientId)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var v = WechatClient.Users.FirstOrDefault(f => f.Value.DwClientId == dwClientId && f.Value.Type == WechatType.Xiaoxie_QY).Value;
|
|||
|
if (v != null)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Info("系统", $"WxCloseCallbackQY关闭回调,Uin:{v.Uin},微信:{v.Nickname}({v.Wxid})");
|
|||
|
WechatClient.RemoveUser(v);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "_.-");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
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 GetFriend(string wxid)
|
|||
|
//{
|
|||
|
// try
|
|||
|
// {
|
|||
|
// var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_USER_DETAIL_MSG, data = new { user_id = wxid } });
|
|||
|
// SendWxWorkData(User.DwClientId, json);
|
|||
|
// }
|
|||
|
// catch (Exception ex)
|
|||
|
// {
|
|||
|
// LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message);
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
//public override void GetGroupMemer(string groupId)
|
|||
|
//{
|
|||
|
// try
|
|||
|
// {
|
|||
|
// var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_ROOM_MEMBERS_MSG, data = new { conversation_id = groupId } });
|
|||
|
// SendWxWorkData(User.DwClientId, json);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// }
|
|||
|
// catch (Exception ex)
|
|||
|
// {
|
|||
|
// LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message);
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
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 + "//");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static void WxAcceptCallback(uint dwClientId)
|
|||
|
{
|
|||
|
Console.WriteLine("注入成功:" + dwClientId);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 启动微信
|
|||
|
/// </summary>
|
|||
|
/// <param name="FileName"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public static uint StartWechat(bool isError = false)
|
|||
|
{
|
|||
|
InitPc();
|
|||
|
|
|||
|
var WechatWinFile = HttpExtend.MapFile("WXWork.exe", $"WXWork\\{Version}");
|
|||
|
var md5 = Common.GetMD5Hash(WechatWinFile).ToUpper();
|
|||
|
if (!File.Exists(WechatWinFile) || md5 != PcMd5.ToUpper())
|
|||
|
{
|
|||
|
if (isError) throw new Exception("易转发客户端企业微信版本不支持,请登录易转发端手动处理");
|
|||
|
var _rst = MessageBox.Show("您的企业微信版本暂时不支持,立即重新安装吗?", "版本不兼容", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
|
|||
|
if (_rst == DialogResult.Yes)
|
|||
|
{
|
|||
|
var f = new WechatUpdate(Version);
|
|||
|
f.ShowDialog();
|
|||
|
if (!f.IsOk) return 0;
|
|||
|
}
|
|||
|
else return 0;
|
|||
|
}
|
|||
|
// 注入并多开
|
|||
|
//return InjectWxWork(Encoding.UTF8.GetBytes(DllPath), Encoding.UTF8.GetBytes(""));
|
|||
|
|
|||
|
var path = HttpExtend.MapFile("WXWork.exe", $"WXWork\\{Version}");
|
|||
|
LogHelper.GetSingleObj().Debug("注入前", $"DPath = {DllPath},Path = {path}");
|
|||
|
return InjectWxWorkMultiOpen(Encoding.UTF8.GetBytes(DllPath), Encoding.UTF8.GetBytes(path));
|
|||
|
}
|
|||
|
|
|||
|
#region 内部类
|
|||
|
public enum MsgType : ushort
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 接口准备完毕
|
|||
|
/// </summary>
|
|||
|
MT_APP_READY_MSG = 11024,
|
|||
|
/// <summary>
|
|||
|
/// 参数错误提示
|
|||
|
/// </summary>
|
|||
|
MT_PARAMS_ERROR_MSG = 11025,
|
|||
|
/// <summary>
|
|||
|
/// 登录消息
|
|||
|
/// </summary>
|
|||
|
MT_USER_LOGIN = 11026,
|
|||
|
/// <summary>
|
|||
|
/// 注销消息
|
|||
|
/// </summary>
|
|||
|
MT_USER_LOGOUT = 11027,
|
|||
|
/// <summary>
|
|||
|
/// 登录二维码
|
|||
|
/// </summary>
|
|||
|
MT_LOGIN_QRCODE_MSG = 11028,
|
|||
|
/// <summary>
|
|||
|
/// 发送文本消息
|
|||
|
/// </summary>
|
|||
|
MT_SEND_TEXT_MSG = 11029,
|
|||
|
/// <summary>
|
|||
|
/// 发送图片消息
|
|||
|
/// </summary>
|
|||
|
MT_SEND_IMAGE_MSG = 11030,
|
|||
|
/// <summary>
|
|||
|
/// 发送文件消息
|
|||
|
/// </summary>
|
|||
|
MT_SEND_FILE_MSG = 11031,
|
|||
|
/// <summary>
|
|||
|
/// 发送目录消息
|
|||
|
/// </summary>
|
|||
|
MT_SEND_FOLDER_MSG = 11032,
|
|||
|
/// <summary>
|
|||
|
/// 发送链接消息
|
|||
|
/// </summary>
|
|||
|
MT_SEND_LINK_MSG = 11033,
|
|||
|
/// <summary>
|
|||
|
/// 发送个人名片
|
|||
|
/// </summary>
|
|||
|
MT_SEND_PERSON_CARD_MSG = 11034,
|
|||
|
/// <summary>
|
|||
|
/// 获取自己信息
|
|||
|
/// </summary>
|
|||
|
MT_GET_OWNER_INFO_MSG = 11035,
|
|||
|
/// <summary>
|
|||
|
/// 获取内部联系人列表
|
|||
|
/// </summary>
|
|||
|
MT_GET_INNER_USERS_MSG = 11036,
|
|||
|
/// <summary>
|
|||
|
/// 获取外部联系列表
|
|||
|
/// </summary>
|
|||
|
MT_GET_EXTERNAL_USERS_MSG = 11037,
|
|||
|
/// <summary>
|
|||
|
/// 获取群聊列表
|
|||
|
/// </summary>
|
|||
|
MT_GET_ROOMS_MSG = 11038,
|
|||
|
/// <summary>
|
|||
|
/// 获取用户详细信息
|
|||
|
/// </summary>
|
|||
|
MT_GET_USER_DETAIL_MSG = 11039,
|
|||
|
/// <summary>
|
|||
|
/// 获取群成员列表
|
|||
|
/// </summary>
|
|||
|
MT_GET_ROOM_MEMBERS_MSG = 11040,
|
|||
|
/// <summary>
|
|||
|
/// 接收文本消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_TEXT_MSG = 11041,
|
|||
|
/// <summary>
|
|||
|
/// 接收图片消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_IMG_MSG = 11042,
|
|||
|
/// <summary>
|
|||
|
/// 接收视频消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_VIDEO_MSG = 11043,
|
|||
|
/// <summary>
|
|||
|
/// 接收语音消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_VOICE_MSG = 11044,
|
|||
|
/// <summary>
|
|||
|
/// 接收文件消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_FILE_MSG = 11045,
|
|||
|
/// <summary>
|
|||
|
/// 接收位置消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_LOCATION_MSG = 11046,
|
|||
|
/// <summary>
|
|||
|
/// 接收链接消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_LINK_CARD_MSG = 11047,
|
|||
|
/// <summary>
|
|||
|
/// 接收表情消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_EMOTION_MSG = 11048,
|
|||
|
/// <summary>
|
|||
|
/// 接收红包消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_RED_PACKET_MSG = 11049,
|
|||
|
/// <summary>
|
|||
|
/// 接收个人名片消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_PERSON_CARD_MSG = 11050,
|
|||
|
/// <summary>
|
|||
|
/// 接收其他未解析消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_OTHER_MSG = 11051,
|
|||
|
/// <summary>
|
|||
|
/// 查询联系人
|
|||
|
/// </summary>
|
|||
|
MT_SEARCH_USER_MSG = 11052,
|
|||
|
/// <summary>
|
|||
|
/// 添加查询的联系人
|
|||
|
/// </summary>
|
|||
|
MT_ADD_SEARCH_USER_MSG = 11053,
|
|||
|
/// <summary>
|
|||
|
/// 修改用户备注
|
|||
|
/// </summary>
|
|||
|
MT_MODIFY_USER_REMARK_MSG = 11054,
|
|||
|
/// <summary>
|
|||
|
/// 修改用户描述
|
|||
|
/// </summary>
|
|||
|
MT_MODIFY_USER_DESC_MSG = 11055,
|
|||
|
/// <summary>
|
|||
|
/// 修改外部联系人手机号
|
|||
|
/// </summary>
|
|||
|
MT_MODIFY_EXTERNAl_USER_PHONES_MSG = 11056,
|
|||
|
/// <summary>
|
|||
|
/// 修改外部联系人公司
|
|||
|
/// </summary>
|
|||
|
MT_MODIFY_EXTERNAl_USER_COMPANY_MSG = 11057,
|
|||
|
/// <summary>
|
|||
|
/// 创建群聊
|
|||
|
/// </summary>
|
|||
|
MT_CREATE_ROOM_MSG = 11058,
|
|||
|
/// <summary>
|
|||
|
/// 修改群名
|
|||
|
/// </summary>
|
|||
|
MT_MODIFY_ROOM_NAME_MSG = 11059,
|
|||
|
/// <summary>
|
|||
|
/// 添加群成员
|
|||
|
/// </summary>
|
|||
|
MT_ROOM_ADD_MEMBERS_MSG = 11060,
|
|||
|
/// <summary>
|
|||
|
/// 删除群成员
|
|||
|
/// </summary>
|
|||
|
MT_ROOM_DEL_MEMBERS_MSG = 11061,
|
|||
|
/// <summary>
|
|||
|
/// 接收好友请求
|
|||
|
/// </summary>
|
|||
|
MT_RECV_FRIEND_REQUEST = 11063,
|
|||
|
/// <summary>
|
|||
|
/// 接受加好友请求
|
|||
|
/// </summary>
|
|||
|
MT_ACCEPT_FRIEND_REQUEST = 11064,
|
|||
|
/// <summary>
|
|||
|
/// 发送小程序
|
|||
|
/// </summary>
|
|||
|
MT_SEND_MINI_PROGRAM_MSG = 11065,
|
|||
|
/// <summary>
|
|||
|
/// 接收到小程序
|
|||
|
/// </summary>
|
|||
|
MT_RECV_MINIAPP_MSG = 11066,
|
|||
|
/// <summary>
|
|||
|
/// 发送视频
|
|||
|
/// </summary>
|
|||
|
MT_SEND_VIDEO_MSG = 11067,
|
|||
|
/// <summary>
|
|||
|
/// 接收图文消息
|
|||
|
/// </summary>
|
|||
|
MT_RECV_IMAGE_TEXT_MSG = 11068,
|
|||
|
/// <summary>
|
|||
|
/// 发送群@消息
|
|||
|
/// </summary>
|
|||
|
MT_SEND_ROOM_AT_MSG = 11069,
|
|||
|
/// <summary>
|
|||
|
/// 发送动图(gif)消息
|
|||
|
/// </summary>
|
|||
|
MT_SEND_GIF_MSG = 11070,
|
|||
|
/// <summary>
|
|||
|
/// 添加群成员为联系人
|
|||
|
/// </summary>
|
|||
|
MT_ADD_ROOM_USER_MSG = 11071,
|
|||
|
/// <summary>
|
|||
|
/// 群成员新增通知
|
|||
|
/// </summary>
|
|||
|
MT_ROOM_ADD_MEMBER_NOTIFY_MSG = 11072,
|
|||
|
/// <summary>
|
|||
|
/// 剔除群成员通知
|
|||
|
/// </summary>
|
|||
|
MT_ROOM_DEL_MEMBER_NOTIFY_MSG = 11073,
|
|||
|
/// <summary>
|
|||
|
/// 新群通知
|
|||
|
/// </summary>
|
|||
|
MT_ROOM_CREATE_NOTIFY_MSG = 11074,
|
|||
|
/// <summary>
|
|||
|
/// 群成员主动退出通知
|
|||
|
/// </summary>
|
|||
|
MT_ROOM_MEMBER_QUIT_NOTIFY_MSG = 11075,
|
|||
|
/// <summary>
|
|||
|
/// 好友新增通知
|
|||
|
/// </summary>
|
|||
|
MT_CONTACT_ADD_NOITFY_MSG = 11076,
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
}
|
|||
|
}
|