Maison >développement back-end >tutoriel php >Comment générer une clé d'autorisation de télégramme dans VB.Net ?

Comment générer une clé d'autorisation de télégramme dans VB.Net ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-10 05:45:11122parcourir

How to Generate a Telegram Authorization Key in VB.Net?

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


<pre class="brush:php;toolbar:false">If Not IsConnected() Then
    Log(&quot;Connection Closed!&quot;, 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(&quot;SendData: &quot; &amp; ex.ToString, ConsoleColor.Red)
End Try

End Sub

Private Sub ReadData (attente facultative en tant qu'entier = 0)

If Not IsConnected() Then
    Log(&quot;Connection Closed!&quot;, 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(&quot;ReadMessages: &quot; &amp; 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($&quot;{e.LastOperation}:{e.SocketError}:{e.BytesTransferred}&quot;, ConsoleColor.Cyan)

Select Case e.SocketError
    Case SocketError.Success
        Select Case e.LastOperation
            Case SocketAsyncOperation.Connect 'A socket Connect operation.
                Log(&quot;Connected to &quot; &amp; 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)

<pre class="brush:php;toolbar:false">If Not IsConnected() Then Log(&quot;Connection Closed!&quot;, 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(&quot;SendData: &quot; &amp; ex.ToString, ConsoleColor.Red) End Try

End 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(&quot;Connection Closed!&quot;, 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(&quot;ReadMessages: &quot; &amp; ex.ToString, ConsoleColor.Red)
End Try

Fin 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 -


< p>Non crypté - https://core.telegram.org/mtproto/description#unencrypted-message


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($&quot;{e.LastOperation}:{e.SocketError}:{e.BytesTransferred}&quot;, ConsoleColor.Cyan)

Select Case e.SocketError
    Case SocketError.Success
        Select Case e.LastOperation
            Case SocketAsyncOperation.Connect 'A socket Connect operation.
                Log(&quot;Connected to &quot; &amp; 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 Send(m As EncryptedMessage)

If e.BytesTransferred = 0 Then --no pending data
    Log(&quot;The remote end has closed the connection.&quot;)
    Exit Sub
End If

Dim len As Integer = e.Buffer(0)
Dim start = 1

If len = &amp;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()

Fin 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.ToArray

Ce 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn