548 lines
25 KiB
C#
548 lines
25 KiB
C#
|
using Chat.Framework.WXSdk.IPAD;
|
|||
|
using Google.Protobuf;
|
|||
|
using Grpc.Core;
|
|||
|
using MSScriptControl;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Drawing;
|
|||
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
using System.Net;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using WechatProto;
|
|||
|
|
|||
|
namespace Chat.Framework.WXSdk.Implement
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 微信管理工具
|
|||
|
/// </summary>
|
|||
|
internal class WXClientTool
|
|||
|
{
|
|||
|
|
|||
|
public static int ReadInt(byte[] buf, int index)
|
|||
|
{
|
|||
|
if (buf.Length >= 16)
|
|||
|
{
|
|||
|
var seqBuf = new byte[4];
|
|||
|
Buffer.BlockCopy(buf, index, seqBuf, 0, 4);
|
|||
|
return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(seqBuf, 0));
|
|||
|
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
internal static string[] auth_info { get; set; }
|
|||
|
internal static byte[] random_encry_key { get { return GrpcConfig.Get(GrpcType.Laoyao).RandomEncryKey; } }
|
|||
|
internal static string machine_code { get { return GrpcConfig.Get(GrpcType.Laoyao).MachineCode; } }
|
|||
|
static WXClientTool()
|
|||
|
{
|
|||
|
|
|||
|
// switch (grpc_type)
|
|||
|
// {
|
|||
|
// case 1:
|
|||
|
// {
|
|||
|
//// version = "6.6.6.7";
|
|||
|
//// app_id = "v1_23229f55b208d33b_CodeVip";
|
|||
|
//// app_key = "v2_d72d0b8d148afb50e8a0beed37efd1b5";
|
|||
|
//// machine_code = "v3_951b8b394d904962d981f02e5d4cee31";
|
|||
|
//// channel_credentials = new SslCredentials(@"-----BEGIN CERTIFICATE-----
|
|||
|
////MIIDqjCCApKgAwIBAgIJAOf7+/avi9foMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV
|
|||
|
////BAYTAkNOMQswCQYDVQQIDAJ4eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQsw
|
|||
|
////CQYDVQQLDAJ4eDEUMBIGA1UEAwwLd2VjaGF0QHJvb3QxETAPBgkqhkiG9w0BCQEW
|
|||
|
////Anh4MB4XDTE4MDUwODAwMzE1MFoXDTI4MDUwNTAwMzE1MFowajELMAkGA1UEBhMC
|
|||
|
////Q04xCzAJBgNVBAgMAnh4MQswCQYDVQQHDAJ4eDELMAkGA1UECgwCeHgxCzAJBgNV
|
|||
|
////BAsMAnh4MRQwEgYDVQQDDAt3ZWNoYXRAcm9vdDERMA8GCSqGSIb3DQEJARYCeHgw
|
|||
|
////ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNcWVlhOpXjqivCpJpVHCG
|
|||
|
////eM+Q/e83MDpqXmlT33hAFlCfUzWYYhFAHwc+xShkvuoaBwKpAr0fcHT7Kj4TLSJB
|
|||
|
////F9FwBccPp4Tv0YH0h4pzZ9nWZCMGXB5TlXAreXrcu8Qab0MPAxMKtMO0FZzQawRD
|
|||
|
////mO/S43u6tDBrhW2zgFzCUo+cRiCYRXoewuFVT4RT7eYvEu579oy4mto7YpR8GfPY
|
|||
|
////ywiTh7D/4To7nNoWbly84WB9ZSQ8HZoC1KTykqaeSGw7xUhKEoPoeKPke1ECfXB2
|
|||
|
////lSZMwKar2IU0BVlvxL55EMF8oXJozLVEZeVIZ4Wp9EFY2KaZJowgoOa1I+vcwBbd
|
|||
|
////AgMBAAGjUzBRMB0GA1UdDgQWBBR2SmMGUpTN/Dl0wcSYcPav6o01iDAfBgNVHSME
|
|||
|
////GDAWgBR2SmMGUpTN/Dl0wcSYcPav6o01iDAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
|
|||
|
////SIb3DQEBCwUAA4IBAQAdCSkska27VdLcGqK9/sraopxaX31Nseci/sJbimIHxr+q
|
|||
|
////DwAHExU5sJ1qT827n2OpF/lWMRhnJZ3ubeJ8oGA3CAKu4EiKKGA1hGOLCbEvagCc
|
|||
|
////sdBSegk050qkMssJzNaw7boZB8vek1RDK32Fuhsh4m+MUZBj6bJCdGW9K+ZMmpZl
|
|||
|
////bMwmsgqV6+EMvr+PhFHy8bOAdIs4/eOTjW7R0JwYgFArVXMrVKgiRknkhM+PBBHG
|
|||
|
////DPWO0j3855SF2X5r4jQs2PvKGJjOMuQeIgsf2GbwSQhXEhM8lGdjn9up8hm7VSXf
|
|||
|
////x8wZquXczPSdDez7tP+g9nKbxcJtGnxo8+Jntmvs
|
|||
|
////-----END CERTIFICATE-----");
|
|||
|
|
|||
|
// }
|
|||
|
// break;
|
|||
|
// case 2:
|
|||
|
// {
|
|||
|
// version = "6.7.2";
|
|||
|
// app_id = "v1_LCEO_Code";
|
|||
|
// app_key = "v2_4d5d55d6fbb6ce87b0f53019fefebb89";
|
|||
|
// machine_code = "v3_7af2592d5c49d94424bac95e80cb07a4";
|
|||
|
// channel_credentials = new SslCredentials(@"-----BEGIN CERTIFICATE-----
|
|||
|
//MIIDqjCCApKgAwIBAgIJAOf7+/avi9foMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV
|
|||
|
//BAYTAkNOMQswCQYDVQQIDAJ4eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQsw
|
|||
|
//CQYDVQQLDAJ4eDEUMBIGA1UEAwwLd2VjaGF0QHJvb3QxETAPBgkqhkiG9w0BCQEW
|
|||
|
//Anh4MB4XDTE4MDUwODAwMzE1MFoXDTI4MDUwNTAwMzE1MFowajELMAkGA1UEBhMC
|
|||
|
//Q04xCzAJBgNVBAgMAnh4MQswCQYDVQQHDAJ4eDELMAkGA1UECgwCeHgxCzAJBgNV
|
|||
|
//BAsMAnh4MRQwEgYDVQQDDAt3ZWNoYXRAcm9vdDERMA8GCSqGSIb3DQEJARYCeHgw
|
|||
|
//ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNcWVlhOpXjqivCpJpVHCG
|
|||
|
//eM+Q/e83MDpqXmlT33hAFlCfUzWYYhFAHwc+xShkvuoaBwKpAr0fcHT7Kj4TLSJB
|
|||
|
//F9FwBccPp4Tv0YH0h4pzZ9nWZCMGXB5TlXAreXrcu8Qab0MPAxMKtMO0FZzQawRD
|
|||
|
//mO/S43u6tDBrhW2zgFzCUo+cRiCYRXoewuFVT4RT7eYvEu579oy4mto7YpR8GfPY
|
|||
|
//ywiTh7D/4To7nNoWbly84WB9ZSQ8HZoC1KTykqaeSGw7xUhKEoPoeKPke1ECfXB2
|
|||
|
//lSZMwKar2IU0BVlvxL55EMF8oXJozLVEZeVIZ4Wp9EFY2KaZJowgoOa1I+vcwBbd
|
|||
|
//AgMBAAGjUzBRMB0GA1UdDgQWBBR2SmMGUpTN/Dl0wcSYcPav6o01iDAfBgNVHSME
|
|||
|
//GDAWgBR2SmMGUpTN/Dl0wcSYcPav6o01iDAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
|
|||
|
//SIb3DQEBCwUAA4IBAQAdCSkska27VdLcGqK9/sraopxaX31Nseci/sJbimIHxr+q
|
|||
|
//DwAHExU5sJ1qT827n2OpF/lWMRhnJZ3ubeJ8oGA3CAKu4EiKKGA1hGOLCbEvagCc
|
|||
|
//sdBSegk050qkMssJzNaw7boZB8vek1RDK32Fuhsh4m+MUZBj6bJCdGW9K+ZMmpZl
|
|||
|
//bMwmsgqV6+EMvr+PhFHy8bOAdIs4/eOTjW7R0JwYgFArVXMrVKgiRknkhM+PBBHG
|
|||
|
//DPWO0j3855SF2X5r4jQs2PvKGJjOMuQeIgsf2GbwSQhXEhM8lGdjn9up8hm7VSXf
|
|||
|
//x8wZquXczPSdDez7tP+g9nKbxcJtGnxo8+Jntmvs
|
|||
|
//-----END CERTIFICATE-----");
|
|||
|
// }
|
|||
|
// break;
|
|||
|
// default:
|
|||
|
// break;
|
|||
|
// }
|
|||
|
|
|||
|
}
|
|||
|
// internal static string[] grpc_info { get; set; }
|
|||
|
|
|||
|
// internal static byte[] random_encry_key = CsharpHttpHelper.HttpExtend.RandomByte(16);
|
|||
|
// internal static string version = "6.7.2";
|
|||
|
// internal static string app_id = "v1_LCEO_Code";
|
|||
|
// internal static string app_key = "v2_4d5d55d6fbb6ce87b0f53019fefebb89";
|
|||
|
// internal static string machine_code = "v3_7af2592d5c49d94424bac95e80cb07a4";
|
|||
|
// internal static SslCredentials channel_credentials = new SslCredentials(@"-----BEGIN CERTIFICATE-----
|
|||
|
//MIIDqjCCApKgAwIBAgIJAOf7+/avi9foMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV
|
|||
|
//BAYTAkNOMQswCQYDVQQIDAJ4eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQsw
|
|||
|
//CQYDVQQLDAJ4eDEUMBIGA1UEAwwLd2VjaGF0QHJvb3QxETAPBgkqhkiG9w0BCQEW
|
|||
|
//Anh4MB4XDTE4MDUwODAwMzE1MFoXDTI4MDUwNTAwMzE1MFowajELMAkGA1UEBhMC
|
|||
|
//Q04xCzAJBgNVBAgMAnh4MQswCQYDVQQHDAJ4eDELMAkGA1UECgwCeHgxCzAJBgNV
|
|||
|
//BAsMAnh4MRQwEgYDVQQDDAt3ZWNoYXRAcm9vdDERMA8GCSqGSIb3DQEJARYCeHgw
|
|||
|
//ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNcWVlhOpXjqivCpJpVHCG
|
|||
|
//eM+Q/e83MDpqXmlT33hAFlCfUzWYYhFAHwc+xShkvuoaBwKpAr0fcHT7Kj4TLSJB
|
|||
|
//F9FwBccPp4Tv0YH0h4pzZ9nWZCMGXB5TlXAreXrcu8Qab0MPAxMKtMO0FZzQawRD
|
|||
|
//mO/S43u6tDBrhW2zgFzCUo+cRiCYRXoewuFVT4RT7eYvEu579oy4mto7YpR8GfPY
|
|||
|
//ywiTh7D/4To7nNoWbly84WB9ZSQ8HZoC1KTykqaeSGw7xUhKEoPoeKPke1ECfXB2
|
|||
|
//lSZMwKar2IU0BVlvxL55EMF8oXJozLVEZeVIZ4Wp9EFY2KaZJowgoOa1I+vcwBbd
|
|||
|
//AgMBAAGjUzBRMB0GA1UdDgQWBBR2SmMGUpTN/Dl0wcSYcPav6o01iDAfBgNVHSME
|
|||
|
//GDAWgBR2SmMGUpTN/Dl0wcSYcPav6o01iDAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
|
|||
|
//SIb3DQEBCwUAA4IBAQAdCSkska27VdLcGqK9/sraopxaX31Nseci/sJbimIHxr+q
|
|||
|
//DwAHExU5sJ1qT827n2OpF/lWMRhnJZ3ubeJ8oGA3CAKu4EiKKGA1hGOLCbEvagCc
|
|||
|
//sdBSegk050qkMssJzNaw7boZB8vek1RDK32Fuhsh4m+MUZBj6bJCdGW9K+ZMmpZl
|
|||
|
//bMwmsgqV6+EMvr+PhFHy8bOAdIs4/eOTjW7R0JwYgFArVXMrVKgiRknkhM+PBBHG
|
|||
|
//DPWO0j3855SF2X5r4jQs2PvKGJjOMuQeIgsf2GbwSQhXEhM8lGdjn9up8hm7VSXf
|
|||
|
//x8wZquXczPSdDez7tP+g9nKbxcJtGnxo8+Jntmvs
|
|||
|
//-----END CERTIFICATE-----");
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 执行JS
|
|||
|
/// </summary>
|
|||
|
/// <param name="sCode">JavaScript代码的字符串</param>
|
|||
|
/// <returns></returns>
|
|||
|
public static string Usc2ToAnsi(string sCode)
|
|||
|
{
|
|||
|
ScriptControl scriptControl = new ScriptControl();
|
|||
|
scriptControl.UseSafeSubset = true;
|
|||
|
scriptControl.Language = "JScript";
|
|||
|
scriptControl.AddCode("function asciiConvertNative(s){var asciicode=s.split(\"\\\\u\");var nativeValue=asciicode[0];for(var i=1;i<asciicode.length;i++){var code=asciicode[i];nativeValue+=String.fromCharCode(parseInt(\"0x\"+code.substring(0,4)));if(code.length>4){nativeValue+=code.substring(4,code.length)}}return nativeValue};");
|
|||
|
try
|
|||
|
{
|
|||
|
string str = scriptControl.Eval(string.Format("asciiConvertNative('{0}')", sCode)).ToString();
|
|||
|
return str;
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
string str = ex.Message;
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
public static string BetweenArr(string str, string leftstr, string rightstr)
|
|||
|
{
|
|||
|
|
|||
|
int i = str.IndexOf(leftstr) + leftstr.Length;
|
|||
|
string temp = str.Substring(i, str.IndexOf(rightstr, i) - i);
|
|||
|
return temp;
|
|||
|
}
|
|||
|
|
|||
|
public static Bitmap GetImageFromBase64(string base64string)
|
|||
|
{
|
|||
|
byte[] b = Convert.FromBase64String(base64string);
|
|||
|
MemoryStream ms = new MemoryStream(b);
|
|||
|
Bitmap bitmap = new Bitmap(ms);
|
|||
|
//ms.Close();
|
|||
|
return bitmap;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#region 返回一个随机表情
|
|||
|
private static string Expression = "[微笑],[憨笑],[呲牙],[爱心],[啤酒],[太阳],[礼物],[抱拳],[咖啡],[调皮],[激动],[回头],[色],[愉快],[爱情],[飞吻],[跳跳],[发抖],[转圈],[献吻],[耶],[红包],[嘿哈]";
|
|||
|
private static List<string> ExpressionList = null;
|
|||
|
private static Random random = new Random();
|
|||
|
public static string FindRandomExpression()
|
|||
|
{
|
|||
|
if (ExpressionList == null)
|
|||
|
ExpressionList = Expression.Split(',').ToList();
|
|||
|
return ExpressionList[random.Next(ExpressionList.Count)];
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 发送代码
|
|||
|
// BaseUserInfo定义
|
|||
|
|
|||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
|||
|
public struct BaseUserInfo
|
|||
|
{
|
|||
|
//public int dwUin;
|
|||
|
//public int dwDeviceVersion;
|
|||
|
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
|
|||
|
// public byte[] szCookies;
|
|||
|
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
|||
|
// public byte[] szSessionKey;
|
|||
|
// [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
|
|||
|
// public string szDeviceid;
|
|||
|
// [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
|
|||
|
// public string szCode;
|
|||
|
public int dwUin;
|
|||
|
public int dwDeviceVersion;
|
|||
|
public int dwSyncKeyLength;
|
|||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
|
|||
|
public byte[] szCookies;
|
|||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
|||
|
public byte[] szSessionKey;
|
|||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
|
|||
|
public byte[] szSyncKey;
|
|||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
|
|||
|
public string szDeviceid;
|
|||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
|
|||
|
public string szCode;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
|||
|
public struct UploadImgInfo
|
|||
|
{
|
|||
|
|
|||
|
public int dwPayloadsLength;
|
|||
|
public int dwTotalLen;
|
|||
|
public int dwStartPos;
|
|||
|
public int dwDataLen;
|
|||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 65535 * 2)]
|
|||
|
public byte[] szPayLoadsBuf;
|
|||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 65535)]
|
|||
|
public byte[] szImgBuf;
|
|||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
|
|||
|
public string ClientImgId;
|
|||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
|
|||
|
public string szFromUserName;
|
|||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
|
|||
|
public string szToUserName;
|
|||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
|
|||
|
public string szCmdUrl;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
|||
|
public struct UploadVoiceInfo
|
|||
|
{
|
|||
|
|
|||
|
public int dwPayloadsLength;
|
|||
|
public int dwVoiceLength;
|
|||
|
public int dwEndFlag;
|
|||
|
public int dwVoiceFormat;
|
|||
|
public int dwOffset;
|
|||
|
public int dwVoiceBufLength;
|
|||
|
|
|||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 65535 * 2)]
|
|||
|
public byte[] szPayLoadsBuf;
|
|||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 65535)]
|
|||
|
public byte[] szVoiceBuf;
|
|||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
|
|||
|
public string ClientMsgId;
|
|||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
|
|||
|
public string szFromUserName;
|
|||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
|
|||
|
public string szToUserName;
|
|||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
|
|||
|
public string szCmdUrl;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
[DllImport("UICorePlus.dll", EntryPoint = "CUploadImg", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
public static extern int CUploadImg(ref BaseUserInfo userinfo, IntPtr imginfo);
|
|||
|
|
|||
|
[DllImport("UICorePlus.dll", EntryPoint = "CUploadVoice", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
public static extern int CUploadVoice(ref BaseUserInfo userinfo, IntPtr voiceinfo);
|
|||
|
[DllImport("UICorePlus.dll", EntryPoint = "CPackSync", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
public static extern int CPackSync(ref BaseUserInfo userinfo, ref byte encodeData);
|
|||
|
[DllImport("UICorePlus.dll", EntryPoint = "CUnPackSync", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
public static extern int CUnPackSync(ref BaseUserInfo baseUserInfo, byte[] playload, int playloadlength, ref byte decodeData);
|
|||
|
[DllImport("UICorePlus.dll", EntryPoint = "CGetContact", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
public static extern int CGetContact(ref BaseUserInfo baseUserInfo, byte[] playload, int playloadlength, ref byte encodeData);
|
|||
|
[DllImport("UICorePlus.dll", EntryPoint = "CUnPackGetcontact", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
public static extern int CUnPackGetcontact(ref BaseUserInfo baseUserInfo, byte[] playload, int playloadlength, ref byte decodeData);
|
|||
|
[DllImport("UICorePlus.dll", EntryPoint = "CSendMsg", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
public static extern int CSendMsg(ref BaseUserInfo baseUserInfo, byte[] playload, int playloadlength, ref byte encodeData);
|
|||
|
[DllImport("UICorePlus.dll", EntryPoint = "CSendAppMsg", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
public static extern int CSendAppMsg(ref BaseUserInfo baseUserInfo, byte[] playload, int playloadlength, ref byte encodeData);
|
|||
|
public static byte[] CUploadImg(User u, UploadImgInfo imginfo)
|
|||
|
{ //自行做好异常捕获
|
|||
|
BaseUserInfo userinfo = new BaseUserInfo();
|
|||
|
userinfo.szCookies = u.Cookies.ToByteArray();
|
|||
|
userinfo.szSessionKey = u.SessionKey.ToByteArray();
|
|||
|
string[] device = u.DeviceId.Split('@');
|
|||
|
userinfo.szDeviceid = device[2];
|
|||
|
userinfo.dwUin = (int)u.Uin;
|
|||
|
userinfo.szCode = machine_code;
|
|||
|
imginfo.szFromUserName = u.Userame;
|
|||
|
int nSizeImginfo = Marshal.SizeOf(imginfo);
|
|||
|
IntPtr intPtr = Marshal.AllocHGlobal(nSizeImginfo);
|
|||
|
Marshal.StructureToPtr(imginfo, intPtr, true);
|
|||
|
int ret = CUploadImg(ref userinfo, intPtr);
|
|||
|
if (ret == -1)
|
|||
|
{
|
|||
|
//组包大于65535
|
|||
|
return null;
|
|||
|
|
|||
|
}
|
|||
|
imginfo = (UploadImgInfo)Marshal.PtrToStructure(intPtr, typeof(UploadImgInfo));
|
|||
|
byte[] encodeBuf = new byte[imginfo.dwPayloadsLength];
|
|||
|
Buffer.BlockCopy(imginfo.szPayLoadsBuf, 0, encodeBuf, 0, imginfo.dwPayloadsLength);
|
|||
|
return encodeBuf;
|
|||
|
}
|
|||
|
public static byte[] CUploadVoice(User u, UploadVoiceInfo voiceinfo)
|
|||
|
{
|
|||
|
//自行做好异常捕获
|
|||
|
BaseUserInfo userinfo = new BaseUserInfo();
|
|||
|
userinfo.szCookies = u.Cookies.ToByteArray();
|
|||
|
userinfo.szSessionKey = u.SessionKey.ToByteArray();
|
|||
|
string[] device = u.DeviceId.Split('@');
|
|||
|
userinfo.szDeviceid = device[2];
|
|||
|
userinfo.dwUin = (int)u.Uin;
|
|||
|
voiceinfo.szFromUserName = u.Userame;
|
|||
|
userinfo.szCode = machine_code;
|
|||
|
|
|||
|
int nSizeImginfo = Marshal.SizeOf(voiceinfo);
|
|||
|
IntPtr intPtr = Marshal.AllocHGlobal(nSizeImginfo);
|
|||
|
Marshal.StructureToPtr(voiceinfo, intPtr, true);
|
|||
|
int ret = CUploadVoice(ref userinfo, intPtr);
|
|||
|
if (ret == -1)
|
|||
|
{
|
|||
|
//组包大于65535
|
|||
|
return null;
|
|||
|
|
|||
|
}
|
|||
|
voiceinfo = (UploadVoiceInfo)Marshal.PtrToStructure(intPtr, typeof(UploadVoiceInfo));
|
|||
|
byte[] encodeBuf = new byte[voiceinfo.dwPayloadsLength];
|
|||
|
Buffer.BlockCopy(voiceinfo.szPayLoadsBuf, 0, encodeBuf, 0, voiceinfo.dwPayloadsLength);
|
|||
|
return encodeBuf;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public static byte[] CPackSync(User u)
|
|||
|
{ //自行做好异常捕获
|
|||
|
try
|
|||
|
{
|
|||
|
BaseUserInfo userinfo = new BaseUserInfo();
|
|||
|
userinfo.szCookies = u.Cookies.ToByteArray();
|
|||
|
userinfo.szSessionKey = u.SessionKey.ToByteArray();
|
|||
|
string[] device = u.DeviceId.Split('@');
|
|||
|
userinfo.szDeviceid = device[2];
|
|||
|
userinfo.dwUin = (int)u.Uin;
|
|||
|
byte[] synKeybuf = new byte[512];//不能更改此参数 若要更改必须同步c++ 缓冲器长度
|
|||
|
int keylength = 0;
|
|||
|
|
|||
|
byte[] synKey = u.CurrentsyncKey.ToByteArray();
|
|||
|
|
|||
|
if (synKey.Length != 0)
|
|||
|
{
|
|||
|
|
|||
|
keylength = synKey.Length;
|
|||
|
Buffer.BlockCopy(synKey, 0, synKeybuf, 0, keylength);
|
|||
|
}
|
|||
|
userinfo.szSyncKey = synKeybuf;
|
|||
|
userinfo.dwSyncKeyLength = keylength;
|
|||
|
userinfo.szCode = machine_code;
|
|||
|
|
|||
|
byte[] s = new byte[65535];
|
|||
|
|
|||
|
int packLength = CPackSync(ref userinfo, ref s[0]);
|
|||
|
if (packLength == -1)
|
|||
|
return null;//组包失败
|
|||
|
|
|||
|
//ret
|
|||
|
byte[] encodeBuf = new byte[packLength];
|
|||
|
Buffer.BlockCopy(s, 0, encodeBuf, 0, packLength);
|
|||
|
return encodeBuf;
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
throw new Exception($"CPackSync ERROR:{ex.Message}\r\nuser:{Util.HexToStr(u.ToByteArray())}");
|
|||
|
}
|
|||
|
}
|
|||
|
public static byte[] CUnPackSync(User u, byte[] encodeData, ref byte[] syncKey)
|
|||
|
{
|
|||
|
//自行做好异常捕获 解包必须判断标准头191
|
|||
|
try
|
|||
|
{
|
|||
|
BaseUserInfo userinfo = new BaseUserInfo();
|
|||
|
userinfo.szCookies = u.Cookies.ToByteArray();
|
|||
|
userinfo.szSessionKey = u.SessionKey.ToByteArray();
|
|||
|
string[] device = u.DeviceId.Split('@');
|
|||
|
userinfo.szDeviceid = device[2];
|
|||
|
userinfo.dwUin = (int)u.Uin;
|
|||
|
userinfo.szCode = machine_code;
|
|||
|
byte[] s = new byte[65535 * 10];//可酌情扩容
|
|||
|
int packLength = CUnPackSync(ref userinfo, encodeData, encodeData.Length, ref s[0]);
|
|||
|
if (packLength == -1)
|
|||
|
return null;//组包失败
|
|||
|
|
|||
|
if (userinfo.dwSyncKeyLength != 0)
|
|||
|
{
|
|||
|
byte[] _syncKey = new byte[userinfo.dwSyncKeyLength];
|
|||
|
Buffer.BlockCopy(userinfo.szSyncKey, 0, _syncKey, 0, userinfo.dwSyncKeyLength);
|
|||
|
syncKey = _syncKey;
|
|||
|
}
|
|||
|
//ret
|
|||
|
byte[] decodeBuf = new byte[packLength];
|
|||
|
Buffer.BlockCopy(s, 0, decodeBuf, 0, packLength);
|
|||
|
|
|||
|
return decodeBuf;
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
throw new Exception($"CUnPackSync ERROR:{ex.Message}\r\nuser:{Util.HexToStr(u.ToByteArray())}\r\ndata:{Util.HexToStr(encodeData)}");
|
|||
|
}
|
|||
|
}
|
|||
|
public static byte[] CGetContact(User u, byte[] jsonData)
|
|||
|
{
|
|||
|
//自行做好异常捕获
|
|||
|
BaseUserInfo userinfo = new BaseUserInfo();
|
|||
|
userinfo.szCookies = u.Cookies.ToByteArray();
|
|||
|
userinfo.szSessionKey = u.SessionKey.ToByteArray();
|
|||
|
string[] device = u.DeviceId.Split('@');
|
|||
|
userinfo.szDeviceid = device[2];
|
|||
|
userinfo.dwUin = (int)u.Uin;
|
|||
|
userinfo.szCode = machine_code;
|
|||
|
byte[] s = new byte[65535];
|
|||
|
int packLength = CGetContact(ref userinfo, jsonData, jsonData.Length, ref s[0]);
|
|||
|
if (packLength == -1)
|
|||
|
{
|
|||
|
//组包大于65535
|
|||
|
return null;
|
|||
|
|
|||
|
}
|
|||
|
byte[] encodeData = new byte[packLength];
|
|||
|
Buffer.BlockCopy(s, 0, encodeData, 0, packLength);
|
|||
|
return encodeData;
|
|||
|
}
|
|||
|
public static byte[] CUnPackGetcontact(User u, byte[] encodeData)
|
|||
|
{
|
|||
|
//自行做好异常捕获 解包必须判断标准头191
|
|||
|
BaseUserInfo userinfo = new BaseUserInfo();
|
|||
|
userinfo.szCookies = u.Cookies.ToByteArray();
|
|||
|
userinfo.szSessionKey = u.SessionKey.ToByteArray();
|
|||
|
string[] device = u.DeviceId.Split('@');
|
|||
|
userinfo.szDeviceid = device[2];
|
|||
|
userinfo.dwUin = (int)u.Uin;
|
|||
|
userinfo.szCode = machine_code;
|
|||
|
byte[] s = new byte[65535 * 2];
|
|||
|
int packLength = CUnPackGetcontact(ref userinfo, encodeData, encodeData.Length, ref s[0]);
|
|||
|
if (packLength == -1)
|
|||
|
{
|
|||
|
//组包大于65535
|
|||
|
return null;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
byte[] decodeBuf = new byte[packLength];
|
|||
|
Buffer.BlockCopy(s, 0, decodeBuf, 0, packLength);
|
|||
|
return decodeBuf;
|
|||
|
}
|
|||
|
public static byte[] CSendMsg(User u, byte[] jsonData)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
//自行做好异常捕获
|
|||
|
BaseUserInfo userinfo = new BaseUserInfo();
|
|||
|
userinfo.szCookies = u.Cookies.ToByteArray();
|
|||
|
userinfo.szSessionKey = u.SessionKey.ToByteArray();
|
|||
|
string[] device = u.DeviceId.Split('@');
|
|||
|
userinfo.szDeviceid = device[2];
|
|||
|
userinfo.dwUin = (int)u.Uin;
|
|||
|
userinfo.szCode = machine_code;
|
|||
|
byte[] s = new byte[65535];
|
|||
|
int packLength = CSendMsg(ref userinfo, jsonData, jsonData.Length, ref s[0]);
|
|||
|
if (packLength == -1)
|
|||
|
{
|
|||
|
//组包大于65535
|
|||
|
return null;
|
|||
|
|
|||
|
}
|
|||
|
byte[] encodeData = new byte[packLength];
|
|||
|
Buffer.BlockCopy(s, 0, encodeData, 0, packLength);
|
|||
|
return encodeData;
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
throw ex;
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
public static byte[] CSendAppMsg(User u, byte[] jsonData)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
//自行做好异常捕获
|
|||
|
BaseUserInfo userinfo = new BaseUserInfo();
|
|||
|
userinfo.szCookies = u.Cookies.ToByteArray();
|
|||
|
userinfo.szSessionKey = u.SessionKey.ToByteArray();
|
|||
|
string[] device = u.DeviceId.Split('@');
|
|||
|
userinfo.szDeviceid = device[2];
|
|||
|
userinfo.dwUin = (int)u.Uin;
|
|||
|
userinfo.szCode = machine_code;
|
|||
|
byte[] s = new byte[65535];
|
|||
|
int packLength = CSendAppMsg(ref userinfo, jsonData, jsonData.Length, ref s[0]);
|
|||
|
if (packLength == -1)
|
|||
|
{
|
|||
|
//组包大于65535
|
|||
|
return null;
|
|||
|
|
|||
|
}
|
|||
|
byte[] encodeData = new byte[packLength];
|
|||
|
Buffer.BlockCopy(s, 0, encodeData, 0, packLength);
|
|||
|
return encodeData;
|
|||
|
}
|
|||
|
catch { }
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
[DllImport("WeChatToken.dll", EntryPoint = "TokenSecret")]
|
|||
|
|
|||
|
private extern static int TokenSecret(string inputData, StringBuilder outputData);
|
|||
|
public static byte[] GetTokenSecret(byte[] inputData)
|
|||
|
{
|
|||
|
|
|||
|
string Secret = Util.HexToStr(inputData);
|
|||
|
StringBuilder build = new StringBuilder(512);
|
|||
|
int ret = TokenSecret(Secret, build);
|
|||
|
if (ret == 0)
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
return Util.StrToHex(build.ToString());
|
|||
|
}
|
|||
|
|
|||
|
return new byte[] { 0 };
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|