Фикс деанона бота @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()
→ Ссылка