This commit is contained in:
老道 2022-10-24 11:11:14 +08:00
parent ab73cf02a4
commit 52d0f7d923
6 changed files with 758 additions and 36 deletions

View File

@ -35,6 +35,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.Data.Helpers;
using Microsoft.Win32;
using UI.Framework.Controls;
using UI.Framework.Forms;
@ -394,7 +395,6 @@ namespace FLSystem.Forms
timerLok.Interval = 5 * 60000;//测试1分钟锁屏
timerLok.Start();
#region xxx
//TODO 禁用抖音禁用
//if (StartDy == "1")
@ -574,7 +574,7 @@ namespace FLSystem.Forms
System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += Timer_Elapsed;
timer.Interval = 40 * 60 * 1000;
//timer.Interval = 1000;
//timer.Interval = 1000 * 10;
timer.Start();
//下载黑名单
@ -961,7 +961,27 @@ namespace FLSystem.Forms
bool isinsert = user.id == 0 ? true : false;
session.SaveOrUpdate(user);
if (isinsert) EventClient.OnEvent(this, MethodType.);
if (isinsert)
{
try
{
var result = UserRobotUpLoad.CustomerLink_UpLoadRobot(new List<UserRobotUpLoad.CustomerRobotInput>()
{
new UserRobotUpLoad.CustomerRobotInput()
{
HeadUrl = string.Empty,
NickName = user.nick,
Remark = user.remark,
RobotType = UserRobotUpLoad.ConvertRobotType(user.type),
UserName = user.name
}
});
}
catch (Exception e)
{ }
EventClient.OnEvent(this, MethodType.);
}
}
}
catch { }
@ -1098,7 +1118,26 @@ namespace FLSystem.Forms
bool isinsert = user.id == 0 ? true : false;
session.SaveOrUpdate(user);
if (isinsert) EventClient.OnEvent(this, MethodType.);
if (isinsert)
{
try
{
var result = UserRobotUpLoad.CustomerLink_UpLoadRobot(new List<UserRobotUpLoad.CustomerRobotInput>()
{
new UserRobotUpLoad.CustomerRobotInput()
{
HeadUrl = string.Empty,
NickName = user.nick,
Remark = user.remark,
RobotType = UserRobotUpLoad.ConvertRobotType(user.type),
UserName = user.name
}
});
}
catch (Exception e)
{ }
EventClient.OnEvent(this, MethodType.);
}
}
}
catch { }
@ -2372,51 +2411,149 @@ namespace FLSystem.Forms
isrun = true;
try
{
var h = DateTime.Now.Hour; if (!(1 <= h && h < 3))
return;
try
{
var robots = ChatClient.WXClient.Values.Where(f => f.Status == WxStatus.线).ToList();
foreach (var robot in robots)
var h = DateTime.Now.Hour; if (!(1 <= h && h < 3))
return;
Console.WriteLine();
//没赋值的头像赋值
try
{
try
var robots = ChatClient.WXClient.Values.Where(f => f.Status == WxStatus.线).ToList();
foreach (var robot in robots)
{
var db = ApiClient.GetSession();
var members = db.Find<fl_member_info>("select * from fl_member_info where robot_name = @robotname and headurl = @headurl", new { robotname = robot.WeixinHao, headurl = "" });
var friends = robot.Friends;
foreach (var member in members)
try
{
if (friends != null && friends.ContainsKey(member.username))
var db = ApiClient.GetSession();
var members = db.Find<fl_member_info>("select * from fl_member_info where robot_name = @robotname and headurl = @headurl", new { robotname = robot.WeixinHao, headurl = "" });
var friends = robot.Friends;
foreach (var member in members)
{
var headurl = friends[member.username].BigHeadImgUrl;
if (!string.IsNullOrWhiteSpace(headurl))
if (friends != null && friends.ContainsKey(member.username))
{
member.headurl = friends[member.username].BigHeadImgUrl;
db.SaveOrUpdate(member);
}
}
else
{
var f = robot.GetContact(member.username);
if (f != null)
{
if (!string.IsNullOrWhiteSpace(f.BigHeadImgUrl))
var headurl = friends[member.username].BigHeadImgUrl;
if (!string.IsNullOrWhiteSpace(headurl))
{
member.headurl = f.BigHeadImgUrl;
member.headurl = friends[member.username].BigHeadImgUrl;
db.SaveOrUpdate(member);
}
}
else
{
var f = robot.GetContact(member.username);
if (f != null)
{
if (!string.IsNullOrWhiteSpace(f.BigHeadImgUrl))
{
member.headurl = f.BigHeadImgUrl;
db.SaveOrUpdate(member);
}
}
}
}
}
catch (Exception ex)
{ }
}
}
catch (Exception exception)
{ }
//上传用户/机器人信息
try
{
var db = ApiClient.GetSession();
var upload = db.FindSingle<fl_upload_record>("select * from fl_upload_record");
if (upload == null)
{
upload = new fl_upload_record();
var userNumber = db.Queryable<fl_member_info>().Count();
upload.usernumber = userNumber;
db.Saveable(upload).ExecuteCommand();
}
if (!upload.usersuccess)
{
var pageSize = 100;
while (upload.userindex * pageSize < upload.usernumber)
{
var members = db.Queryable<fl_member_info>().OrderBy(f => f.id).ToPageList(upload.userindex, pageSize);
List<UserRobotUpLoad.CustomerLinkInput> list = new List<UserRobotUpLoad.CustomerLinkInput>();
foreach (var item in members)
{
list.Add(new UserRobotUpLoad.CustomerLinkInput()
{
CreateTime = item.crt_time,
HeadUrl = item.headurl,
NickName = item.usernick,
Remark = item.remark,
RobotName = item.robot_name,
RobotType = UserRobotUpLoad.ConvertRobotType(item.robot_type),
UserName = item.username
});
}
if (list.Count > 0)
{
var result = UserRobotUpLoad.CustomerLink_UpLoadLink(list);
if (result.Ok)
{
db.Saveable(upload).ExecuteCommand();
}
}
upload.userindex++;
Thread.Sleep(1000);
}
if (upload.userindex * pageSize >= upload.usernumber)
{
upload.usersuccess = true;
db.Saveable(upload).ExecuteCommand();
}
}
catch (Exception ex)
{ }
if (!upload.robotsuccess)
{
try
{
var robots = db.Find<fl_robot_info>("select * from fl_robot_info");
List<UserRobotUpLoad.CustomerRobotInput> list = new List<UserRobotUpLoad.CustomerRobotInput>();
foreach (var item in robots)
{
list.Add(new UserRobotUpLoad.CustomerRobotInput()
{
HeadUrl = string.Empty,
NickName = item.nick,
Remark = item.remark,
RobotType = UserRobotUpLoad.ConvertRobotType(item.type),
UserName = item.name
});
}
if (list.Count > 0)
{
var result = UserRobotUpLoad.CustomerLink_UpLoadRobot(list);
if (result.Ok)
{
upload.robotsuccess = true;
}
}
}
catch (Exception ex)
{
upload.robotsuccess = false;
}
db.Saveable(upload).ExecuteCommand();
}
}
catch (Exception ex)
{
}
}
catch (Exception exception)
{ }
}
catch (Exception ex)
{ }

