diff --git a/Lagrange.Core.NativeAPI/LoginEntryPoint.cs b/Lagrange.Core.NativeAPI/LoginEntryPoint.cs new file mode 100644 index 0000000..7b87c87 --- /dev/null +++ b/Lagrange.Core.NativeAPI/LoginEntryPoint.cs @@ -0,0 +1,39 @@ +using System.Runtime.InteropServices; +using System.Text; +using Lagrange.Core.Common.Interface; +using Lagrange.Core.NativeAPI.NativeModel.Common; + +namespace Lagrange.Core.NativeAPI +{ + public static class LoginEntryPoint + { + [UnmanagedCallersOnly(EntryPoint = "SubmitCaptcha")] + public static bool SubmitCaptcha(int index, ByteArrayNative ticket, ByteArrayNative randStr) + { + if (Program.Contexts.Count <= index) + { + return false; + } + + var ticketData = ticket.ToByteArrayWithoutFree(); + var randStrData = randStr.ToByteArrayWithoutFree(); + + BotContext context = Program.Contexts[index].BotContext; + return context.SubmitCaptcha(Encoding.UTF8.GetString(ticketData), Encoding.UTF8.GetString(randStrData)); + } + + [UnmanagedCallersOnly(EntryPoint = "SubmitSMSCode")] + public static bool SubmitSMSCode(int index, ByteArrayNative code) + { + if (Program.Contexts.Count <= index) + { + return false; + } + + var codeData = code.ToByteArrayWithoutFree(); + + BotContext context = Program.Contexts[index].BotContext; + return context.SubmitSMSCode(Encoding.UTF8.GetString(codeData)); + } + }; +}; \ No newline at end of file diff --git a/Lagrange.Core.NativeAPI/NativeModel/Common/BotSignProvider.cs b/Lagrange.Core.NativeAPI/NativeModel/Common/BotSignProvider.cs index 820ec29..ee6876b 100644 --- a/Lagrange.Core.NativeAPI/NativeModel/Common/BotSignProvider.cs +++ b/Lagrange.Core.NativeAPI/NativeModel/Common/BotSignProvider.cs @@ -272,7 +272,8 @@ internal class AndroidSignProvider(string? signUrl) : AndroidBotSignProvider, ID ["seq"] = seq, ["buffer"] = Convert.ToHexString(body.Span), ["guid"] = Convert.ToHexString(Context.Keystore.Guid), - ["version"] = Context.AppInfo.PtVersion + ["version"] = Context.AppInfo.PtVersion, + ["qua"] = Context.AppInfo.Qua }; var response = await _client.PostAsync($"{_url}/sign", new StringContent(payload.ToJsonString(), Encoding.UTF8, "application/json")); @@ -305,7 +306,8 @@ public override async Task GetEnergy(long uin, string data) ["data"] = data, ["guid"] = Convert.ToHexString(Context.Keystore.Guid), ["ver"] = Context.AppInfo.SdkInfo.SdkVersion, - ["version"] = Context.AppInfo.PtVersion + ["version"] = Context.AppInfo.PtVersion, + ["qua"] = Context.AppInfo.Qua }; var response = await _client.PostAsync($"{_url}/energy", new StringContent(payload.ToJsonString(), Encoding.UTF8, "application/json")); @@ -330,7 +332,8 @@ public override async Task GetDebugXwid(long uin, string data) ["uin"] = uin, ["data"] = data, ["guid"] = Convert.ToHexString(Context.Keystore.Guid), - ["version"] = Context.AppInfo.PtVersion + ["version"] = Context.AppInfo.PtVersion, + ["qua"] = Context.AppInfo.Qua }; var response = await _client.PostAsync($"{_url}/get_tlv553", new StringContent(payload.ToJsonString(), Encoding.UTF8, "application/json")); @@ -371,12 +374,10 @@ internal class SignResponse internal static partial class JsonHelper { [JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Default, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] - [JsonSerializable(typeof(AndroidSignProvider.ResponseRoot))] [JsonSerializable(typeof(AndroidSignProvider.ResponseRoot))] [JsonSerializable(typeof(LinuxSignProvider.Root))] [JsonSerializable(typeof(LinuxSignProvider.Response))] - [JsonSerializable(typeof(JsonObject))] [JsonSerializable(typeof(LightApp))] private partial class CoreSerializerContext : JsonSerializerContext; diff --git a/Lagrange.Core.NativeAPI/Program.cs b/Lagrange.Core.NativeAPI/Program.cs index 53beafe..3a805cf 100644 --- a/Lagrange.Core.NativeAPI/Program.cs +++ b/Lagrange.Core.NativeAPI/Program.cs @@ -1,4 +1,5 @@ using System.Runtime.InteropServices; +using System.Text; using Lagrange.Core.Common; using Lagrange.Core.Common.Interface; using Lagrange.Core.NativeAPI.NativeModel.Common; @@ -37,8 +38,9 @@ public static int Initialize(IntPtr botConfigPtr, IntPtr keystorePtr, IntPtr app return index; } + //uin, password皆可选,传入 0 或结构体内Data/Length置0 [UnmanagedCallersOnly(EntryPoint = "Start")] - public static StatusCode Start(int index) + public static StatusCode Start(int index, long uin, ByteArrayNative password) { if (Contexts.Count <= index) { @@ -50,9 +52,22 @@ public static StatusCode Start(int index) return StatusCode.AlreadyStarted; } + if (uin == 0 || password.IsEmpty()) + { + Task.Run(async () => + { + await Contexts[index].BotContext.Login(); + await Task.Delay(Timeout.Infinite); + }); + + return StatusCode.Success; + } + + var passwordData = Encoding.UTF8.GetString(password.ToByteArrayWithoutFree()); + Task.Run(async () => { - await Contexts[index].BotContext.Login(); + await Contexts[index].BotContext.Login(uin, passwordData); await Task.Delay(Timeout.Infinite); }); @@ -80,4 +95,4 @@ public static void FreeMemory(IntPtr ptr) Marshal.FreeHGlobal(ptr); } } -} +} \ No newline at end of file diff --git a/Lagrange.Core.NativeAPI/ReverseEvent/EventEntryPoint.cs b/Lagrange.Core.NativeAPI/ReverseEvent/EventEntryPoint.cs index 343e9ea..2815431 100644 --- a/Lagrange.Core.NativeAPI/ReverseEvent/EventEntryPoint.cs +++ b/Lagrange.Core.NativeAPI/ReverseEvent/EventEntryPoint.cs @@ -172,7 +172,7 @@ public static IntPtr GetBotGroupReactionEvent(int index) return eventPtr; } - + [UnmanagedCallersOnly(EntryPoint = "GetBotGroupRecallEvent")] public static IntPtr GetBotGroupRecallEvent(int index) { @@ -183,7 +183,7 @@ public static IntPtr GetBotGroupRecallEvent(int index) var botGroupRecallEvent = Program.Contexts[index].EventInvoker.BotGroupRecallEvent; - IntPtr eventPtr = GetEventStructPtr(botGroupRecallEvent); + IntPtr eventPtr = GetEventStructPtr(botGroupRecallEvent); return eventPtr; } @@ -369,4 +369,4 @@ private static IntPtr GetEventStructPtr(ReverseEventBase reverseEvent) where return resultPtr; } } -} +} \ No newline at end of file diff --git a/Lagrange.Core/Internal/Services/Login/LoginService.cs b/Lagrange.Core/Internal/Services/Login/LoginService.cs index c994929..a88f958 100644 --- a/Lagrange.Core/Internal/Services/Login/LoginService.cs +++ b/Lagrange.Core/Internal/Services/Login/LoginService.cs @@ -19,10 +19,10 @@ internal class LoginService : BaseService protected override ValueTask> Build(LoginEventReq input, BotContext context) { if (!_packet.IsValueCreated) _packet = new Lazy(() => new WtLogin(context)); - + return input.Cmd switch { - LoginEventReq.Command.Tgtgt => new ValueTask>(_packet.Value.BuildOicq09()), + LoginEventReq.Command.Tgtgt => new ValueTask>(_packet.Value.BuildOicq09()), _ => throw new ArgumentOutOfRangeException(nameof(input), $"Unknown command: {input.Cmd}") }; } @@ -48,7 +48,7 @@ protected override async ValueTask> Build(LoginEventReq inp return input.Cmd switch { - LoginEventReq.Command.Tgtgt => await _packet.Value.BuildOicq09Android(input.Password), + LoginEventReq.Command.Tgtgt => await _packet.Value.BuildOicq09Android(input.Password), LoginEventReq.Command.Captcha => await _packet.Value.BuildOicq02Android(input.Ticket), LoginEventReq.Command.FetchSMSCode => await _packet.Value.BuildOicq08Android(), LoginEventReq.Command.SubmitSMSCode => await _packet.Value.BuildOicq07Android(input.Code), @@ -72,7 +72,7 @@ public static LoginEventResp Parse(WtLogin packet, ReadOnlyMemory input, B var payload = packet.Parse(input.Span, out ushort command); var reader = new BinaryPacket(payload); Debug.Assert(command == 0x810); - + ushort internalCmd = reader.Read(); byte state = reader.Read(); var tlvs = ProtocolHelper.TlvUnPack(ref reader); @@ -83,7 +83,7 @@ public static LoginEventResp Parse(WtLogin packet, ReadOnlyMemory input, B uint _ = errorReader.Read(); // error code string errorTitle = errorReader.ReadString(Prefix.Int16 | Prefix.LengthOnly); string errorMessage = errorReader.ReadString(Prefix.Int16 | Prefix.LengthOnly); - + return new LoginEventResp(state, (errorTitle, errorMessage)); } @@ -93,7 +93,7 @@ public static LoginEventResp Parse(WtLogin packet, ReadOnlyMemory input, B var tlv119 = TeaProvider.CreateDecryptSpan(tgtgt); var tlv119Reader = new BinaryPacket(tlv119); var tlvCollection = ProtocolHelper.TlvUnPack(ref tlv119Reader); - + return new LoginEventResp(state, tlvCollection); } diff --git a/Lagrange.Core/Utility/ProtocolHelper.cs b/Lagrange.Core/Utility/ProtocolHelper.cs index 04e7437..f7d751f 100644 --- a/Lagrange.Core/Utility/ProtocolHelper.cs +++ b/Lagrange.Core/Utility/ProtocolHelper.cs @@ -13,24 +13,24 @@ public static Dictionary TlvUnPack(ref BinaryPacket reader) { ushort tag = reader.Read(); ushort length = reader.Read(); - + var data = new byte[length]; reader.ReadBytes(data.AsSpan()); tlv[tag] = data; } - + return tlv; } - + public static string UInt32ToIPV4Addr(uint i) { Span ip = stackalloc byte[4]; - + ip[0] = (byte)(i & 0xFF); ip[1] = (byte)((i >> 8) & 0xFF); ip[2] = (byte)((i >> 16) & 0xFF); ip[3] = (byte)((i >> 24) & 0xFF); - + return $"{ip[0]}.{ip[1]}.{ip[2]}.{ip[3]}"; } } \ No newline at end of file