From 00b5b5021b0e7b81b22906e75548612bee5f8c88 Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Fri, 25 Aug 2017 15:34:20 +0200 Subject: [PATCH] Report errors to pwrtelegram.xyz by default --- README-long.rst | 14 ++++++++++++++ telethon/errors/__init__.py | 18 +++++++++++++++++- telethon/network/mtproto_sender.py | 11 +++++++++-- telethon/tl/session.py | 2 ++ 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/README-long.rst b/README-long.rst index 9d7bb03a..86c965bc 100755 --- a/README-long.rst +++ b/README-long.rst @@ -263,3 +263,17 @@ Once this is done, pass the proxy settings to the ``TelegramClient`` constructor The ``proxy=`` argument should be a tuple, a list or a dict, consisting of parameters described `here `_. + +API status +---------- + +In an attempt to help everyone who works with the Telegram API, Telethon +will by default report all Remote Procedure Call errors to +`PWRTelegram `_, a public database anyone +can query, made by `Daniil `_. All the information +sent is a ``GET`` request with the error code, error message and method used. + +If you still would like to opt out, simply set +``client.session.report_errors = False`` to disable this feature. However +Daniil would really thank you if you helped him (and everyone) by keeping +it on! diff --git a/telethon/errors/__init__.py b/telethon/errors/__init__.py index cf1093ea..8e98f6c8 100644 --- a/telethon/errors/__init__.py +++ b/telethon/errors/__init__.py @@ -1,3 +1,4 @@ +import urllib.request import re from .common import ( @@ -16,7 +17,22 @@ from .rpc_errors_401 import * from .rpc_errors_420 import * -def rpc_message_to_error(code, message): +def rpc_message_to_error(code, message, report_method=None): + if report_method is not None: + try: + # Ensure it's signed + report_method = int.from_bytes( + report_method.to_bytes(4, 'big'), 'big', signed=True + ) + url = urllib.request.urlopen( + 'https://rpc.pwrtelegram.xyz?code={}&error={}&method={}' + .format(code, message, report_method) + ) + url.read() + url.close() + except: + "We really don't want to crash when just reporting an error" + errors = { 303: rpc_errors_303_all, 400: rpc_errors_400_all, diff --git a/telethon/network/mtproto_sender.py b/telethon/network/mtproto_sender.py index 1dce4b05..85c46f34 100644 --- a/telethon/network/mtproto_sender.py +++ b/telethon/network/mtproto_sender.py @@ -344,8 +344,15 @@ class MtProtoSender: request = None if inner_code == 0x2144ca19: # RPC Error - error = rpc_message_to_error( - reader.read_int(), reader.tgread_string()) + if self.session.report_errors and request: + error = rpc_message_to_error( + reader.read_int(), reader.tgread_string(), + report_method=type(request).constructor_id + ) + else: + error = rpc_message_to_error( + reader.read_int(), reader.tgread_string() + ) # Acknowledge that we received the error self._need_confirmation.append(request_id) diff --git a/telethon/tl/session.py b/telethon/tl/session.py index 818f4b5b..bb68ab89 100644 --- a/telethon/tl/session.py +++ b/telethon/tl/session.py @@ -109,6 +109,7 @@ class JsonSession: self.lang_code = session.lang_code self.system_lang_code = session.system_lang_code self.lang_pack = session.lang_pack + self.report_errors = session.report_errors else: # str / None self.session_user_id = session_user_id @@ -120,6 +121,7 @@ class JsonSession: self.lang_code = 'en' self.system_lang_code = self.lang_code self.lang_pack = '' + self.report_errors = True # Cross-thread safety self._lock = Lock()