Jusqu'à présent, j'ai pu implémenter complètement l'autorisation de télégramme, mais pas dans la langue demandée - PHP, j'ai utilisé vb.Net. Cependant, je pense que la même logique devrait s'appliquer.
Créer une clé d'autorisation Telegram
L'API Telegram n'est pas une promenade. dans le parc. Étudier le code src existant pourrait être assez intimidant (à mon humble avis). Mon approche consistait donc à étudier la documentation de l'API en ligne et à implémenter le sample-auth_key décrit dans les liens. ci-dessous.
https://core.telegram.org/mtproto/auth_key
https://core.telegram.org/mtproto/ samples-auth_key
Ce que cette approche donnera vous permettra de mieux comprendre et d'introduire les primitives utilisées dans l'API Telegram, et éventuellement de vous aider à commencer à organiser votre propre ensemble de fonctions et de routines à gérer dont vous aurez besoin pour les prochaines étapes - implémentation d'autres fonctionnalités de l'API, depuis la génération d'une AuthKey n'est que le début.
Étape 1
Toutes les communications se font via TCP - Une fois que vous avez obtenu un api_id unique (https://core.telegram.org/api/obtaining_api_id#obtaining-api-id) vous trouverez l'adresse IP suivante annoncée pour une utilisation dans les tests : 149.154.167.40:433 L'api_id n'est pas requis à ce stade pour générer une AuthKey
Configurez votre méthode préférée de boucle de traitement TCP d'envoi/réception
ce que j'ai est un SendData privé qui simplement envoie un octet à un socket en direct connecté à l'adresse IP indiquée ci-dessus
<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
End Sub
Private Sub ReadData (attente facultative en tant qu'entier = 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
Fin de l'abonnement
Abon privé IO_Handler (expéditeur en tant qu'objet, e en tant que 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
End Sub
Private Sub HandleData (e en tant que 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
Enfin pour cette étape, nous avons besoin d'une méthode TcpPack() qui nous aide à remplir nos données dans le format attendu par Telegram - voir le code ci-dessous avec commentaires
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 TryCopier après la connexionCopier après la connexionFin Fonction
ÉTAPE 2
Avec la configuration de base des routines d'envoi/réception TCP, nous pouvons commencer à préparer paquets de données à envoyer au télégramme et disposer de sous-routines pour gérer les réponses spécifiques reçues - ProcessResponse(data)
Ce que nous devons ensuite comprendre, c'est le fait que Telegram gère 2 grandes catégories de messages -
Ce sont des messages en texte brut avec leur auth_key_id =0 générant une AuthKey utilise ce type de message tout au long
Crypté - https://core.telegram.org/mtproto/description#encrypted-message-encrypted-data
Toutes les autres communications avec les serveurs Telegram se feront via des messages cryptés
J'ai choisi d'avoir deux classes pour encapsuler les deux types de messages. Je peux alors avoir deux méthodes Send(m) qui gèrent chaque type
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 SelectCopier après la connexionCopier après la connexionEnd 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()Copier après la connexionFin Sub
Pour l'instant, seul UnencryptedMessage est requis
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.ToArrayCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!