दिलचस्प पोस्ट
रोलिंग या विंडो इटरेटर रोलिंग? pysqlite: स्तंभ या मेज के नाम के लिए प्लेसहोल्डर प्रतिस्थापन? क्या सीएमडी.एक्सए के लिए उपयोगिता है? सुनना गर्तिका साझा करने के लिए कई प्रक्रियाओं का एक तरीका है? सी में सॉकेट्स के माध्यम से एक संरचना उत्तीर्ण करना सी ++ क्रॉस-कंपाइलर विंडोज से लिनक्स अजगर डेकोरेटर के लिए अतिरिक्त तर्क कैसे पास करें? मूल्य पर आधारित बहुआयामी-सरणी से तत्व हटाएं MySQL में लैग फ़ंक्शन को सिमुलेट करें जब जावा में बुलाया अंतिम रूप () विधि है? गिट / मर्कुरियल / बाज़ार बनाम की लोकप्रियता, जो कि जावा में स्विंग जीयूआई के लिए पृष्ठभूमि के रूप में एक छवि कैसे सेट करें? एचटीएमएल बटन एक एमवीसी नियंत्रक और क्रिया विधि बुलाते हैं डुप्लिकेट कीज़ के साथ नक्शा कार्यान्वयन JInternalFrame और कुछ बटन का उपयोग करना

टेलीग्राम एपीआई का उपयोग करने के लिए प्राधिकरण कैसे कार्यान्वित करें?

मैं टेलीग्राम REST API के साथ संपर्क के लिए PHP का उपयोग करके कई प्राधिकरण को लागू करना चाहता हूं।

क्या काम मैं हल करने की कोशिश कर रहा हूँ? खैर, यह आसान है: कई दर्जनों उपयोगकर्ता (उनमें से सभी के पास यहां एक वर्गीय समूह है (+10, -2, +1 1000 इत्यादि), प्रासंगिक समूह वर्गीकरण: वेब-मास्टर और ग्राहकों के साथ) मेरी वेबसाइट पर एक उपयोगकर्ता प्रोफ़ाइल है। वे एक निश्चित राशि तक पहुंचने के बाद और जब से वे अपने प्रोफाइल में अधिकृत हैं, तब वे स्वयं के लिए बनाई गई टेलीग्राम के आधार पर निजी चैट में शामिल हो जाते हैं।

कुछ शोध के बाद, मुझे पता चला कि यह बहुत जटिल है क्योंकि:

  1. हार्डवेयर-बाइंडेड सोशल नेटवर्क के लिए मुझे एपीआई कार्यान्वयन का कोई अनुभव नहीं हुआ है।
  2. मैंने https://core.telegram.org/api/auth पर एक नज़र लिया, लेकिन यह PHP या किसी भी अन्य भाषा का उपयोग करके इन फ़ंक्शंस (उदाहरण के लिए auth.sendCode) को कार्यान्वित करने के लिए पूरी तरह अकारण है। यदि ये कमांड को सर्वर पर JSON के रूप में भेजा जाना चाहिए, तो यह JSON जैसा नहीं दिखता है:

    auth.sentCode#efed51d9 phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode; 

    यह क्या है? किस भाषा में लिखा है?

    यूपीडी: यह टीएल (प्रकार भाषा) में लिखा गया है: https://core.telegram.org/mtproto/TL

  3. मैंने कई ग्राहकों (वेबोग्राम, टेलीग्राम-सीएलआई (टीजी), टीडीएसकेटॉप) के स्रोत कोड का पता लगाया है, और मुझे https://core.telegram.org/mtproto के कई कार्यान्वयन मिले

दुर्भाग्य से, उनमें से कोई भी उनके पक्ष में कई प्राधिकरण का समर्थन नहीं करता है, और थोड़ा शोध करने के बाद, मुझे पता नहीं है कि अधिक जानकारी प्राप्त करने के लिए गहराई से कहाँ जाना है।