View File

@ -516,6 +516,7 @@
<Compile Include="Model\fl_ratio_info.cs" />
<Compile Include="Model\fl_suning_tgw.cs" />
<Compile Include="Model\fl_tb_relation.cs" />
<Compile Include="Model\fl_upload_record.cs" />
<Compile Include="Model\fl_uservariate_info.cs" />
<Compile Include="Model\fl_wechat_contacts.cs" />
<Compile Include="Model\fl_wechat_device.cs" />
@ -581,6 +582,7 @@
<Compile Include="Tools\HTTPClass.cs" />
<Compile Include="Tools\TBHelper.cs" />
<Compile Include="Tools\UpdateClient.cs" />
<Compile Include="Tools\UserRobotUpLoad.cs" />
<Compile Include="Tools\Util.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Tools\VariateReplace.cs" />

View File

@ -964,7 +964,25 @@ namespace Api.Framework
token = device,
remark = "PCWechat HOOK"
};
s.Insertable<fl_robot_info>(robot).ExecuteCommandIdentityIntoEntity();
robot = s.Insertable<fl_robot_info>(robot).ExecuteReturnEntity();
try
{
var result = UserRobotUpLoad.CustomerLink_UpLoadRobot(new List<UserRobotUpLoad.CustomerRobotInput>()
{
new UserRobotUpLoad.CustomerRobotInput()
{
HeadUrl = string.Empty,
NickName = robot.nick,
Remark = robot.remark,
RobotType = UserRobotUpLoad.ConvertRobotType(robot.type),
UserName = robot.name
}
});
}
catch (Exception e)
{ }
s.FindRobots(true);
}
else
@ -2406,6 +2424,12 @@ namespace Api.Framework
session.AddIndex<fl_suning_tgw>("username", "toolpid");
}
if (!session.TableExist<fl_upload_record>())
{
strb.AppendLine("fl_upload_record");
session.CreateTable<fl_upload_record>();
}
if (!session.TableExist<fl_bind_cache>())
{
strb.AppendLine("fl_bind_cache");

View File

@ -433,13 +433,44 @@ namespace Api.Framework.Model
var m = session.FindSingle<fl_member_info>("select * from fl_member_info where robot_type = @robot_type and username = @username", new { username = e.Username, robot_type = e.ChatType });
if (m == null)
{
m = new fl_member_info() { crt_time = DateTime.Now, usernick = e.NickName, realnick = e.RealNick, robot_name = e.RobotName, robot_type = e.ChatType, username = e.Username, upd_time = DateTime.Now, alipay_name = string.Empty, alipay_num = string.Empty, remark = string.Empty };
m = new fl_member_info()
{
crt_time = DateTime.Now,
usernick = e.NickName,
realnick = e.RealNick,
robot_name = e.RobotName,
robot_type = e.ChatType,
username = e.Username,
upd_time = DateTime.Now,
alipay_name = string.Empty,
alipay_num = string.Empty,
remark = string.Empty
};
var groups = session.FindGroups();
if (groups.Count == 0) throw new Exception("会员组未设置,请先设置会员组!");
if (!string.IsNullOrEmpty(e.RealNick)) m.realnick = e.RealNick;
if (!string.IsNullOrEmpty(e.Wechatid)) m.wechatid = e.Wechatid;
m.group_id = groups[0].id;
session.Insertable(m).ExecuteReturnEntity();
m = session.Insertable(m).ExecuteReturnEntity();
try
{
var result = UserRobotUpLoad.CustomerLink_UpLoadLink(new List<UserRobotUpLoad.CustomerLinkInput>()
{
new UserRobotUpLoad.CustomerLinkInput()
{
CreateTime = m.crt_time,
HeadUrl = m.headurl,
NickName = m.usernick,
Remark = m.remark,
RobotName = m.robot_name,
RobotType = UserRobotUpLoad.ConvertRobotType(m.robot_type),
UserName = m.username
}
});
}
catch (Exception ex)
{ }
}
else
{

View File

@ -0,0 +1,31 @@
using Api.Framework.Tools;
namespace Api.Framework.Model
{
/// <summary>
/// 数据是否上报成功
/// </summary>
public class fl_upload_record : base_model
{
/// <summary>
/// 用户当前的坐标
/// </summary>
public int userindex { get; set; }
/// <summary>
/// 用户数量
/// </summary>
public int usernumber { get; set; }
/// <summary>
/// 用户是否导入完成
/// </summary>
public bool usersuccess { get; set; } = false;
/// <summary>
/// 机器人是否完成
/// </summary>
public bool robotsuccess { get; set; } = false;
}
}

View File

@ -0,0 +1,497 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using Api.Framework.SDK;
using CsharpHttpHelper;
namespace Api.Framework.Tools
{
/// <summary>
/// 用户/机器人上传
/// </summary>
public class UserRobotUpLoad
{
/// <summary>
/// host
/// </summary>
public static readonly string host = "http://yzinterface.api.52cmg.cn/api/";
public static readonly int appkey = 334391396;
public static readonly string appsecret = "b924f8b944694cb8891bcfc7834dedb533436a3776de472cbde99577337902b2";
public static readonly string appAes = "EDC19B73FEB447929E187243777477913977AB2694394E5B9BC56CD05302C46B";
public static string UserToken { get; set; }
/// <summary>
/// 上传客户信息
/// </summary>
/// <param name="inputs"></param>
/// <returns></returns>
public static ServiceResult CustomerLink_UpLoadLink(List<CustomerLinkInput> inputs)
{
if (inputs == null || inputs.Count <= 0)
{
return new ServiceResult()
{
Ok = true
};
}
return HttpAes("CustomerLink/UpLoadLink", "post", inputs);
}
/// <summary>
/// 上传客户机器人信息
/// </summary>
/// <param name="inputs"></param>
/// <returns></returns>
public static ServiceResult CustomerLink_UpLoadRobot(List<CustomerRobotInput> inputs)
{
if (inputs == null || inputs.Count <= 0)
{
return new ServiceResult()
{
Ok = true
};
}
return HttpAes("CustomerLink/UpLoadRobot", "post", inputs);
}
/// <summary>
/// AES
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="api"></param>
/// <param name="method"></param>
/// <param name="postdata"></param>
/// <returns></returns>
private static ServiceResult<T> HttpAes<T>(string api, string method, object postdata = null)
{
try
{
var result = HttpResultAes(api, method, postdata);
if (result.StatusCode == HttpStatusCode.OK)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<ServiceResult<T>>(result.Html);
}
return new ServiceResult<T>(default(T))
{
Ok = false,
Message = result.Html,
};
}
catch (Exception e)
{
return new ServiceResult<T>(default(T))
{
Ok = false,
Message = e.ToString(),
};
}
}
/// <summary>
/// aes
/// </summary>
/// <param name="api"></param>
/// <param name="method"></param>
/// <param name="postdata"></param>
/// <returns></returns>
private static ServiceResult HttpAes(string api, string method, object postdata = null)
{
try
{
var result = HttpResultAes(api, method, postdata);
if (result.StatusCode == HttpStatusCode.OK)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<ServiceResult>(result.Html);
}
return new ServiceResult()
{
Ok = false,
Data = result.Html,
};
}
catch (Exception e)
{
return new ServiceResult()
{
Ok = false,
Data = e.ToString(),
};
}
}
/// <summary>
/// http aes
/// </summary>
/// <param name="api"></param>
/// <param name="method"></param>
/// <param name="postdata"></param>
/// <returns></returns>
private static HttpResult HttpResultAes(string api, string method, object postdata = null)
{
var data = Newtonsoft.Json.JsonConvert.SerializeObject(postdata);
var http = new HttpHelper();
HttpItem item = new HttpItem()
{
URL = host + api,
Method = method,
Timeout = 100000,
ReadWriteTimeout = 30000,
IsToLower = false,
Cookie = "",
UserAgent = "Server",
Accept = "text/html, application/xhtml+xml, */*",
ContentType = "application/json",
Referer = "",
Allowautoredirect = false,
AutoRedirectCookie = false,
Postdata = data,
PostEncoding = Encoding.UTF8,
//WebProxy = new WebProxy("127.0.0.1:8888")
};
var timespan = GetTimespan(DateTime.Now);/*DateTimeHelper.DateTimeToTimeStamp(DateTime.Now)*/;
item.Postdata = SecurityHelper.AesEncrypt(item.Postdata, appAes);
var sign = MD5ToString(Encrypt(item.Postdata + appkey + timespan, appsecret, false));
item.Header.Add("sign", sign);
item.Header.Add("timestamp", timespan + "");
item.Header.Add("appkey", appkey + "");
item.Header.Add("UserToken", UserToken);
var result = http.GetHtml(item);
return result;
}
/// <summary>
/// AES加密
/// </summary>
/// <param name="encryptStr">明文</param>
/// <param name="key">密钥</param>
/// <param name="isBase64">是否转为base64否的情况将采用16进制字符串</param>
/// <returns></returns>
public static string Encrypt(string encryptStr, string key, bool isBase64 = true, bool is32 = true)
{
byte[] keyArray = Encoding.UTF8.GetBytes(key.Substring(0, is32 ? 32 : 16));
byte[] toEncryptArray = Encoding.UTF8.GetBytes(encryptStr);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return isBase64
? Convert.ToBase64String(resultArray, 0, resultArray.Length)
: ByteArrayToHexString(resultArray);
}
/// <summary>
/// 将一个byte数组转换成16进制字符串
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private static string ByteArrayToHexString(byte[] data)
{
StringBuilder sb = new StringBuilder(data.Length * 3);
foreach (byte b in data)
{
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
}
return sb.ToString().ToUpper();
}
public static string MD5ToString(string text)
{
var retVal = new MD5CryptoServiceProvider().ComputeHash(Encoding.Default.GetBytes(text));
return string.Join("", retVal.Select(s => s.ToString("x2")));
}
/// <summary>
/// 时间戳(秒)
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static Int64 GetTimespan(DateTime dateTime)
{
TimeSpan ts = dateTime - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds);
}
/// <summary>
/// 加密解密帮助类
/// </summary>
public class SecurityHelper
{
#region AES加密解密
/// <summary>
/// 128位处理key
/// </summary>
/// <param name="keyArray">原字节</param>
/// <param name="key">处理key</param>
/// <returns></returns>
private static byte[] GetAesKey(byte[] keyArray, string key)
{
byte[] newArray = new byte[16];
if (keyArray.Length < 16)
{
for (int i = 0; i < newArray.Length; i++)
{
if (i >= keyArray.Length)
{
newArray[i] = 0;
}
else
{
newArray[i] = keyArray[i];
}
}
}
return newArray;
}
/// <summary>
/// 使用AES加密字符串,按128位处理key
/// </summary>
/// <param name="content">加密内容</param>
/// <param name="key">秘钥需要128位、256位.....</param>
/// <param name="autoHandle">秘钥需要128位、256位.....</param>
/// <returns>Base64字符串结果</returns>
public static string AesEncrypt(string content, string key, bool autoHandle = true)
{
try
{
byte[] keyArray = Encoding.UTF8.GetBytes(key);
if (autoHandle)
{
keyArray = GetAesKey(keyArray, key);
}
byte[] toEncryptArray = Encoding.UTF8.GetBytes(content);
SymmetricAlgorithm des = Aes.Create();
des.Key = keyArray;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = des.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray);
}
catch
{
return "";
}
}
/// <summary>
/// 使用AES解密字符串,按128位处理key
/// </summary>
/// <param name="content">内容</param>
/// <param name="key">秘钥需要128位、256位.....</param>
/// <param name="autoHandle">秘钥需要128位、256位.....</param>
/// <returns>UTF8解密结果</returns>
public static string AesDecrypt(string content, string key, bool autoHandle = true)
{
try
{
byte[] keyArray = Encoding.UTF8.GetBytes(key);
if (autoHandle)
{
keyArray = GetAesKey(keyArray, key);
}
byte[] toEncryptArray = Convert.FromBase64String(content);
SymmetricAlgorithm des = Aes.Create();
des.Key = keyArray;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = des.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
catch
{
return "";
}
}
/// <summary>
/// 使用AES解密字符串,按128位处理key
/// </summary>
/// <param name="content">内容</param>
/// <param name="key">秘钥需要128位、256位.....</param>
/// <param name="autoHandle">秘钥需要128位、256位.....</param>
/// <returns>UTF8解密结果</returns>
public static byte[] AesDecryptByte(string content, string key, bool autoHandle = true)
{
try
{
byte[] keyArray = Encoding.UTF8.GetBytes(key);
if (autoHandle)
{
keyArray = GetAesKey(keyArray, key);
}
byte[] toEncryptArray = Convert.FromBase64String(content);
SymmetricAlgorithm des = Aes.Create();
des.Key = keyArray;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = des.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return resultArray;
}
catch
{
return null;
}
}
#endregion
}
/// <summary>
/// 上传机器人客户信息
/// </summary>
public class CustomerLinkInput
{
/// <summary>
/// 用户名
/// </summary>
[Required]
[DisplayName("用户名")]
public string UserName { get; set; }
/// <summary>
/// 机器人类型0个人微信 1企业微信 2QQ
/// </summary>
[Required]
[DisplayName("机器人类型0个人微信 1企业微信 2QQ")]
public int RobotType { get; set; }
/// <summary>
/// 头像地址
/// </summary>
public string HeadUrl { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string NickName { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 机器人账号
/// </summary>
[Required]
[DisplayName("机器人账号")]
public string RobotName { get; set; }
/// <summary>
/// 添加时间
/// </summary>
[Required]
public DateTime CreateTime { get; set; }
}
/// <summary>
/// 转换机器人类型
/// </summary>
/// <param name="chatType"></param>
/// <returns></returns>
public static int ConvertRobotType(ChatType chatType)
{
/*
= 0,
QQ = 1,
= 2,
= 3,
= 4
*/
switch (chatType)
{
case ChatType.QQ:
return 2;
case ChatType.:
return 1;
case ChatType.:
return 0;
case ChatType.:
return -1;
case ChatType.:
return -1;
}
return -1;
}
/// <summary>
/// 上传机器人信息
/// </summary>
public class CustomerRobotInput
{
/// <summary>
/// 用户名
/// </summary>
[Required]
[DisplayName("用户名")]
public string UserName { get; set; }
/// <summary>
/// 机器人类型0个人微信 1企业微信 2QQ
/// </summary>
[Required]
[DisplayName("机器人类型0个人微信 1企业微信 2QQ")]
public int RobotType { get; set; }
/// <summary>
/// 头像地址
/// </summary>
public string HeadUrl { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string NickName { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
}
/// <summary>
/// 统一服务返回结果
/// </summary>
public class ServiceResult
{
/// <summary>
/// 请求是否成功
/// </summary>
public bool Ok { get; set; }
/// <summary>
/// 数据
/// </summary>
public object Data { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string Message { get; set; }
}
/// <summary>
/// 统一返回结果
/// </summary>
/// <typeparam name="T"></typeparam>
public class ServiceResult<T> : ServiceResult
{
/// <summary>
/// 初始化
/// </summary>
/// <param name="data"></param>
public ServiceResult(T data)
{
this.Data = data;
}
/// <summary>
/// 返回数据
/// </summary>
public new T Data { get; set; }
}
}
}