ホームページ >バックエンド開発 >PHPチュートリアル >VB.Net でテレグラム認証キーを生成するにはどうすればよいですか?

VB.Net でテレグラム認証キーを生成するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-10 05:45:11121ブラウズ

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

これまでのところ、電報認証を完全に実装できましたが、要求された言語である PHP では実装できず、vb.Net を使用しました。ただし、同じロジックが適用されるはずだと思います。


Telegram 認証キーの作成


Telegram API は簡単ではありません。公園で。既存の src コードを研究するのは非常に困難になる可能性があります (私見)。したがって、私のアプローチは、オンライン API ドキュメントを研究し、リンクで概説されているサンプル認証キーを実装することでした。以下。


https://core.telegram.org/mtproto/auth_key


https://core.telegram.org/mtproto/ Samples-auth_key


このアプローチで得られるものTelegram API 全体で使用されるプリミティブについての理解と入門が深まり、次のステップ (AuthKey の生成以降の API の他の機能の実装) で必要となる独自の関数とルーチンのセットを整理し始めるのに役立つ可能性があります。


ステップ1


すべての通信は TCP 経由です - 一意の api_id を取得したら (https://core.telegram.org/api/obtaining_api_id#obtaining-api-id)テストで使用するためにアドバタイズされている次の IP が見つかります。 149.154.167.40:433 この時点では、AuthKey の生成に api_id は必要ありません


送受信 TCP 処理ループの好みの方法を設定します


私が持っているのはプライベート SendData です。上記の指定された IP アドレスに接続されているライブ ソケットにバイトを送信します


<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(Optional wait As Integer = 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

エンドサブ

プライベートサブIO_Handler(sender As Object, e As 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 As 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

このステップの最後に、Telegram が期待する形式でデータを埋め込むのに役立つ TcpPack() メソッドが必要です。以下のコードを参照してください。コメント付き


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

終了Function


ステップ 2


基本的な TCP 送受信ルーチンのセットアップで、準備を開始できます。テレグラムに送信するデータ パケットと、受信した特定の応答を処理するためのサブルーチンがあります。 ProcessResponse(data)


次に理解する必要があるのは、Telegram が 2 つの大きなカテゴリのメッセージを処理するという事実です -


< p>暗号化されていない - https://core.telegram.org/mtproto/description#unencrypted-message


これらは、auth_key_id =0 のプレーン テキスト メッセージであり、AuthKey を生成することでこのタイプのメッセージが全体にわたって使用されます

暗号化 - https://core.telegram.org/mtproto/description#encrypted-message-encrypted-data


Telegram サーバーとの今後の通信はすべて、暗号化されたメッセージを介して行われます


両方のメッセージ タイプをカプセル化するために 2 つのクラスを持つことを選択します。次に、各タイプを処理する 2 つの Send(m) メソッドを用意できます


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()

終了Sub


現時点では UnencryptedMessage のみが必要です


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

以上がVB.Net でテレグラム認証キーを生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。