old_flsystem/PCRobot/Utils/UserRobotUpLoad.cs

543 lines
18 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 System.Threading;
using CsharpHttpHelper;
namespace PCRobot.Utils
{
/// <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
};
}
//分页取数据
var index = 1;
var pageSize = 10;
List<CustomerLinkInput> uploadList;
do
{
uploadList = ListHelper.ToPageList(inputs, index, pageSize);
if (uploadList == null || uploadList.Count == 0)
{
break;
}
var errorCount = 0;
try
{
var result = HttpAes("CustomerLink/UpLoadLink", "post", uploadList);
if (!result.Ok)
{
return result;
}
}
catch (Exception ex)
{
//重试
errorCount++;
Thread.Sleep(2000 * errorCount);
if (errorCount > 3)
{
return new ServiceResult()
{
Ok = false,
Message = ex.Message
};
}
// ignored
}
index++;
} while (uploadList.Count == pageSize);
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>
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; }
}
}
public class ListHelper
{
/// <summary>
/// 取指定数量的集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public static List<T> ToPageList<T>(List<T> list, int pageIndex, int pageSize)
{
//数量过低无需分页
if (list.Count < pageSize)
{
return list;
}
//页码范围内
int pageCount = (int)Math.Ceiling(Convert.ToDecimal(list.Count) / pageSize);
if (pageCount >= pageIndex)
{
return list.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
}
//页码过大,或其他情况
return new List<T>();
}
}
}