>백엔드 개발 >PHP 튜토리얼 >VB.Net에서 전보 인증 키를 생성하는 방법은 무엇입니까?

VB.Net에서 전보 인증 키를 생성하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-10 05:45:11129검색

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

지금까지 텔레그램 인증을 완전히 구현할 수 있었지만 요청한 언어(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(&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

끝 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

End Sub

Private Sub 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

끝 Sub

개인 하위 HandleData(예: 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

끝 기능


STEP 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


텔레그램 서버와의 모든 추가 통신은 암호화된 메시지를 통해 이루어집니다


두 메시지 유형을 모두 캡슐화하기 위해 두 개의 클래스를 선택했습니다. 그런 다음 각 유형을 처리하는 두 개의 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()

끝 하위


현재는 암호화되지 않은 메시지만 필요합니다


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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.