지금까지 텔레그램 인증을 완전히 구현할 수 있었지만 요청한 언어(PHP)로는 구현할 수 없었고 vb.Net을 사용했습니다. 하지만 저는 동일한 논리가 적용되어야 한다고 믿습니다.
텔레그램 인증 키 생성
Telegram API는 결코 쉬운 일이 아닙니다. 공원에서. 기존 src 코드를 연구하는 것은 상당히 어려울 수 있습니다(IMHO). 따라서 내 접근 방식은 온라인 API 문서를 연구하고 링크에 설명된 샘플-auth_key를 구현하는 것이었습니다. 아래를 참조하세요.
https://core.telegram.org/mtproto/auth_key
https://core.telegram.org/mtproto/ Samples-auth_key
이 접근 방식을 통해 더 나은 이해와 Telegram API 전반에 걸쳐 사용되는 기본 요소에 대한 소개 및 다음 단계(AuthKey 생성은 시작에 불과하므로 API의 다른 기능 구현)에 필요한 처리를 위해 자체 함수 및 루틴 세트를 구성하는 데 도움이 될 수 있습니다.< ;/p>
1단계
모든 통신은 TCP를 통해 이루어짐 - 한 번 고유한 api_id를 얻었습니다(https://core.telegram.org/api/obtaining_api_id#obtaining-api-id). 테스트에 사용하도록 광고된 다음 IP를 찾을 수 있습니다: 149.154.167.40:433 이 시점에서는 api_id가 필요하지 않습니다. AuthKey
선호하는 Send/Receive TCP 처리 루프 방법 설정
제가 가지고 있는 것은 단순히 바이트를 라이브 소켓으로 보내는 개인 SendData입니다. 위의 IP 주소로 연결
<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
끝 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
End Sub
Private Sub 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
끝 Sub
개인 하위 HandleData(예: SocketAsyncEventArgs)
<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끝 기능
STEP 2
기본 TCP 송수신 루틴 설정을 마치면 준비를 시작할 수 있습니다. 텔레그램으로 보낼 데이터 패킷과 수신된 특정 응답을 처리하기 위한 하위 루틴이 있습니다. ProcessResponse(data)
다음으로 이해해야 할 것은 Telegram이 2가지 광범위한 메시지 범주를 처리한다는 사실입니다.
이것은 auth_key_id =0인 일반 텍스트 메시지입니다. AuthKey를 생성하면 전체적으로 이 유형의 메시지를 사용합니다
암호화됨 - https://core.telegram.org/mtproto/description#encrypted-message-encrypted-data
텔레그램 서버와의 모든 추가 통신은 암호화된 메시지를 통해 이루어집니다
두 메시지 유형을 모두 캡슐화하기 위해 두 개의 클래스를 선택했습니다. 그런 다음 각 유형을 처리하는 두 개의 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 SelectEnd 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()끝 하위
현재는 암호화되지 않은 메시지만 필요합니다
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!