इसके अलावा, ये लागू होते हैं भारी और परिसर (उदाहरण के लिए, https://github.com/vysheng/tg ): यहां छवि विवरण दर्ज करें

वहां मैं सर्वरों का गुच्छा देखता हूं (./tg/tgl/tgl.h):

 #define TG_SERVER_1 "149.154.175.50" #define TG_SERVER_2 "149.154.167.51" #define TG_SERVER_3 "149.154.175.100" #define TG_SERVER_4 "149.154.167.91" #define TG_SERVER_5 "149.154.171.5" 

मुझे कई संभावित उपयुक्त कार्य (./tg/tgl/queries.c) मिले हैं:

 void empty_auth_file (void) { if (TLS->test_mode) { bl_do_dc_option (TLS, 1, "", 0, TG_SERVER_TEST_1, strlen (TG_SERVER_TEST_1), 443); bl_do_dc_option (TLS, 2, "", 0, TG_SERVER_TEST_2, strlen (TG_SERVER_TEST_2), 443); bl_do_dc_option (TLS, 3, "", 0, TG_SERVER_TEST_3, strlen (TG_SERVER_TEST_3), 443); bl_do_set_working_dc (TLS, TG_SERVER_TEST_DEFAULT); } else { bl_do_dc_option (TLS, 1, "", 0, TG_SERVER_1, strlen (TG_SERVER_1), 443); bl_do_dc_option (TLS, 2, "", 0, TG_SERVER_2, strlen (TG_SERVER_2), 443); bl_do_dc_option (TLS, 3, "", 0, TG_SERVER_3, strlen (TG_SERVER_3), 443); bl_do_dc_option (TLS, 4, "", 0, TG_SERVER_4, strlen (TG_SERVER_4), 443); bl_do_dc_option (TLS, 5, "", 0, TG_SERVER_5, strlen (TG_SERVER_5), 443); bl_do_set_working_dc (TLS, TG_SERVER_DEFAULT); } } void bl_do_dc_option (struct tgl_state *TLS, int id, const char *name, int l1, const char *ip, int l2, int port) { struct tgl_dc *DC = TLS->DC_list[id]; if (DC && !strncmp (ip, DC->ip, l2)) { return; } clear_packet (); out_int (CODE_binlog_dc_option); out_int (id); out_cstring (name, l1); out_cstring (ip, l2); out_int (port); add_log_event (TLS, packet_buffer, 4 * (packet_ptr - packet_buffer)); } 

आदि।

एकाधिक यूज़र ऑथ कार्यान्वयन के लिए PHP में मुझे किस फाइल को स्थानांतरित करना चाहिए? क्या आप कृपया मुझे यह जानने में मदद करें कि आप कहां शुरू कर सकते हैं और यह वर्तमान में जितना आसान बना सकता है?

आपका अग्रिम में ही बहुत धन्यवाद!

वेब के समाधान से एकत्रित समाधान "टेलीग्राम एपीआई का उपयोग करने के लिए प्राधिकरण कैसे कार्यान्वित करें?"

अब तक मैं टेलीग्राम प्राधिकरण को पूरी तरह लागू करने में सक्षम रहा हूं, लेकिन आपकी अनुरोधित भाषा में नहीं – PHP, मैंने vb.Net का इस्तेमाल किया। हालांकि, मेरा मानना ​​है कि उसी तर्क को लागू करना चाहिए।

टेलीग्राम प्राधिकरण कुंजी बनाना

टेलीग्राम एपीआई पार्क में नहीं चल रहा है। मौजूदा स्रोत कोड का अध्ययन करना काफी मुश्किल हो सकता है (आईएमएचओ) इसलिए मेरा दृष्टिकोण ऑनलाइन एपीआई दस्तावेज का अध्ययन करना था और नीचे दी गई लिंक्स में दिए गए नमूना- auth_key को लागू करना था।

https://core.telegram.org/mtproto/auth_key

https://core.telegram.org/mtproto/samples-auth_key

यह दृष्टिकोण आपको क्या देगा टेलीग्राम एपीआई में प्रयुक्त primitives के लिए एक बेहतर समझ और परिचय है, और संभवतः आप अपने खुद के सेट और व्यवस्थित कार्यों को व्यवस्थित करने में मदद कर सकते हैं जो आपको अगले चरणों के लिए आवश्यक होगा – एपीआई के अन्य सुविधाओं को लागू करना , एक AuthKey पैदा करने के बाद से सिर्फ शुरुआत है

चरण 1

सभी संचार टीसीपी के माध्यम से होता है – एक बार जब आप एक अद्वितीय एपीआईआईडी ( https://core.telegram.org/api/obtaining_api_id#obtaining-api-id ) प्राप्त कर चुके हैं, तो आपको परीक्षण में उपयोग के लिए निम्नलिखित आईपी का विज्ञापन मिलेगा: 14 9 .154.167.40: 433 इस AuthKey को उत्पन्न करने के लिए इस बिंदु पर api_id की आवश्यकता नहीं है

टीसीपी प्रसंस्करण लूप भेजें / प्राप्त करने की अपनी पसंदीदा विधि सेटअप करें

मेरे पास क्या एक निजी सेडडाटा है जो बस एक बाइट को ऊपर से आईपी पते को देने से जुड़े लाइव सॉकेट में भेजता है

 Private Sub SendData(b() As Byte, Optional read As Boolean = 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 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 End Sub Private Sub HandleData(e As SocketAsyncEventArgs) 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() End Sub 

अंत में इस चरण के लिए, हमें एक टीसीपीपीक () विधि की आवश्यकता है जो टेलीग्राम की अपेक्षा प्रारूप में हमारे डेटा को पैड करने में हमारी सहायता करता है – नीचे टिप्पणी के साथ कोड देखें

 Private Function TCPPack(b As Byte()) As Byte() 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 End Function 

चरण 2

मूल टीसीपी भेजने / प्राप्त करने के लिए रूटीन सेटअप के साथ, हम टेलीग्राम भेजने के लिए डाटा पैकेट तैयार करना शुरू कर सकते हैं और प्राप्त विशिष्ट प्रतिक्रियाओं से निपटने के लिए उप दिनचर्या – प्रक्रिया (डेटा)

हमें आगे समझने की क्या ज़रूरत है तथ्य यह है कि टेलीग्राम संदेशों के 2 व्यापक श्रेणियों को संभालता है –

अनएन्क्रिप्टेड- https://core.telegram.org/mtproto/description#unencrypted-message

ये auth_key_id =0 टेक्स्ट मैसेज हैं, उनके auth_key_id =0 जो कि AuthKey उत्पन्न करता है, इस प्रकार के संदेश को पूरे समय में उपयोग करता है

एन्क्रिप्ट किया गयाhttps://core.telegram.org/mtproto/description#encrypted-message-encrypted- डेटा

टेलीग्राम सर्वर के साथ आगे की सभी संचार एन्क्रिप्टेड संदेशों के माध्यम से होगा

मैं दोनों प्रकार के संदेशों को इनक्यूबेट करने के लिए दो कक्षाएं चुनना चाहता हूं I मेरे पास दो प्रकार (एम) तरीके हैं जो प्रत्येक प्रकार के हैंडल करते हैं I

 Private Sub Send(m As UnencryptedMessage) Log(m.ToString, ConsoleColor.DarkYellow, logTime:=False) SendData(m.data, True) End Sub Private Sub Send(m As EncryptedMessage) Log(m.ToString, ConsoleColor.DarkYellow, logTime:=False) SendData(m.data, True) End Sub 

अभी के लिए केवल अनएन्क्रिप्टेड मेसेज आवश्यक है

 Public Class UnencryptedMessage Public Property auth_key_id As Int64 Public Property message_id As Int64 Public Property data_length As Int32 Public Property message_data As Byte() Public Property message_type As String Public Property data As Byte() = {} Sub New(auth_key As Int64, message_id As Int64, data As Byte()) _auth_key_id = auth_key _message_id = message_id _data_length = data.Length _message_data = data message_type = B2Hr(data, 0, 4) Dim a = New List(Of Byte) a.AddRange(BitConverter.GetBytes(auth_key_id)) --{0, 0, 0, 0, 0, 0, 0, 0} a.AddRange(BitConverter.GetBytes(message_id)) a.AddRange(BitConverter.GetBytes(data_length)) a.AddRange(message_data) Me.data = a.ToArray End Sub Sub New(b As Byte()) data = b Dim skip = 0 _auth_key_id = BitConverter.ToInt64(b, skip) : skip += 8 _message_id = BitConverter.ToInt64(b, skip) : skip += 8 _data_length = BitConverter.ToInt32(b, skip) : skip += 4 ReDim _message_data(_data_length - 1) Array.Copy(b, skip, _message_data, 0, b.Length - skip) message_type = B2Hr(_message_data, 0, 4) End Sub Public Overrides Function ToString() As String Return $" raw_data: {B2H(data)} auth_key_id: {i2H(auth_key_id)} {auth_key_id} message_id: {i2H(message_id)} {message_id} data_length: {i2H(data_length)} {data_length} message_data: {B2H(message_data)} message_type: {message_type} " End Function End Class 

चरण 3

अब हम https://core.telegram.org/mtproto/auth_key में दिए गए चरणों की श्रृंखला का अनुसरण करते हैं

1) ग्राहक सर्वर से क्वेरी भेजता है

req_pq # 60469778 nonce: int128 = ResPQ क्लाइंट (यादृच्छिक संख्या) द्वारा नॉन का मान बेतरतीब ढंग से चुना जाता है और इस संचार के भीतर क्लाइंट को पहचानता है। इस कदम के बाद, यह सभी के लिए जाना जाता है।

2) सर्वर फॉर्म की प्रतिक्रिया भेजता है

resPQ # 05162463 नहीं: int128 server_nonce: int128 pq: स्ट्रिंग server_public_key_fingerprints: वेक्टर लंबा = ResPQ

इसके लिए मेरा दृष्टिकोण बहुत सरल है:

 Sub RequestPQAuthorization() Send(MTProto.req_pq) End Sub 

एमटीपीआरटो नामक एक कक्षा में मैं विनिमय के प्रत्येक चरण के अनुसार साझा कार्यों का एक सेट लागू करता हूं। प्रत्येक पद्धति बस एक एन्क्रिप्टेड डेटा संरचना का निर्माण कर रही है जो कि ऊपर की आवश्यकता के अनुसार भेजा जाएगा

हम शुरू करते हैं: req_pq

 Shared Function req_pq(Optional nonce As Byte() = Nothing) As UnencryptedMessage --req_pq#60469778 --nonce:int128 If nonce Is Nothing Then ReDim nonce(15) RND.NextBytes(nonce) End If Dim d = New List(Of Byte) d.AddRange({120, 151, 70, 96}) --60469778 d.AddRange(nonce) Return New UnencryptedMessage(0, CreateMessageId, d.ToArray) End Function Private Shared Function CreateMessageId() As Int64 Return CLng((Date.UtcNow.Ticks - ZERO_TICK) * 429.4967296) End Function Public Const ZERO_TICK = 621355968000000000 -- ie 1970-01-01T00:00:00Z (January 1, 1970, at 12:00 AM UTC) 

अब चरण 1 से हमारी प्रक्रिया प्रतिक्रिया विधि

 Private Sub ProcessResponse(data As Byte()) Try Dim r = New UnencryptedMessage(data) Log(r.ToString, ConsoleColor.Yellow, logTime:=False) Select Case r.message_type Case resPQ.Classid RequestDHKeyExchange(New resPQ(r.message_data)) Case server_DH_params_ok.Classid RequestSetDH_params(New server_DH_params_ok(r.message_data), new_nonce) Case server_DH_params_fail.Classid Log(New server_DH_params_fail(r.message_data).ToString, ConsoleColor.DarkMagenta) Case dh_gen_ok.Classid Log(New dh_gen_ok(r.message_data).ToString, ConsoleColor.Green) Case dh_gen_retry.Classid Log(New dh_gen_retry(r.message_data).ToString, ConsoleColor.DarkMagenta) Case dh_gen_fail.Classid Log(New dh_gen_fail(r.message_data).ToString, ConsoleColor.DarkMagenta) Case Else Log($"Unhandled type: {r.message_type}", ConsoleColor.Magenta) End Select Catch ex As Exception Log($"Error: {ex.ToString}", ConsoleColor.Red) Log(B2H(data), ConsoleColor.DarkRed, logTime:=False) End Try End Sub 

अभी तक महान, प्रत्येक प्रतिक्रिया में एक message_type कोड है

हम उस पर स्विच कर सकते हैं और यह निर्धारित कर सकते हैं कि प्रत्येक को कैसे नियंत्रित किया जाता है। हमें अभी भी resPQ पर प्रक्रिया करने की आवश्यकता है

मैंने जो कुछ किया है वह उन कक्षाओं का ए सेट तैयार करना है जो प्रत्येक एक विशिष्ट प्रतिक्रिया प्रकार का संचालन करते हैं

 ''' <summary> ''' resPQ#05162463 ''' nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector long = ResPQ ''' </summary> Public NotInheritable Class resPQ : Inherits TLObject Public Shared Shadows ReadOnly Property Classid As String = "05162463" Public Property nonce As Byte() Public Property server_nonce As Byte() Public Property pq As Byte() Public Property fingerprints As List(Of UInt64) Public Property count As Int32 Sub New(data As Byte()) Dim skip = 4 nonce = Slice(data, skip, 16) : skip += 16 server_nonce = Slice(data, skip, 16) : skip += 16 skip += 1 'length of pq:string pq = Slice(data, skip, 8) : skip += 8 skip += 3 'padding to complete the 4-bytes skip += 4 '%(Vector long) 1cb5c415 count = i32r(data, skip) : skip += 4 fingerprints = New List(Of UInt64) For i = 0 To count - 1 fingerprints.Add(u64r(data, skip)) Next End Sub Public Overrides Function ToString() As String Return $" classid: {NameOf(resPQ)}#{Classid} nonce: {B2H(nonce)} server_nonce: {B2H(server_nonce)} pq: {B2H(pq)} {u64(pq)} count: {i2H(count)} {count} fingerprints: {i2H(fingerprints(0))} {fingerprints(0)} " End Function End Class 

प्रत्येक इस सरल वस्तु पर आधारित है

 Public MustInherit Class TLObject Public Shared Property ClassId As String Public MustOverride Overrides Function ToString() As String End Class 

इस पर बिल्डिंग, हम कदम 3 और 4 से निपटते हैं

काम का सबूत 3) क्लाइंट पीक को प्रधान कारकों में खिसकता है जैसे कि p <q

