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

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

Barbara Streisand
リリース: 2024-12-10 05:45:11
オリジナル
120 人が閲覧しました

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 アドレスに接続されているライブ ソケットにバイトを送信します


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

<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(&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 サイトの他の関連記事を参照してください。

ソース:php.cn
前の記事:PHP の file_get_contents() はカスタム HTTP ヘッダーを送信できますか? 次の記事:Laravel が OSX 上の Mcrypt PHP 拡張機能を認識しないのはなぜですか?
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
関連トピック
詳細>
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート