From acfbd58003b4f5676953fbe80017b79f57bf3a7e Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Wed, 4 Aug 2021 22:54:49 +0800 Subject: [PATCH 01/10] [+] Create function to find full name by username --- SlashBot.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/SlashBot.py b/SlashBot.py index 6c4fb57..838995b 100644 --- a/SlashBot.py +++ b/SlashBot.py @@ -1,5 +1,8 @@ import os import re +from typing import List, Dict, Union + +import requests from telegram.ext import Updater, MessageHandler, filters TELEGRAM = 777000 @@ -15,6 +18,12 @@ else: raise Exception('no token') +# Find someone's full name by their username +def find_name_by_username(username: str) -> str: + r = requests.get(f'https://t.me/{username}') + return re.search('(?<= Date: Wed, 4 Aug 2021 22:56:13 +0800 Subject: [PATCH 02/10] [+] Add requests dependency into requirements.txt --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 11a50f9..63667ac 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -python-telegram-bot \ No newline at end of file +python-telegram-bot +requests From 85d3dd6a6c18d5770c7ea2fb624eedd3b06387a9 Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Thu, 5 Aug 2021 00:15:51 +0800 Subject: [PATCH 03/10] [O] Remove @ symbol before trying to find username --- SlashBot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SlashBot.py b/SlashBot.py index 838995b..b5f4c3b 100644 --- a/SlashBot.py +++ b/SlashBot.py @@ -20,7 +20,7 @@ else: # Find someone's full name by their username def find_name_by_username(username: str) -> str: - r = requests.get(f'https://t.me/{username}') + r = requests.get(f'https://t.me/{username.replace("@", "")}') return re.search('(?<= Date: Thu, 5 Aug 2021 00:18:42 +0800 Subject: [PATCH 04/10] [+] Detect mentions --- SlashBot.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/SlashBot.py b/SlashBot.py index b5f4c3b..1e4cc6c 100644 --- a/SlashBot.py +++ b/SlashBot.py @@ -40,8 +40,25 @@ def get_users(msg): else: msg_rpl = msg_from.copy() from_user, rpl_user = get_user(msg_from), get_user(msg_rpl) + + # Not replying to anything if rpl_user == from_user: - rpl_user = {'first_name': '自己', 'id': rpl_user['id']} + + # Detect if the message contains a mention. If it has, use the mentioned user. + entities: List[Dict[str, Union[str, int]]] = msg['entities'] + mentions = [e for e in entities if e['type'] == 'mention'] + if mentions: + + # Find username + offset = mentions[0]['offset'] + length = mentions[0]['length'] + text = msg['text'] + username = text[offset : offset + length] + rpl_user = {'first_name': find_name_by_username(username), 'username': username} + + else: + rpl_user = {'first_name': '自己', 'id': rpl_user['id']} + return from_user, rpl_user From c0488d7d9aa2692c833f0497482ef2bc3efbfe3e Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Thu, 5 Aug 2021 00:27:25 +0800 Subject: [PATCH 05/10] [+] Add username reference option in mention function --- SlashBot.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/SlashBot.py b/SlashBot.py index 1e4cc6c..6a3af66 100644 --- a/SlashBot.py +++ b/SlashBot.py @@ -62,12 +62,20 @@ def get_users(msg): return from_user, rpl_user -def mention(user): - space = ' ' - if 'last_name' not in user: - user['last_name'] = '' - space = '' - return f"[{user['first_name']}{space}{user['last_name']}](tg://user?id={user['id']})" +# Create mention string from user +def mention(user: Dict[str, str]) -> str: + + # Combine name + last = user.get('last_name', '') + first = user['first_name'] + name = first + (f' {last}' if last else '') + + # Create user reference link + username = user.get('username', '') + uid = user.get('id', '') + link = f'tg://resolve?domain={username}' if username else f'tg://user?id={uid}' + + return f"[{name}]({link})" def get_text(mention_from, mention_rpl, command): From 25ec388df8ec2729b7e2807069d0a01a90aa11e8 Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Thu, 5 Aug 2021 00:52:33 +0800 Subject: [PATCH 06/10] [F] Fix HTTP 400 error from incomplete markdowns --- SlashBot.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/SlashBot.py b/SlashBot.py index 6a3af66..1eed29e 100644 --- a/SlashBot.py +++ b/SlashBot.py @@ -95,12 +95,13 @@ def get_text(mention_from, mention_rpl, command): def reply(update, context): print(update.to_dict()) msg = update.to_dict()['message'] - command = msg['text'] from_user, rpl_user = get_users(msg) - mention_from, mention_rpl = mention(from_user), mention(rpl_user) + # Escape markdown + command = msg['text'] + command = command.replace("_", "\\_").replace("*", "\\*").replace("[", "\\[").replace("`", "\\`") - text = get_text(mention_from, mention_rpl, command) + text = get_text(mention(from_user), mention(rpl_user), command) print(text, end='\n\n') update.effective_message.reply_text(text, parse_mode='Markdown') From 4e156ae91ea76e666b319dccbdd7f535266576ca Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Thu, 5 Aug 2021 00:57:22 +0800 Subject: [PATCH 07/10] [O] Remove username from text after identifying reply mention --- SlashBot.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SlashBot.py b/SlashBot.py index 1eed29e..e6d29e9 100644 --- a/SlashBot.py +++ b/SlashBot.py @@ -56,6 +56,9 @@ def get_users(msg): username = text[offset : offset + length] rpl_user = {'first_name': find_name_by_username(username), 'username': username} + # Remove mention from message text + msg['text'] = text[:offset] + text[offset + length:] + else: rpl_user = {'first_name': '自己', 'id': rpl_user['id']} From 98b8cb3da6a4a7168006f85cebba11ee3ce38650 Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Thu, 5 Aug 2021 11:47:04 +0800 Subject: [PATCH 08/10] [M] Move starting code to main --- SlashBot.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/SlashBot.py b/SlashBot.py index e6d29e9..f0dadd9 100644 --- a/SlashBot.py +++ b/SlashBot.py @@ -110,10 +110,11 @@ def reply(update, context): update.effective_message.reply_text(text, parse_mode='Markdown') -updater = Updater(token=Token, use_context=True) -delUsername = re.compile('@' + updater.bot.username, re.I) -dp = updater.dispatcher -dp.add_handler(MessageHandler(Filters.regex(parser), reply)) +if __name__ == '__main__': + updater = Updater(token=Token, use_context=True) + delUsername = re.compile('@' + updater.bot.username, re.I) + dp = updater.dispatcher + dp.add_handler(MessageHandler(Filters.regex(parser), reply)) -updater.start_polling() -updater.idle() + updater.start_polling() + updater.idle() From 5b9d1c1611e8ad9f9ac78bcbbe043204d24ef866 Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Thu, 5 Aug 2021 11:48:17 +0800 Subject: [PATCH 09/10] [+] Create gitignore for IDEA --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0537c22 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +.idea From 6b8808ff6e2ee7f0b28136ba22743dad1d43b18e Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Thu, 5 Aug 2021 18:16:57 +0800 Subject: [PATCH 10/10] [U] Upload MTProto testing script --- mtp_test.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 mtp_test.py diff --git a/mtp_test.py b/mtp_test.py new file mode 100644 index 0000000..a3870ce --- /dev/null +++ b/mtp_test.py @@ -0,0 +1,25 @@ +import asyncio + +import socks +from telethon import TelegramClient, functions + +# Configuration +proxy = (socks.SOCKS5, 'localhost', 7890) +api_id = 7000000 +api_hash = '506828842c80ea408b94d1**********' +bot = TelegramClient('Bot', api_id, api_hash, proxy=proxy).start(bot_token='16679*****:***hCZ-*******RNRx9BYd-Hb**********') + + +async def main(): + # Find user by username + user = await bot(functions.contacts.ResolveUsernameRequest(username='hykilpikonna')) + print(user) + print() + user = user.users[0] + name = user.first_name + (' ' + user.last_name if user.last_name else '') + print(name) + + +if __name__ == '__main__': + loop = asyncio.get_event_loop() + loop.run_until_complete(main())