Телеграм бот на python, как решить проблему с запросом request_contact от пользователя на мобильном устройстве?
Всем привет, собственно возникает проблема при вызове кнопки и последующем шаринге контактных данных пользователя. С декстопного клиента все нормально работает, а вот с мобильных устройств кнопка просто не отрабатывает, по нажатию ничего не происходит. Может я делаю что то не так ?
Функция phone, на второй хэндлер можно не обращать внимания, но все равно приложу мало ли проблема кроется в нем.
#auth_user @bot.message_handler(commands=['status']) def phone(message): keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True) button_phone = types.KeyboardButton(text="Отправить номер телефона", request_contact=True) keyboard.add(button_phone) bot.send_message(message.chat.id, "Для получения данных по договору мне необходим Ваш номер телефона привязанный к договору", reply_markup=keyboard) @bot.message_handler(content_types=['contact']) def read_contact_phone(message): phone_usm = message.contact.phone_number try: with connection.cursor() as cursor: sql = 'SELECT * FROM all_abons_bot WHERE phone=%s' cursor.execute(sql,(phone_usm,)) result = cursor.fetchone() if result is not None: phone_user_db = result['phone'] title_user = result['title'] # login_user = result['login'] # passwd_user = result['passwd'] balance_contract = result['balance_contract'] # balance_bonus = result['balance_bonus'] status_option = result['status_option'] if status_option > 0: act = 'опция активна' else: act = 'нет активных опций' phone_usm == phone_user_db bot.send_message(message.chat.id, 'Номер вашего договора : ' + ' ' + title_user + '\n' # 'Логин VPN : ' + ' ' + login_user + '\n' # 'Пароль VPN : ' + passwd_user + '\n' 'Баланс договора : ' + ' ' + str(balance_contract) + ' руб.' + '\n' # 'Бонусный баланс : ' + ' ' + str(balance_bonus) + ' бал.' + '\n' 'Тарифные опции : ' + ' ' + str(act),reply_markup=hideBoard) else: bot.send_message(message.chat.id,'Я не нашел подходящего договора!\n' 'Возможно Ваш телефон не привязан к договору\n' ,reply_markup=hideBoard) finally: connection.commit()
Простой 1 комментарий
Python Telebot — получить телефон пользователя
Ниже — пример рабочего года, который, надеюсь, вам поможет 🙂 Вдруг что — не стесняйтесь задавать вопросы на почту или в Telegram.
import telebot #Подключили библиотеку Телебот - для работы с Телеграм
from telebot import types #Подключили дополнения
import config #Подключили библиотеку Config, с помощью чего можем хранить токен не в коде программы ;) а в файле config.py. Важно: этот файл должен лежать в той же директории, что и код!
bot = telebot.TeleBot(config.token) #Подключили токен
@bot.message_handler(commands=['number']) #Объявили ветку для работы по команде number
keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True) #Подключаем клавиатуру
button_phone = types.KeyboardButton(text="Отправить телефон", request_contact=True) #Указываем название кнопки, которая появится у пользователя
keyboard.add(button_phone) #Добавляем эту кнопку
bot.send_message(message.chat.id, 'Номер телефона', reply_markup=keyboard) #Дублируем сообщением о том, что пользователь сейчас отправит боту свой номер телефона (на всякий случай, но это не обязательно)
@bot.message_handler(content_types=['contact']) #Объявили ветку, в которой прописываем логику на тот случай, если пользователь решит прислать номер телефона :)
if message.contact is not None: #Если присланный объект contact не равен нулю
print(message.contact) #Выводим у себя в панели контактные данные. А вообщем можно их, например, сохранить или сделать что-то еще.
Специально для вас — видео с более наглядной инструкцией:
Как видите — все очень и очень просто 🙂
Спасибо за внимание!
P.S. На моем канале Youtube один из подписчиков задал интересный вопрос: как скрыть клавиатуру после того, как телефонный номер был отправлен? Ответа на вопрос я не знал 🙁 Впрочем, спустя день подписчик подсказал решение, которым я и делюсь:
keyboard = types.ReplyKeyboardRemove() bot.send_message(message.chat.id, msg, reply_markup=keyboard)
P.P.S. не так давно возник вопрос — а как полученный от пользователя номер телефона отправить, например, в удобоваримом виде куда-то в группу? Все просто:
1. Добавляете бота, который должен отправить полученную информацию в нужную группу с правами администратора
2. В коде бота вносите следующие изменения в функцию def contact(message):
@bot.message_handler(content_types=['contact']) def contact(message): if message.contact is not None: print(message.contact) print(type(message.contact)) print('Name: ' + str(message.contact.first_name)) text = 'Пользователь: ' + message.contact.first_name + ': телефон: ' + message.contact.phone_number bot.send_message(id_channel, text)
Собственно, вы можете выводить все, что угодно — для этого просто используем название нужного поля по схеме:
phone_number': '***', 'first_name': '***', 'last_name': '***', 'user_id': ***, 'vcard': '***'
где звездочками скрыты получаемые в полном виде контактные данные пользователя.
Message¶
class telegram. Message ( message_id , date , chat , from_user = None , forward_from = None , forward_from_chat = None , forward_from_message_id = None , forward_date = None , reply_to_message = None , edit_date = None , text = None , entities = None , caption_entities = None , audio = None , document = None , game = None , photo = None , sticker = None , video = None , voice = None , video_note = None , new_chat_members = None , caption = None , contact = None , location = None , venue = None , left_chat_member = None , new_chat_title = None , new_chat_photo = None , delete_chat_photo = None , group_chat_created = None , supergroup_chat_created = None , channel_chat_created = None , migrate_to_chat_id = None , migrate_from_chat_id = None , pinned_message = None , invoice = None , successful_payment = None , forward_signature = None , author_signature = None , media_group_id = None , connected_website = None , animation = None , passport_data = None , poll = None , forward_sender_name = None , reply_markup = None , dice = None , via_bot = None , proximity_alert_triggered = None , sender_chat = None , video_chat_started = None , video_chat_ended = None , video_chat_participants_invited = None , message_auto_delete_timer_changed = None , video_chat_scheduled = None , is_automatic_forward = None , has_protected_content = None , web_app_data = None , is_topic_message = None , message_thread_id = None , forum_topic_created = None , forum_topic_closed = None , forum_topic_reopened = None , forum_topic_edited = None , general_forum_topic_hidden = None , general_forum_topic_unhidden = None , write_access_allowed = None , has_media_spoiler = None , user_shared = None , chat_shared = None , * , api_kwargs = None ) [source] ¶ Bases: telegram.TelegramObject This object represents a message. Objects of this class are comparable in terms of equality. Two objects of this class are considered equal, if their message_id and chat are equal.
- telegram.Bot.edit_message_caption()
- telegram.Bot.edit_message_live_location()
- telegram.Bot.edit_message_media()
- telegram.Bot.edit_message_reply_markup()
- telegram.Bot.edit_message_text()
- telegram.Bot.forward_message()
- telegram.Bot.send_animation()
- telegram.Bot.send_audio()
- telegram.Bot.send_contact()
- telegram.Bot.send_dice()
- telegram.Bot.send_document()
- telegram.Bot.send_game()
- telegram.Bot.send_invoice()
- telegram.Bot.send_location()
- telegram.Bot.send_message()
- telegram.Bot.send_photo()
- telegram.Bot.send_poll()
- telegram.Bot.send_sticker()
- telegram.Bot.send_venue()
- telegram.Bot.send_video_note()
- telegram.Bot.send_video()
- telegram.Bot.send_voice()
- telegram.Bot.set_game_score()
- telegram.Bot.stop_message_live_location()
- The arguments and attributes voice_chat_scheduled , voice_chat_started and voice_chat_ended , voice_chat_participants_invited were renamed to video_chat_scheduled / video_chat_scheduled , video_chat_started / video_chat_started , video_chat_ended / video_chat_ended and video_chat_participants_invited / video_chat_participants_invited , respectively, in accordance to Bot API 6.0.
- The following are now keyword-only arguments in Bot methods: _timeout , api_kwargs , contact , quote , filename , loaction , venue . Use a named argument for those, and notice that some positional arguments changed position as a result.
- message_id ( int ) – Unique message identifier inside this chat.
- from_user ( telegram.User , optional) – Sender of the message; empty for messages sent to channels. For backward compatibility, this will contain a fake sender user in non-channel chats, if the message was sent on behalf of a chat.
- sender_chat ( telegram.Chat , optional) – Sender of the message, sent on behalf of a chat. For example, the channel itself for channel posts, the supergroup itself for messages from anonymous group administrators, the linked channel for messages automatically forwarded to the discussion group. For backward compatibility, from_user contains a fake sender user in non-channel chats, if the message was sent on behalf of a chat.
- date ( datetime.datetime ) – Date the message was sent in Unix time. Converted to datetime.datetime .
Changed in version 20.3: The default timezone of the bot is used for localization, which is UTC unless telegram.ext.Defaults.tzinfo is used.
Changed in version 20.3: The default timezone of the bot is used for localization, which is UTC unless telegram.ext.Defaults.tzinfo is used.
Changed in version 20.3: The default timezone of the bot is used for localization, which is UTC unless telegram.ext.Defaults.tzinfo is used.
Changed in version 20.0: Accepts any collections.abc.Sequence as input instead of just a list. The input is converted to a tuple.
Changed in version 20.0: Accepts any collections.abc.Sequence as input instead of just a list. The input is converted to a tuple.
Changed in version 20.0: Accepts any collections.abc.Sequence as input instead of just a list. The input is converted to a tuple.
Changed in version 20.0: Accepts any collections.abc.Sequence as input instead of just a list. The input is converted to a tuple.
Changed in version 20.0: Accepts any collections.abc.Sequence as input instead of just a list. The input is converted to a tuple.