यह डिफी-हेलमैन कुंजी एक्सचेंजों का एक दौर शुरू करता है

काम का प्रमाण प्रस्तुत करना; सर्वर प्रमाणीकरण 4) क्लाइंट सर्वर से क्वेरी भेजता है

req_DH_params # d712e4be अस्वीकार: int128 server_nonce: int128 p: स्ट्रिंग q: स्ट्रिंग public_key_fingerprint: लंबा एन्क्रिप्टेड_डेटा: string = Server_DH_Params

इसे यहां शुरू किया गया है RequestDHKeyExchange(New resPQ(r.message_data)) में ऊपर मेरी RequestDHKeyExchange(New resPQ(r.message_data)) रूटीन में

 Sub RequestDHKeyExchange(r As resPQ) Log(r.ToString, ConsoleColor.Gray, logTime:=False) 'decompose prime cofactors Dim pp = New PrimeProduct(r.pq) Log(pp.ToString, ConsoleColor.Gray, logTime:=False) 'encrypted_data Generation Dim pq = New P_Q_inner_data(r.pq, pp.p, pp.q, r.nonce, r.server_nonce) new_nonce = pq.new_nonce 'The serialization Of P_Q_inner_data produces some String data. This Is followed by encrypted_data 'data_with_hash := SHA1(data) + data + (any random bytes); such that the length equal 255 Dim data_with_hash = New List(Of Byte) 'SHA1(data) = xxx- 40 =20 bytes Using sha1 = New SHA1Managed Dim b = pq.ToBytes data_with_hash.AddRange(sha1.ComputeHash(b)) data_with_hash.AddRange(b) End Using If data_with_hash.Count < 255 Then Dim pad(255 - data_with_hash.Count - 1) As Byte RND.NextBytes(pad) data_with_hash.AddRange(pad) End If 'RSA(data_with_hash, server_public_key) = xxx - 512 = 256 bytes Dim key = i2H(r.fingerprints(0)) 'c3b42b026ce86b21 Dim zb = Crypto.rsaEncrypt(data_with_hash.ToArray, key) Send(MTProto.req_DH_params(r.nonce, r.server_nonce, pp.p, pp.q, r.fingerprints(0), zb)) End Sub 

