diff options
Diffstat (limited to 'protocols/Telegram/tdlib/td/example/python/tdjson_example.py')
-rw-r--r-- | protocols/Telegram/tdlib/td/example/python/tdjson_example.py | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/protocols/Telegram/tdlib/td/example/python/tdjson_example.py b/protocols/Telegram/tdlib/td/example/python/tdjson_example.py new file mode 100644 index 0000000000..001eb38758 --- /dev/null +++ b/protocols/Telegram/tdlib/td/example/python/tdjson_example.py @@ -0,0 +1,142 @@ +# +# Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com), +# Pellegrino Prevete (pellegrinoprevete@gmail.com) 2014-2023 +# +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +# +from ctypes.util import find_library +from ctypes import * +import json +import sys + +# load shared library +tdjson_path = find_library('tdjson') or 'tdjson.dll' +if tdjson_path is None: + sys.exit("Can't find 'tdjson' library") +tdjson = CDLL(tdjson_path) + +# load TDLib functions from shared library +_td_create_client_id = tdjson.td_create_client_id +_td_create_client_id.restype = c_int +_td_create_client_id.argtypes = [] + +_td_receive = tdjson.td_receive +_td_receive.restype = c_char_p +_td_receive.argtypes = [c_double] + +_td_send = tdjson.td_send +_td_send.restype = None +_td_send.argtypes = [c_int, c_char_p] + +_td_execute = tdjson.td_execute +_td_execute.restype = c_char_p +_td_execute.argtypes = [c_char_p] + +log_message_callback_type = CFUNCTYPE(None, c_int, c_char_p) + +_td_set_log_message_callback = tdjson.td_set_log_message_callback +_td_set_log_message_callback.restype = None +_td_set_log_message_callback.argtypes = [c_int, log_message_callback_type] + +# initialize TDLib log with desired parameters +@log_message_callback_type +def on_log_message_callback(verbosity_level, message): + if verbosity_level == 0: + sys.exit('TDLib fatal error: %r' % message) + +def td_execute(query): + query = json.dumps(query).encode('utf-8') + result = _td_execute(query) + if result: + result = json.loads(result.decode('utf-8')) + return result + +_td_set_log_message_callback(2, on_log_message_callback) + +# setting TDLib log verbosity level to 1 (errors) +print(str(td_execute({'@type': 'setLogVerbosityLevel', 'new_verbosity_level': 1, '@extra': 1.01234})).encode('utf-8')) + + +# create client +client_id = _td_create_client_id() + +# simple wrappers for client usage +def td_send(query): + query = json.dumps(query).encode('utf-8') + _td_send(client_id, query) + +def td_receive(): + result = _td_receive(1.0) + if result: + result = json.loads(result.decode('utf-8')) + return result + +# another test for TDLib execute method +print(str(td_execute({'@type': 'getTextEntities', 'text': '@telegram /test_command https://telegram.org telegram.me', '@extra': ['5', 7.0, 'a']})).encode('utf-8')) + +# start the client by sending a request to it +td_send({'@type': 'getOption', 'name': 'version', '@extra': 1.01234}) + +# main events cycle +while True: + event = td_receive() + if event: + # process authorization states + if event['@type'] == 'updateAuthorizationState': + auth_state = event['authorization_state'] + + # if client is closed, we need to destroy it and create new client + if auth_state['@type'] == 'authorizationStateClosed': + break + + # set TDLib parameters + # you MUST obtain your own api_id and api_hash at https://my.telegram.org + # and use them in the setTdlibParameters call + if auth_state['@type'] == 'authorizationStateWaitTdlibParameters': + td_send({'@type': 'setTdlibParameters', + 'database_directory': 'tdlib', + 'use_message_database': True, + 'use_secret_chats': True, + 'api_id': 94575, + 'api_hash': 'a3406de8d171bb422bb6ddf3bbd800e2', + 'system_language_code': 'en', + 'device_model': 'Desktop', + 'application_version': '1.0', + 'enable_storage_optimizer': True}) + + # enter phone number to log in + if auth_state['@type'] == 'authorizationStateWaitPhoneNumber': + phone_number = input('Please enter your phone number: ') + td_send({'@type': 'setAuthenticationPhoneNumber', 'phone_number': phone_number}) + + # enter email address to log in + if auth_state['@type'] == 'authorizationStateWaitEmailAddress': + email_address = input('Please enter your email address: ') + td_send({'@type': 'setAuthenticationEmailAddress', 'email_address': email_address}) + + # wait for email authorization code + if auth_state['@type'] == 'authorizationStateWaitEmailCode': + code = input('Please enter the email authentication code you received: ') + td_send({'@type': 'checkAuthenticationEmailCode', + 'code': {'@type': 'emailAddressAuthenticationCode', 'code' : code}}) + + # wait for authorization code + if auth_state['@type'] == 'authorizationStateWaitCode': + code = input('Please enter the authentication code you received: ') + td_send({'@type': 'checkAuthenticationCode', 'code': code}) + + # wait for first and last name for new users + if auth_state['@type'] == 'authorizationStateWaitRegistration': + first_name = input('Please enter your first name: ') + last_name = input('Please enter your last name: ') + td_send({'@type': 'registerUser', 'first_name': first_name, 'last_name': last_name}) + + # wait for password if present + if auth_state['@type'] == 'authorizationStateWaitPassword': + password = input('Please enter your password: ') + td_send({'@type': 'checkAuthenticationPassword', 'password': password}) + + # handle an incoming update or an answer to a previously sent request + print(str(event).encode('utf-8')) + sys.stdout.flush() |