Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk Menjana Kunci Kebenaran Telegram dalam VB.Net?
Setakat ini saya telah dapat melaksanakan kebenaran telegram sepenuhnya, tetapi tidak dalam bahasa yang anda minta - PHP, saya menggunakan vb.Net. Walau bagaimanapun, saya percaya logik yang sama harus digunakan.
Membuat Kunci Keizinan Telegram
API Telegram bukan perkara biasa di taman. Mempelajari kod src sedia ada boleh menjadi agak menakutkan (IMHO). Oleh itu pendekatan saya adalah untuk mengkaji dokumentasi API dalam talian dan melaksanakan sample-auth_key yang digariskan dalam pautan di bawah.
https://core.telegram.org/mtproto/auth_key
https://core.telegram.org/mtproto/ samples-auth_key
Apa pendekatan ini akan berikan kepada anda ialah pemahaman dan pengenalan yang lebih baik kepada primitif yang digunakan di seluruh API Telegram, dan mungkin membantu anda mula mengatur set fungsi dan rutin anda sendiri untuk mengendalikan yang anda perlukan untuk langkah seterusnya - melaksanakan ciri API yang lain, kerana menjana AuthKey hanyalah permulaan.
Langkah 1
Semua Komunikasi adalah melalui TCP - Setelah anda memperoleh api_id unik (https://core.telegram.org/api/obtaining_api_id#obtaining-api-id) anda akan mendapati IP berikut diiklankan untuk digunakan dalam ujian: 149.154.167.40:433 Api_id tidak diperlukan pada ketika ini untuk menghasilkan AuthKey
Sediakan kaedah pilihan anda untuk Hantar/Terima TCP Gelung pemprosesan
🎜>apa yang saya ada ialah peribadi SendData yang hanya menghantar bait ke soket langsung yang disambungkan ke alamat IP yang diberikan di atas
<br><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 SubPrivate Sub ReadData(Pilihan tunggu Sebagai 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 TryTamatkan SubPersendirian Sub IO_Handler(pengirim Sebagai Objek, 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 SelectEnd SubSub HandleData(e As SocketAsyncEventArgs)
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
Tamatkan Sub
Akhir sekali untuk langkah ini, kami memerlukan kaedah TcpPack() yang membantu kami mengisi data kami dalam format yang Telegram jangkakan - lihat kod di bawah dengan ulasan
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
Tamat Fungsi
LANGKAH 2
Dengan persediaan rutin hantar/terima TCP asas, kita boleh mula menyediakan paket data untuk dihantar ke telegram dan mempunyai sub rutin untuk mengendalikan respons khusus yang diterima - ProcessResponse(data)
Apa yang perlu kita fahami seterusnya ialah hakikat bahawa Telegram mengendalikan 2 kategori luas mesej -
Ini adalah mesej teks biasa dengan auth_key_id =0 menjana AuthKey menggunakan jenis mesej ini sepanjang
Disulitkan - https://core.telegram.org/mtproto/description#encrypted-message-encrypted-data
Semua komunikasi lanjut dengan Pelayan Telegram akan melalui mesej yang disulitkan
Saya memilih untuk mempunyai dua kelas untuk merangkum kedua-dua jenis mesej. Saya kemudiannya boleh mempunyai dua kaedah Send(m) yang mengendalikan setiap jenis
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 SelectEnd Sub
Spribadi 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()Tamat Sub
Buat masa ini hanya UnencryptedMessage diperlukan
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.ToArrayAtas ialah kandungan terperinci Bagaimana untuk Menjana Kunci Kebenaran Telegram dalam VB.Net?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!