आप इस लाइन Dim pp = New PrimeProduct(r.pq) को बदलने के लिए प्रधान-अपघटन के अपने खुद के कार्यान्वयन का उपयोग कर सकते हैं।

यहां पोलार्डबेंट (पोलार्ड रो ब्रेंट इंटीजर फैक्टराइजेशन ) का इस्तेमाल करते हुए मैंने यह कैसे सीखा है इसका एक उदाहरण है https://stackoverflow.com/a/31978350/44080

ठीक है, अगर आप इस बिंदु तक का अनुसरण कर सकते हैं, तो आपके पास एक सामान्य विचार है कि मैं कैसे AuthKey कार्यान्वयन कदम से कदम उठा रहा हूं।

आपको बाकी 5- 9 चरणों में चलने में सक्षम होना चाहिए यह मेरे लिए बहुत कुछ है …

अगर यह जवाब अब तक किसी के लिए किसी भी मदद का है, तो मैं शेष भाग को व्यवस्थित और पोस्ट करने के लिए समय निकालना चाहता हूं।

मेरा मानना ​​है कि जिस मार्गिक और ज्ञान को आप जिस तरह से बनाते हैं, आपको वह उपकरण देना चाहिए, जिसे आपको अपने स्वयं के स्वतंत्र टेलीग्राम एपीआई कोड को समझना और लागू करना चाहिए।

