How to implement authorization using a Telegram API?

前端 未结 4 969
别那么骄傲
别那么骄傲 2020-11-22 12:27

I want to implement multiple authorization using PHP for interaction with Telegram REST API.

What task am I trying to solve? Well, it\'s simple: several dozens of us

4条回答
  •  难免孤独
    2020-11-22 12:51

    As a follow up to my original post, once you are done with the auth_key steps the following will be useful to quickly get you up to speed with how the rest of telegram works.

    1) Download and study the source code for Webogram, it is all basically JavaScript.

    2) run a local copy of Webogram modified with console.logs to clearly show you step by step the interactions that are taking place between "a working telegram client" and the telegram servers. This will give you a work-flow of how telegram clients and Telegram really work.

    3) Use whatever development language you are most comfortable with to build your own implementation of a Protocol Parser for converting binary streams into TL types and vice-versa

    It's actually quite fun to code this step. I've just built a simple Protocol Parser in Elixir

    4) Here is a sample log from a modified copy of Webogram.

    It shows what steps to take after successfully generated your Auth_key

    You even get to see where it has to generate a new Auth_key in-flight as it switches the validated your to the proper DataCenter, recreating his session, new server_salts etc (not shown)

    Regards.

    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]
    

提交回复
热议问题