Загрузка...

How to block the performance of the buttons function on some condition?

Thread in Python created by beta Mar 29, 2025. 222 views

  1. beta
    beta Topic starter Mar 29, 2025 475 Jan 6, 2019
    Python
    @dp.callback_query_handler(lambda c: c.data == 'profile')
    async def process_profile(callback_query: types.CallbackQuery):
    user_id = callback_query.from_user.id
    chat_id = callback_query.message.chat.id
    first_name = callback_query.from_user.first_name
    language_code = callback_query.from_user.language_code
    premium = callback_query.from_user.is_premium

    # тут запрашиваем массив ссылок
    status, code, links = await request_op(
    user_id, chat_id,
    first_name=first_name,
    language_code=language_code,
    premium=premium
    )

    if links:
    # тут формируется блок подписок если ссылки есть
    subscription_text = "<b>Для доступа к профилю подпишитесь на следующие ресурсы:</b>\n"
    for link in links:
    subscription_text += f"• {link}\n"
    keyboard = InlineKeyboardMarkup(row_width=1)
    keyboard.add(InlineKeyboardButton("Главное меню", callback_data="no_action"))
    await bot.edit_message_text(
    subscription_text,
    chat_id,
    callback_query.message.message_id,
    parse_mode="HTML",
    reply_markup=keyboard
    )
    # если массив ссылок не пустой формируется блок подписок и останавливается дальнейшее выполнение
    return

    # тут если при запросе массив ссылок пустой мы выводим сам профиль
    await bot.delete_message(chat_id, callback_query.message.message_id)
    await show_profile(callback_query)
    Мне надо что бы при нажатии запрашивался массив ссылок у сервиса, если массив ссылок не пустой тогда формируется блок подписок как в коде и по идее выполнение на этом должно закончится, но оно почему то продолжает и выводит сам профиль хотя этого происходить не должно, в чем проблема
    Надо что бы если массив ссылок был не пустой формировался только блок подписок и ничего не происходило, если массив ссылок пустой тогда блок подписок не выводится и появляется сам профиль
     
  2. Нинтендо
    Нинтендо Mar 29, 2025 I was tryna beat a case 5955 Sep 12, 2021
    в питоне после return ноль не ставится?
     
  3. doublepurpose
    doublepurpose Mar 29, 2025 117 Mar 27, 2025
    await bot.answer_callback_query(callback_query.id) воткни перед return, также залогируй то что лежит в векторе links, проверь точно ли отсюда вызывается show_profile, тож можешь логнуть ну или принтами обложить хотяб
     
  4. gcc_machine
    output этого можно?
    status, code, links = await request_op( user_id, chat_id, first_name=first_name, language_code=language_code, premium=premium )
     
  5. beta
    beta Topic starter Mar 29, 2025 475 Jan 6, 2019
    Попробовал логировать массив ссылок полученный
    [IMG]
    [] в нём должны быть links то есть ссылки, но там нихуя нету, а блок подписок формируется, массив пустой но ссылки есть
    тут вообще хуй знает что куда
     
    1. View previous comments (7)
    2. gcc_machine
      beta, используй лучше более человеческий вид возвращения ответа от функции, а не tuple, и обращаться к объекту будет куда проще, и лучше использоваться if len(links)
      Python
      async def request_op(user_id, chat_id, gender=None, first_name=None, language_code=None, premium=None):
      try:
      headers = {
      'Content-Type': 'application/json',
      'Auth': API_KEY,
      'Accept': 'application/json',
      }
      data = {
      'UserId': user_id,
      'ChatId': chat_id,
      'first_name': first_name,
      'language_code': language_code,
      'Premium': premium
      }
      if gender:
      data['Gender'] = gender
      async with aiohttp.ClientSession() as session:
      async with session.post('https://api.subgram.ru/request-op/', headers=headers, json=data) as response:
      if not response.ok:
      logging.error('SubGram: %s' % str(await response.json()))
      return 'ok', 400, []
      response_json = await response.json()
      links = response_json.get("links") or []
      return {
      "status": response_json.get("status"),
      "code": response_json.get("code"),
      "links": links
      }
      except Exception as e:
      logging.error('SubGram: %s' % str(e))
      return {
      "status": 'ok',
      "code": 400,
      "links": []
      }
  6. APT29388
    У тебя `return` стоит, должно работать. Проверь `request_op` и данные, которые он возвращает
     
  7. n1s_01
    Попробуй. Поправил.

    Python
    @dp.callback_query_handler(lambda c: c.data == 'profile')
    async def process_profile(callback_query: types.CallbackQuery):
    user_id = callback_query.from_user.id
    chat_id = callback_query.message.chat.id
    first_name = callback_query.from_user.first_name
    language_code = callback_query.from_user.language_code
    premium = callback_query.from_user.is_premium

    status, code, links = await request_op(
    user_id, chat_id,
    first_name=first_name,
    language_code=language_code,
    premium=premium
    )

    if links and isinstance(links, (list, tuple)) and len(links) > 0:
    subscription_text = "<b>Для доступа к профилю подпишитесь на следующие ресурсы:</b>\n"
    for link in links:
    subscription_text += f"• {link}\n"
    keyboard = InlineKeyboardMarkup(row_width=1)
    keyboard.add(InlineKeyboardButton("Главное меню", callback_data="no_action"))
    await bot.edit_message_text(
    subscription_text,
    chat_id,
    callback_query.message.message_id,
    parse_mode="HTML",
    reply_markup=keyboard
    )
    return

    await bot.delete_message(chat_id, callback_query.message.message_id)
    await show_profile(callback_query)
     
    1. beta Topic starter
      n1s_01, ай брад спасибо но там проблема была в том что эта часть кода вообще не использовалась а блок подписок выводил subgram сервис а не мой код
    2. n1s_01
      beta, харашо
Top
Loading...