पूर्ण इंटरैक्शन डंप

 03:33:26.591 Connect:Success:0 03:33:26.593 Connected to 149.154.167.40:443 03:33:26.598 raw_data: 000000000000000000DC799836FE075614000000789746604479257F6C01C039A3DEAD031BC2D6A4 auth_key_id: 0000000000000000 0 message_id: 5607FE369879DC00 6199202922538589184 data_length: 00000014 20 message_data: 789746604479257F6C01C039A3DEAD031BC2D6A4 message_type: 60469778 03:33:26.600 Send:Success:42 03:33:26.735 Receive:Success:85 03:33:26.737 raw_data: 0000000000000000015CF64539FE075640000000632416054479257F6C01C039A3DEAD031BC2D6A44F9DB065B36308CF4D9965725DD7153D0818DDCAF407B7CDCD00000015C4B51C01000000216BE86C022BB4C3 auth_key_id: 0000000000000000 0 message_id: 5607FE3945F65C01 6199202934039141377 data_length: 00000040 64 message_data: 632416054479257F6C01C039A3DEAD031BC2D6A44F9DB065B36308CF4D9965725DD7153D0818DDCAF407B7CDCD00000015C4B51C01000000216BE86C022BB4C3 message_type: 05162463 03:33:26.743 classid: resPQ#05162463 nonce: 4479257F6C01C039A3DEAD031BC2D6A4 server_nonce: 4F9DB065B36308CF4D9965725DD7153D pq: 18DDCAF407B7CDCD 1791811376213642701 count: 00000001 1 fingerprints: C3B42B026CE86B21 14101943622620965665 03:33:26.810 PQ: 18DDCAF407B7CDCD 1791811376213642701 P: 45F57B87 1173715847 Q: 5AFE490B 1526614283 03:33:26.930 raw_data: auth_key_id: 0000000000000000 0 message_id: 5607FE36EE3C4000 6199202923977392128 data_length: 00000140 320 message_data: BEE message_type: D712E4BE 03:33:26.933 Send:Success:341 03:33:27.217 Receive:Success:656 03:33:27.217 raw_data: auth_key_id: 0000000000000000 0 message_id: 5607FE399F9A1C01 6199202935543045121 data_length: 00000278 632 message_data: message_type: D0E8075C 03:33:27.240 classid: server_DH_params_ok#D0E8075C nonce: 4479257F6C01C039A3DEAD031BC2D6A4 server_nonce: 4F9DB065B36308CF4D9965725DD7153D enc_answer: tmp_aes_key: 297CB750FF0052B67515B3F11B45F11F15D106BC25ED0027570D5B9D83102BFA tmp_aes_iv: CBDCF40A77B6A1C7CE74A1F8EC8E091A49FAD3B9A2499BFFFD084D537A53B36D answer: BA classid: Server_DH_inner_data#B5890DBA nonce: 4479257F6C01C039A3DEAD031BC2D6A4 server_nonce: 4F9DB065B36308CF4D9965725DD7153D g: 00000003 3 dh_prime: C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5B g_a: C49E858CA0107FF9B51DC88236370866BE4A69DDC2193930769C11722D2884CE5017AF60712B6BAC17F79DBA8701A25AAA901FDCB483C56A246C1CA7705FAA87F0AFD68EAC8FC5EC88307298DAF7252DD6D8630BF819D65F9E4B5624B6A05149B35B8509A63C2F2D05417F38DD0A90727F5D12CC4D213B5974C732FB261F6AC01426F2B7269C17230442AA8C9AFCCD927463C4EC8465F841D969F0C47FC270D8EC23B1F5D861EB6A5602CF6F87A02A56A4094E06509503CACE935461086668AC32E8C69A90EB19C3232B20635DFADFC6E4EDC11FA34A3E2E2BBA28DDCEF422120077D3A171A6A5B65744113AF0D0A1FC566D31DBBDB43F5DE35A7CE5F0BB0ECD server_time: 5607FE39 1443364409 client_time: 5607FE37 1443364407 padding: 646CF781176C3EAC DH_Prime is Safe? = True classid: Client_DH_Inner_Data#6643B654 nonce: 4479257F6C01C039A3DEAD031BC2D6A4 server_nonce: 4F9DB065B36308CF4D9965725DD7153D retry_id: 0000000000000000 0 g_b: 923A21384FE0318D569B2F2BEA667D1A999050A0A1B5AFDA39F2B890DEE45F9ED08E319C8243CD1496269CCF956DFA6C98633BDC2E26B1675C15D7904417EC2A74C687E682ED14182178BC0BD189F6E020131C87FD42A24798FCCD2416348EE0AAF534B652175BAC33E89C82874A8C3E8562815DDA213610167B10153EFC1BD1A0CFBACFEA22E3E8D80917F262D2C67BF1327A245CF7FE0E299F7517EE6A2F65568630A6191FEB0C1254F260A6554ED2BEE19E94AAB693E58DD032C26B9CAFEB0482F12DE2573B6E6D2816AC37ADDF3B99525FDBAF94690926320CC67ABF35D3EA6EC6CC7211BAF11FBDD6897959F6F1E3D4335B89B3024C1B3C0066246B5DCD 03:33:27.590 enc_data: 03:33:27.810 auth_Key: 87A801A14AD6426E6AD56B638B315DF9F5B66F77333DC8C0FAADB77A1D51E71B68F5BB9B21DB275F2C4CA495E6440DDEACBDB199C52C327F7E2E9D78921E0D632CCA63DB6384FAF387E9D41717899EE5D54609C2F88573BBE8128FB5864CB62BC7F0ED250CBB57929AA5198FE568FC76FB846262A505B42D04BCB87C9EB24007CE9F9BDEB79391E7E9425F3A3D5028410E129C078EB8644EAB770F8705D8228CFAEAA4478A0D8E326971C7C2223074C4302C1F1DE5D08AC00CBEBEE41981B57A4248B517386DE68A51D01087F0E58D75A4C0FD2D031BC5BFC08651C4133494B572150EDD1C486153E8F51F99771DD57F55B3A5BBAE1874F25E69150C4E3C1397 03:33:27.813 raw_data: auth_key_id: 0000000000000000 0 message_id: 5607FE37D0489C00 6199202927769852928 data_length: 00000178 376 message_data: message_type: F5045F1F 03:33:27.823 Send:Success:397 03:33:27.983 Receive:Success:73 03:33:27.985 

