Bisher konnte ich die Telegram-Autorisierung vollständig umsetzen, allerdings nicht in Ihrer gewünschten Sprache - PHP, ich habe vb.Net verwendet. Ich glaube jedoch, dass die gleiche Logik gelten sollte.
Das Erstellen eines Telegram-Autorisierungsschlüssels
Telegram API ist kein Kinderspiel im Park. Das Studium des vorhandenen Quellcodes könnte (meiner Meinung nach) ziemlich entmutigend sein. Daher bestand mein Ansatz darin, die Online-API-Dokumentation zu studieren und den in den Links beschriebenen „sample-auth_key“ zu implementieren unten.
https://core.telegram.org/mtproto/auth_key
https://core.telegram.org/mtproto/ Samples-auth_key
Mit diesem Ansatz erhalten Sie ein besseres Verständnis und Einführung in die Grundelemente, die in der gesamten Telegram-API verwendet werden, und möglicherweise dabei helfen, Ihre eigenen Funktionen und Routinen zu organisieren, die Sie für die nächsten Schritte benötigen – Implementierung anderer Funktionen der API, da die Generierung eines AuthKey nur der Anfang ist.< ;/p>
Schritt 1
Die gesamte Kommunikation erfolgt einmalig über TCP Sie eine eindeutige api_id erhalten haben (https://core.telegram.org/api/obtaining_api_id#obtaining-api-id), finden Sie die folgende IP, die zur Verwendung in Tests angekündigt wird: 149.154.167.40:433 Die api_id ist zu diesem Zeitpunkt zum Generieren einer nicht erforderlich AuthKey
Richten Sie Ihre bevorzugte Methode der Sende-/Empfangs-TCP-Verarbeitungsschleife ein
was ich habe, ist ein privates SendData, das einfach ein Byte an einen Live-Socket sendet verbunden mit der oben angegebenen IP-Adresse
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">If Not IsConnected() Then Log("Connection Closed!", ConsoleColor.DarkRed) RaiseEvent Disconneted() Exit Sub End If b = TCPPack(b) Dim arg = New SocketAsyncEventArgs With {.RemoteEndPoint = ep} AddHandler arg.Completed, AddressOf IO_Handler arg.SetBuffer(b, 0, b.Length) Try If Not soc.SendAsync(arg) Then IO_Handler(soc, arg) End If If read Then ReadData() End If Catch ex As Exception Log("SendData: " & ex.ToString, ConsoleColor.Red) End Try
Ende Sub
Private Sub ReadData(Optional wait As Integer = 0)
If Not IsConnected() Then Log("Connection Closed!", ConsoleColor.DarkRed) RaiseEvent Disconneted() Exit Sub End If Dim arg = New SocketAsyncEventArgs With {.RemoteEndPoint = ep} AddHandler arg.Completed, AddressOf IO_Handler Dim b(BUFFER_SIZE - 1) As Byte arg.SetBuffer(b, 0, BUFFER_SIZE) Try If Not soc.ReceiveAsync(arg) Then IO_Handler(soc, arg) End If Catch ex As Exception Log("ReadMessages: " & ex.ToString, ConsoleColor.Red) End Try
End Sub
Private Sub IO_Handler(sender As Object, e As SocketAsyncEventArgs)
Log($"{e.LastOperation}:{e.SocketError}:{e.BytesTransferred}", ConsoleColor.Cyan) Select Case e.SocketError Case SocketError.Success Select Case e.LastOperation Case SocketAsyncOperation.Connect 'A socket Connect operation. Log("Connected to " & e.ConnectSocket.RemoteEndPoint.ToString, ConsoleColor.Green) are.Set() Case SocketAsyncOperation.Disconnect, SocketAsyncOperation.Connect RaiseEvent Disconneted() Case SocketAsyncOperation.Receive 'A socket Receive operation. HandleData(e) End Select Case SocketError.ConnectionAborted RaiseEvent Disconneted() End Select
Sub beenden
Privater Sub HandleData(e As SocketAsyncEventArgs)
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">If Not IsConnected() Then Log("Connection Closed!", ConsoleColor.DarkRed) RaiseEvent Disconneted() Exit Sub End If b = TCPPack(b) Dim arg = New SocketAsyncEventArgs With {.RemoteEndPoint = ep} AddHandler arg.Completed, AddressOf IO_Handler arg.SetBuffer(b, 0, b.Length) Try If Not soc.SendAsync(arg) Then IO_Handler(soc, arg) End If If read Then ReadData() End If Catch ex As Exception Log("SendData: " & ex.ToString, ConsoleColor.Red) End TryEnd Sub
Abschließend benötigen wir für diesen Schritt eine TcpPack()-Methode, die uns hilft, unsere Daten in dem von Telegram erwarteten Format aufzufüllen – siehe Code unten mit Kommentaren
If Not IsConnected() Then Log("Connection Closed!", ConsoleColor.DarkRed) RaiseEvent Disconneted() Exit Sub End If Dim arg = New SocketAsyncEventArgs With {.RemoteEndPoint = ep} AddHandler arg.Completed, AddressOf IO_Handler Dim b(BUFFER_SIZE - 1) As Byte arg.SetBuffer(b, 0, BUFFER_SIZE) Try If Not soc.ReceiveAsync(arg) Then IO_Handler(soc, arg) End If Catch ex As Exception Log("ReadMessages: " & ex.ToString, ConsoleColor.Red) End TryNach dem Login kopierenNach dem Login kopierenEnde Funktion
SCHRITT 2
Nachdem die grundlegenden TCP-Sende-/Empfangsroutinen eingerichtet sind, können wir mit der Vorbereitung beginnen Datenpakete zum Senden an Telegram und Unterroutinen zur Verarbeitung der spezifischen empfangenen Antworten - ProcessResponse(data)
Was wir als Nächstes verstehen müssen, ist die Tatsache, dass Telegram zwei große Kategorien von Nachrichten verarbeitet –
Dies sind reine Textnachrichten mit ihrer auth_key_id =0. Beim Generieren eines AuthKey wird dieser Nachrichtentyp durchgehend verwendet
Verschlüsselt - https://core.telegram.org/mtproto/description#encrypted-message-encrypted-data
Die gesamte weitere Kommunikation mit Telegram-Servern erfolgt über verschlüsselte Nachrichten
Ich wähle zwei Klassen, um beide Nachrichtentypen zu kapseln. Ich kann dann zwei Send(m)-Methoden haben, die jeden Typ verarbeiten
Log($"{e.LastOperation}:{e.SocketError}:{e.BytesTransferred}", ConsoleColor.Cyan) Select Case e.SocketError Case SocketError.Success Select Case e.LastOperation Case SocketAsyncOperation.Connect 'A socket Connect operation. Log("Connected to " & e.ConnectSocket.RemoteEndPoint.ToString, ConsoleColor.Green) are.Set() Case SocketAsyncOperation.Disconnect, SocketAsyncOperation.Connect RaiseEvent Disconneted() Case SocketAsyncOperation.Receive 'A socket Receive operation. HandleData(e) End Select Case SocketError.ConnectionAborted RaiseEvent Disconneted() End SelectNach dem Login kopierenNach dem Login kopierenEnd Sub
Private Sub Send(m As EncryptedMessage)
If e.BytesTransferred = 0 Then --no pending data Log("The remote end has closed the connection.") Exit Sub End If Dim len As Integer = e.Buffer(0) Dim start = 1 If len = &H7F Then len = e.Buffer(1) len += e.Buffer(2) << 8 len += e.Buffer(3) << 16 start = 4 End If len = 4 * len Dim data(len - 1) As Byte Array.Copy(e.Buffer, start, data, 0, len) ProcessResponse(data) ReadData()Nach dem Login kopierenEnd Sub
For jetzt ist nur noch UnencryptedMessage erforderlich
Dim a = New List(Of Byte) Dim len = CByte(b.Length / 4) If efSent = False Then --TCP abridged version efSent = True a.Add(&HEF) End If If len >= &H7F Then a.Add(&H7F) a.AddRange(BitConverter.GetBytes(len)) Else a.Add(len) End If a.AddRange(b) --only data, no sequence number, no CRC32 Return a.ToArrayDas obige ist der detaillierte Inhalt vonWie erstelle ich einen Telegram-Autorisierungsschlüssel in VB.Net?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!