Фикс деанона бота @questianonbot
Всем привет, наткнулся на статью История любви или как мы «взломали» телеграм бота анонимных вопросов / Комментарии / Хабр Проблема в том что 3 бот @questianonbot не работает, выдаёт ошибку
File "c:...\deanonvoprosy-main\deanon.py", line 124, in deanon_2uid = json.loads(m.reply_markup.inline_keyboard[0][0].callback_data)['value'] # get user id, that wrote this message~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^KeyError: 'value'
Я долго пытался пофиксить, поменял работу с value на ref, но так и не получилось достигнуть чего то, максимум
Не удалось получить данные пользователя с ID: uLebc2MqPegsleobVIXk7. Ошибка: 'str' object has no attribute 'get_chat_member'error Невозможно получить данные пользователя, ID: uLebc2MqPegsleobVIXk7info Сообщение:info Автор: Неизвестноinfo ID: uLebc2MqPegsleobVIXk7info Ник: Неизвестно
Люди которые хорошо разбираются в написании ботов и в работе апи тг помогите пожалуйста!!! автор того поста и проекта давно в инактиве к слову
Ответы (1 шт):
Автор решения: Mazz1lla
→ Ссылка
Вместо value
из callback_data
нужно взять ref
, а затем извлечь из ref
числовой идентификатор пользователя.
Например, так:
import json
import re
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Application, CommandHandler, CallbackQueryHandler, MessageHandler, filters, CallbackContext
from telegram.constants import ParseMode
TOKEN = "YOUR_TELEGRAM_BOT_TOKEN"
def extract_user_id(callback_data):
try:
data = json.loads(callback_data)
ref = data['ref']
match = re.search(r'(\d+)', ref)
return int(match.group(1))
except:
return None
async def message_handler(update: Update, context: CallbackContext):
m = update.message
if not m.reply_to_message:
return
if not m.reply_to_message.reply_markup:
return
if not m.reply_to_message.reply_markup.inline_keyboard:
return
user_id = extract_user_id(m.reply_to_message.reply_markup.inline_keyboard[0][0].callback_data)
if user_id:
chat_member = await context.bot.get_chat_member(update.effective_chat.id, user_id)
username = chat_member.user.username if chat_member.user.username else "Неизвестно"
await m.reply_text(f"Автор: @{username}\nID: {user_id}", parse_mode=ParseMode.MARKDOWN)
else:
return
def main():
application = Application.builder().token(TOKEN).build()
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, message_handler))
application.run_polling()
if __name__ == '__main__':
main()