….

सादर।

मैंने एमटीपीआरओ के एक PHP कार्यान्वयन लिखा है, और अब तक मैंने टीएल सीरियलाइजेशन / डीएसआरआईआईजीकरण, टीसीपी एमिग्रेट / इंटरमीडिएट / पूर्ण कनेक्शन, एचटीटीपी / एचटीटीपी कनेक्शन को लागू करने में कामयाब रहा है।

मैंने सभी एमटीपीआरओ विधियों के लिए ओओपी रैपरर्स को लागू किया है, पायथन / वोल्फैम अल्फा / पीएचपी, एचटीएमएल / मार्कडाउन पर आधारित पीढ़ी मॉड्यूल के लिए समर्थन, बोट एपीआई फाइल आईडी समर्थन, कॉलबैक या एडयूपीडेट्स के साथ अपडेटिंग, बीओटी एपीआई <-> ब्रॉड / यूजर (2 एफए समर्थित है), सरल त्रुटि हैंडलिंग, आंतरिक सहकर्मी प्रबंधन (आप एक साधारण बोट एपीआई चैट आईडी, यूज़रनेम या टीजी-सीएलआई प्रारूप में पीअर आईडी प्रदान कर सकते हैं, के लिए एमटीपीरो ऑब्जेक्ट रूपांतरण, अपलोड / डाउनलोड रैपर, लॉगिन रैपर एक संदेश भेजने के लिए या अन्य एमटीपीआरओ विधियों को कॉल करने के लिए) और मैं वर्तमान में एक अच्छा लुआ आवरण पर काम कर रहा हूं ताकि टीडी-सीएलआई / टीजी-सीएल बॉट्स वाई / मेडलाइनप्रोटो

मैंने सभी एमटीप्रोटी विधियों / कन्स्ट्रक्टर / प्रकारों ( https://daniil.it/MadelineProto/API_docs पर उपलब्ध) के लिए प्रलेखन उत्पन्न करने के लिए एक क्लास भी लिखा है। आसान सत्र भंडारण की अनुमति के लिए एक फ़ाइल में मैडलाइनप्रोटो को सीरियल किया जा सकता है।

यदि कोई दिलचस्पी है, या योगदान करना चाहता है, तो यहां गिटौब रेपो का लिंक है: https://github.com/danog/MadelineProto

मेरे मूल पोस्ट का अनुसरण करने के बाद, एक बार आप auth_key चरणों के साथ काम करते हैं, तो आप इन्हें तेजी से उठाने के लिए उपयोगी होंगे ताकि आप कैसे काम कर सकें कि बाकी टेलीग्राम कैसे काम करता है।

1) वेबोग्राम के लिए स्रोत कोड को डाउनलोड और पढ़िए , यह मूल रूप से जावास्क्रिप्ट है

2) कंसोल.लाग्स के साथ संशोधित वेबोग्राम की एक स्थानीय प्रति को चलाने के लिए स्पष्ट रूप से आपको "एक कामकाजी टेलीग्राम क्लाइंट" और टेलीग्राम सर्वर के बीच होने वाले इंटरैक्शन के चरण से स्पष्ट रूप से दिखाएं। इससे आपको टेलीग्राम क्लाइंट और टेलीग्राम वास्तव में काम करने का एक कार्य प्रवाह मिलेगा।

