これまでのところ、電報認証を完全に実装できましたが、要求された言語である 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("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(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
エンドサブ
プライベートサブ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
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("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
このステップの最後に、Telegram が期待する形式でデータを埋め込むのに役立つ TcpPack() メソッドが必要です。以下のコードを参照してください。コメント付き
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ログイン後にコピーログイン後にコピー終了Function
ステップ 2
基本的な TCP 送受信ルーチンのセットアップで、準備を開始できます。テレグラムに送信するデータ パケットと、受信した特定の応答を処理するためのサブルーチンがあります。 ProcessResponse(data)
次に理解する必要があるのは、Telegram が 2 つの大きなカテゴリのメッセージを処理するという事実です -
これらは、auth_key_id =0 のプレーン テキスト メッセージであり、AuthKey を生成することでこのタイプのメッセージが全体にわたって使用されます
暗号化 - https://core.telegram.org/mtproto/description#encrypted-message-encrypted-data
Telegram サーバーとの今後の通信はすべて、暗号化されたメッセージを介して行われます
両方のメッセージ タイプをカプセル化するために 2 つのクラスを持つことを選択します。次に、各タイプを処理する 2 つの Send(m) メソッドを用意できます
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 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()ログイン後にコピー終了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 サイトの他の関連記事を参照してください。