3) द्विआधारी धाराओं को टीएल प्रकारों में परिवर्तित करने के लिए प्रोटोकॉल पार्सर के अपने स्वयं के कार्यान्वयन के निर्माण के लिए जो भी विकास भाषा आप सबसे अधिक आरामदायक हैं, उसका उपयोग करें और उप-विपरीत

यह वास्तव में इस चरण को कोड करने के लिए काफी मजेदार है। मैंने अभी अमृत में एक सरल प्रोटोकॉल पार्सर बनाया है

4) यहां वेबॉग की एक संशोधित कॉपी से एक नमूना लॉग है

यह दिखाता है कि आपके Auth_key को सफलतापूर्वक जनरेट करने के बाद कौन-से कदम उठाए जाएंगे

आप यह भी देख सकते हैं कि उसे एक नया एथ_की इन-फ़्लाइट जेनरेट करने की ज़रूरत है क्योंकि यह आपके पास उचित डाटा सेंटर के लिए मान्य है, अपने सत्र को पुनः बनाने, नया सर्वर_सल्ट्स आदि (न दिखाया गया है)

सादर।

 ID time info log 121 12:26:35.318 new Auth Auth successfull! dc= 2 mtproto.js:479:15 127 12:26:35.325 CALL =>> API call help.getNearestDc Object { } Object { dcID: 2, createNetworker: true } mtproto.js:749:4 128 12:26:35.327 enc-START [invokeWithLayer] 45 mtproto.js:753:7 168 12:26:35.551 SEND POST XHR http://149.154.167.51/apiw1 [HTTP/1.1 200 OK 708ms] 189 12:26:36.522 msg-r <<=m [msg_container] Object { _: "msg_container", messages: Array[2] } mtproto.js:1452:5 190 12:26:36.523 msg-r <<=m [message] Object { _: "message", msg_id: "6242200678614200321", seqno: 1, bytes: 28, body: Object } mtproto.js:1452:5 191 12:26:36.525 msg-r <<=m [new_session_created] Object { _: "new_session_created", first_msg_id: "6242200671500883244", unique_id: "645797764649391412", server_salt: "17212767594123551779" } mtproto.js:1452:5 192 12:26:36.526 msg-r <<=m [message] Object { _: "message", msg_id: "6242200678630513665", seqno: 3, bytes: 28, body: Object } mtproto.js:1452:5 193 12:26:36.528 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200671500883244", result: Object } mtproto.js:1452:5 257 12:26:39.239 new Auth Auth successfull! dc= 4 mtproto.js:479:15 270 12:26:59.606 CALL =>> API call auth.sendCode Object { phone_number: "2348022002298", sms_type: 5, api_id: 38665, api_hash: "880c7847a517fc455d7d54731e90ad4e", lang_code: "en-US" } Object { dcID: 2, createNetworker: true } mtproto.js:749:4 321 12:27:00.048 SEND POST XHR http://149.154.167.51/apiw1 [HTTP/1.1 200 OK 422ms] 328 12:27:00.981 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200779464550396", result: Object } mtproto.js:1452:5 331 12:27:00.986 CALL =>> API call auth.sendCode Object { phone_number: "2348022002298", sms_type: 5, api_id: 38665, api_hash: "880c7847a517fc455d7d54731e90ad4e", lang_code: "en-US" } Object { dcID: "4", createNetworker: true, resultType: "auth.SentCode", messageID: "6242200779464550396" } mtproto.js:749:4 332 12:27:00.987 enc-START [invokeWithLayer] 45 mtproto.js:753:7 377 12:27:01.288 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 321ms] 398 12:27:02.170 msg-r <<=m [msg_container] Object { _: "msg_container", messages: Array[2] } mtproto.js:1452:5 399 12:27:02.171 msg-r <<=m [message] Object { _: "message", msg_id: "6242200787684582401", seqno: 1, bytes: 28, body: Object } mtproto.js:1452:5 400 12:27:02.172 msg-r <<=m [new_session_created] Object { _: "new_session_created", first_msg_id: "6242200784556418516", unique_id: "13396961033572361155", server_salt: "7076519506215495914" } mtproto.js:1452:5 401 12:27:02.173 msg-r <<=m [message] Object { _: "message", msg_id: "6242200787775901697", seqno: 3, bytes: 48, body: Object } mtproto.js:1452:5 402 12:27:02.174 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200784556418516", result: Object } mtproto.js:1452:5 407 12:27:02.344 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 25154ms] 414 12:27:03.068 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200779464550396" } mtproto.js:1452:5 420 12:27:15.639 CALL =>> API call auth.sendSms Object { phone_number: "2348022002298", phone_code_hash: "696b5befd8e809de81" } Object { dcID: "4", createNetworker: true, resultType: "auth.SentCode", messageID: "6242200784556418516" } mtproto.js:749:4 468 12:27:15.924 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 457ms] 475 12:27:17.154 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200848242727644", result: true } mtproto.js:1452:5 482 12:27:27.511 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200848242727644" } mtproto.js:1452:5 505 12:27:31.003 SEND POST XHR http://149.154.167.51/apiw1 [HTTP/1.1 200 OK 25161ms] 511 12:27:40.133 CALL =>> API call auth.signIn Object { phone_number: "2348022002298", phone_code_hash: "696b5befd8e809de81", phone_code: "26914" } Object { dcID: "4", createNetworker: true, resultType: "Bool", messageID: "6242200848242727644" } mtproto.js:749:4 560 12:27:40.454 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 756ms] 567 12:27:41.223 msg-r <<=m [msg_container] Object { _: "msg_container", messages: Array[2] } mtproto.js:1452:5 568 12:27:41.224 msg-r <<=m [message] Object { _: "message", msg_id: "6242200956100910081", seqno: 7, bytes: 80, body: Object } mtproto.js:1452:5 569 12:27:41.225 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200954555850604", result: Object } mtproto.js:1452:5 570 12:27:41.226 msg-r <<=m [message] Object { _: "message", msg_id: "6242200956751929345", seqno: 9, bytes: 88, body: Object } mtproto.js:1452:5 571 12:27:41.227 msg-r <<=m [updates] Object { _: "updates", updates: Array[1], users: Array[0], chats: Array[0], date: 1453375666, seq: 2 } mtproto.js:1452:5 579 12:27:41.758 CALL =>> API call updates.getState Object { } Object { noErrorBox: true } mtproto.js:749:4 586 12:27:41.842 CALL =>> API call account.updateStatus Object { offline: false } Object { noErrorBox: true } mtproto.js:749:4 594 12:27:41.850 CALL =>> API call messages.getDialogs Object { offset_date: 0, offset_id: 0, offset_peer: Object, limit: 20 } Object { timeout: 300 } mtproto.js:749:4 655 12:27:42.965 CALL =>> API call messages.getAllStickers Object { hash: "" } Object { } mtproto.js:749:4 696 12:27:43.920 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 908ms] 712 12:27:44.613 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 303ms] 727 12:27:46.488 msg-r <<=m [msg_container] Object { _: "msg_container", messages: Array[3] } mtproto.js:1452:5 728 12:27:46.489 msg-r <<=m [message] Object { _: "message", msg_id: "6242200970862778369", seqno: 11, bytes: 36, body: Object } mtproto.js:1452:5 729 12:27:46.489 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200960159395644", result: Object } mtproto.js:1452:5 730 12:27:46.490 msg-r <<=m [message] Object { _: "message", msg_id: "6242200970891641857", seqno: 13, bytes: 776, body: Object } mtproto.js:1452:5 731 12:27:46.492 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200960356118244", result: Object } mtproto.js:1452:5 732 12:27:46.494 msg-r <<=m [message] Object { _: "message", msg_id: "6242200970897958913", seqno: 15, bytes: 16, body: Object } mtproto.js:1452:5 733 12:27:46.495 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200960337591900", result: true } mtproto.js:1452:5 740 12:27:46.567 msg-r <<=m [msg_container] Object { _: "msg_container", messages: Array[4] } mtproto.js:1452:5 741 12:27:46.568 msg-r <<=m [message] Object { _: "message", msg_id: "6242200970862778369", seqno: 11, bytes: 36, body: Object } mtproto.js:1452:5 742 12:27:46.569 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200960159395644" } mtproto.js:1452:5 743 12:27:46.569 msg-r <<=m [message] Object { _: "message", msg_id: "6242200970891641857", seqno: 13, bytes: 776, body: Object } mtproto.js:1452:5 744 12:27:46.570 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200960356118244" } mtproto.js:1452:5 745 12:27:46.571 msg-r <<=m [message] Object { _: "message", msg_id: "6242200970897958913", seqno: 15, bytes: 16, body: Object } mtproto.js:1452:5 746 12:27:46.572 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200960337591900" } mtproto.js:1452:5 747 12:27:46.573 msg-r <<=m [message] Object { _: "message", msg_id: "6242200973791209473", seqno: 17, bytes: 76, body: Object } mtproto.js:1452:5 748 12:27:46.574 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200964892679524", result: Object } mtproto.js:1452:5 754 12:27:46.584 CALL =>> API call messages.getStickerSet Object { stickerset: Object } Object { } mtproto.js:749:4 811 12:27:47.346 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 539ms] 818 12:27:48.175 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242200981275507620", result: Object } mtproto.js:1452:5 857 12:27:49.351 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 25141ms] 864 12:27:57.219 msg-r <<=m [msgs_ack] Object { _: "msgs_ack", msg_ids: Array[0] } mtproto.js:1452:5 870 12:28:04.673 CALL =>> API call messages.readHistory Object { peer: Object, max_id: 0 } Object { } mtproto.js:749:4 908 12:28:04.860 CALL =>> API call messages.getHistory Object { peer: Object, offset_id: 16, add_offset: 0, limit: 20 } Object { timeout: 300, noErrorBox: true } mtproto.js:749:4 922 12:28:05.713 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 367ms] 929 12:28:06.096 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242201058769372356", result: Object } mtproto.js:1452:5 936 12:28:15.702 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242201058769372356" } mtproto.js:1452:5 977 12:28:16.122 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 25170ms] 983 12:28:26.637 CALL =>> API call account.updateStatus Object { offline: true } Object { noErrorBox: true } mtproto.js:749:4 1016 12:28:26.660 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 302ms] 1023 12:28:27.062 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242201153183272948", result: true } mtproto.js:1452:5 1030 12:28:41.985 msg-r <<=m [rpc_result] Object { _: "rpc_result", req_msg_id: "6242201153183272948" } mtproto.js:1452:5 1071 12:28:42.421 SEND POST XHR http://149.154.167.91/apiw1 [HTTP/1.1 200 OK 25165ms]