Ответы пользователя по тегу API
  • Верификация номера телефона на сайте. Какие методы есть?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Я бы не стал пренебрегать вариантом с Telegram. Аккаунт в Telegram сейчас есть у значительной части пользователей. При этом в Telegram сейчас появился платный сервис Telegram Gateway для отправки кодов авторизации по номеру телефона. Либо можно использовать авторизацию бесплатно через бота либо виджет Telegram Login - так делают некоторые сайты уже давно. Через бота можно с помощью ссылки вида t.me/MyAwesomeBot?start=секретный_код, бот обработает код и запишет в профиль пользователя привязку к его Telegram user_id. Или попросить пользователя найти этого бота и ввести ему код вручную. Не очень удобно, и нет привязки к номеру, но зато это бесплатно.

    В WhatsApp можно легально использовать WhatsApp Business API, но надо быть бизнесом (хотя бы ИП), частному лицу не дадут зарегистрировать бизнес-аккаунт. Отправка только по шаблонам, которые модерируются при регистрации. Но для кодов может быть достаточно всего одного шаблона.

    Либо использовать нелегальный WhatsApp Web API, с которым работает Web-версия WhatsApp. Они это не любят и могут за такое номер забанить, поэтому если захочется рискнуть - следует по крайней мере использовать какой-нить новый ненужный номер, чтобы было не жалко и в случае потери.

    Есть ещё Viber, там тоже можно платно посылать сообщения от имени бизнеса по номеру телефона, но пользовательская база в России у Viber не очень большая.

    Также можно использовать регистрацию через соцсети (vk, facebook), в них всё же очень активно занимаются борьбой с авторегистрациями.

    Также можно использовать приложения типа Google Authenticator с авторизацией по одноразовым кодам, привязанным к аккаунту Google.

    В общем, варианты есть, можно думать, что более удобо для решения конкретной задачи в конкретном сервисе. Надо понимать, что слишком простая регистрация несёт риски слишком большого количества спамеров и мусорных регистраций, а слишком сложная приведёт к оттоку потенциальных пользователей. Всегда приходится идти на компромисс...

    Авторизация через почту не то чтобы прошлый век... Просто спамеры и злоумышленники могут почтовые ящики создавать тысячами быстро и бесплатно. В отличие от мессенджеров, в которых в силу привязки к телефонному номеру нужно этот номер где-то ещё получить, что какая-никакая сложность и ограничение бесконтрольного роста автоматических регистраций. Капчи и контрольные вопросы в век нейросетей и аутсорсинговых индусов уже давно работают не особо хорошо. Придётся часто прыгать с бубном в попытке изобрести новый забор против злоумышленников, который они ещё не придумали, как обходить. Поэтому-то сейчас все массово и используют номер телефона: это просто, понятно пользователям, легко тиражируется и достаточно прилично закрывает значительную часть проблемы авторегистраций и спамеров.
    Ответ написан
    Комментировать
  • Есть ли сервисы по отправке SMS по API с тестовым периодом?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В настоящее время скорее нет, чем да.

    Сейчас все крупные мобильные операторы требуют регистрации имени с предоставлением документов о товарном знаке, имени сайта итд итп. У некоторых это требует абонентской платы (обычно порядка 2 тыс. рублей в месяц), у некоторых даже бесплатно, но ритуал соблюсти всё равно надо.

    Единственное что можно тут сделать - выяснить у поставщика, нет ли у него возможности отправки на какого-нить не очень крупного оператора (MVNO?), у которого купить симку и на этом номере тестироваться с каким-нить общим именем типа "sms info". Но в целом для выхода в прод регистрация имени всё равно потребуется.
    Ответ написан
    Комментировать
  • Как удалить последние 2 сообщения в телеграм боте?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, бот может удалять только свои сообщения, но не сообщения от пользователя.
    Ответ написан
  • Telegram Bot API как боту отправить контакт?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Бот может отправить пользователю кнопку, при нажатии на которую пользователь разрешает передать боту свои контактные данные.

    См. опцию request_contact в документации.
    Ответ написан
    5 комментариев
  • Можно ли получать ид юзера зная его юзернейм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Средствами Bot API невозможно по username получить id. Серьёзни, никак. Я недавно отвечал на похожий вопрос https://qna.habr.com/q/1224466

    Но в указанном узком сценарии возможно сделать такое, но с оговорками.

    Во-первых, придётся явно сохранять связку username-id для всех пользователей, пишущих боту.

    Во-вторых, не у всех пользователей есть username.

    В-третьих, пользователь может в любой момент сменить свой username, и бот об этом не узнает.

    По реализации всё достаточно просто: при каждом поступающем сообщении запоминаем пару username-id в базе, а для нужной команды достаём.
    Ответ написан
    Комментировать
  • Как получить id?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, средствами Bot API это невозможно. Тем более что у пользователя может вообще не быть username.

    Конечно, его можно получить в событии от пользователя в поле Update.from.id, но для этого пользователь должен сделать какое-то действие в сторону бота (или, например, в сторону группы, в которой он состоит).
    Ответ написан
    Комментировать
  • Как сделать что-бы бот отправлял сообщение в групповой но, не в лс?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Распространённая ошибка: в качестве chat_id используется id пользователя. Естественно, получателем будет пользователь, а не группа.

    Правильно вместо этого:

    $chat_id = $data['message']['from']['id'];

    использовать это:

    $chat_id = $data['message']['chat']['id'];
    Ответ написан
    Комментировать
  • 403 ошибка при fetch запросе к API Яндекс Диск, в чем проблема?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Оказывается, yandex почему-то возвращает 403, если в заголовках запроса есть параметр Referrer. Помогло добавить в html страницы:

    <meta name="referrer" content="no-referrer">

    После этого Referrer из запросов исчез, и всё заработало.
    Ответ написан
    2 комментария
  • Можно ли получить телеграм id по номеру телефона?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, потенциально клиентский API Телеграма открыт и позволяет сделать поиск по номеру телефона. Но надо понимать, что пользователь может запретить настройками находить себя по номеру телефона. Также надо понимать, что при сколько-нибудь массовом поиске по номеру телефона Телеграм отреагирует и заблокирует.

    Рекомендую отказаться от этой затеи.
    Ответ написан
    2 комментария
  • Составить запрос в API для проверки работоспособности прокси сервера на Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    405 возвращает потому что в доке ошибочно http:// вместо https://, который приводит к редиректу на https:// с GET. Это лечится заменой на https.

    Следующая стадия - полечить ответы об ошибках. Они в ответ возвращают json со строкой, в которой json. Поэтому проверяем, если r.json() текст - интерпретируем как json.

    Сами прокси передавать в POST-запросе через перенос строки в параметре proxy_list:

    import requests
    import json
    
    data = '203.13.32.122:80\n203.13.32.122:443'
    r = requests.post('https://proxy-checker.net/api/proxy-checker/', data={"proxy_list": data })
    
    print (r)
    
    resp_json = r.json()
    if isinstance(resp_json, str):
      resp_json = json.loads(r.json())
    print (json.dumps(resp_json, indent=2, ensure_ascii=False))


    Короче, очень кривой API...
    Ответ написан
  • Как удалить кнопку из клавиатуры telebot?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нельзя удалить одну кнопку. Можно либо удалить всю клавиатуру целиком, либо отправить другую клавиатуру на замену. Соответственно, для удаления всего одной кнопки нужно помнить, какую клавиатуру отправлял в прошлый раз (хранить это явным образом или определять из контекста), чтобы отправить новую клавиатуру без этой кнопки.
    Ответ написан
    Комментировать
  • Как правильно отправлять запросы к Telegram API (не Bot API)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Там не просто http-протокол, поэтому легко это повторить нельзя. Если интересно именно php, то советуют библиотеку https://github.com/danog/MadelineProto

    Для python - библиотека telethon или, как вариант, pyrogram. Для js - mtproto-core. Большинство ботописателей используют python и telethon.
    Ответ написан
    Комментировать
  • Сменить ID профиля ВКонтакте в базе данных ВК?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, id пользователя неизменен. Можно только удалить пользователя и создать нового, тогда его id будет другим.
    Ответ написан
    Комментировать
  • Отправка файла через телеграм бота с помощью libcurl с определенным параметром?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если по ссылке, то надо передать ссылку в URL: ...&document=ссылка

    Если файл лежит локально, то передать файл в multipart/form-data, как-то примерно так: https://curl.se/libcurl/c/postit2.html
    Ответ написан
    Комментировать
  • Где взять api для приложения музыки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    https://www.jamendo.com/
    https://developer.jamendo.com/v3.0
    Довольно много музыки (в том числе очень неплохой) на либеральных лицензиях. Но исполнители преимущественно малоизвестные.
    Ответ написан
    Комментировать
  • Как отправить сообщение боту от имени пользователя?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, потребуется использовать клиентский API (MTProto). https://core.telegram.org/#getting-started

    Библиотеки tdlib, для python - telethon или pyrogram, для других языков см. гугл.
    Ответ написан
    Комментировать
  • Получать сообщения от пользователя?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Есть два способа получения доступа к API WA.

    1. Легальный: WhatsApp Business API. Нужно зарегистрировать бизнес (можно ИП) в Facebook Business Manager, пройти модерацию, получить доступ через одного из партнёров WhatsApp. Недостатки: дорого. Достоинства: надёжно, официально.

    2. Нелегальный: имитация недокументированного WhatsApp Web API. Достаточно держать телефон с WhatsApp включённым, сфотографировав QR-код, выданный нужной библиотекой или сервисом. Недостатки: риск бана (невысокий, но я бы не советовал использовать Очень Важный Номер в таких играх), риск что всё сломается из-за изменения Web API, необходимость держать включённым номер телефона. Достоинства: дёшево, не нужно регистрировать шаблоны для отправки сообщения первым (но если часто отправлять первым повышается риск бана).
    Ответ написан
    Комментировать
  • Как сделать ссылку в callback_data?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для этого надо использовать url-кнопку, а не callback-кнопку

    https://core.telegram.org/api/bots/buttons
    Ответ написан
    Комментировать
  • Как авторизовать пользователя на сайте через бот Вайбера?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Update: как обсудили с автором, скорее всего тут речь об использовании deep linking. Пользователь идёт по ссылке, где в context передаётся какой-то идентификатор или хеш, затем делится с ботом своим номером телефона, и авторизация пройдена.

    Предыдущий ответ оставляю, так как он тоже может оказаться полезен:

    Viber Bot (в девичестве Viber Public Account) не позволяет отправку сообщений по номеру телефона. Для этого надо использовать Viber Business Messages (в девичестве Viber Service Messages) через партнёров Viber.

    Обычная практика в этой сфере - посылать сообщение через Viber, затем по таймауту высылать запасную СМС. Это называют модным словом "каскад". Можно для повышения надёжности включать в каскад также WhatsApp (и другие каналы с отправкой по номеру телефона, например, mail.ru notify). Но можно просто при проверке номера пользователя предлагать ему самому выбрать из списка предпочтительный канал для проверки (если не сработает - пользователь попробует другой канал самостоятельно).

    Нужно быть готовым к тому, что стоимость отправки в Viber/WA по номеру телефона стоит дороже, чем СМС. Хотя сообщение на мессенджеры принято тарифицировать только при успешной доставке (недоставленные бесплатны), есть также обязательный ежемесячный платёж (для Viber это требование самого Viber, для WhatsApp большинство поставщиков продают минимальный пакет хотя бы на 5-10 тыс. рублей, а те, кто не берут абонентку, для покрытия своих расходов тарифицируют даже бесплатные сообщения).
    Ответ написан
  • Как получить file_id без отправки сообщения пользователю?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Я решал эту задачу так: при первой отправке файла я его отправлял как файл, запоминая file_id в словаре и в таблице в базе, а при следующей уже имел готовый file_id. При этом я могу в любой момент добавлять файлы, не задумываясь о том, загружал ли я их уже в Telegram или нет.

    files = {}
    def load_files():
      global files
      res = db.execute("SELECT file_name,file_id FROM files")
      files = {}
      for row in res:
        file_name, file_id = row
        files[file_name] = file_id
    
    def save_file(file_name, file_id):
      global files
      db.execute("INSERT INTO files (file_name,file_id) VALUES (?,?) ON CONFLICT(file_name) DO UPDATE SET file_id=excluded.file_id", (file_name, file_id))
      files[file_name] = file_id
    
    load_files()
    
    ...
            if item["photo"] in files:
              file_id = files[item["photo"]]
              print (f" send photo file_name={item['photo']} file_id={file_id}")
              bot.send_photo(call.message.chat.id, file_id)
            else:
              with open(os.path.join("menu", item["photo"]), "rb") as f:
                bot.send_chat_action(call.message.chat.id, "upload_photo")
                r = bot.send_photo(call.message.chat.id, f)
                file_id = r.photo[0].file_id
                save_file(item["photo"], file_id)
                print (f" uploaded photo file_name={item['photo']} file_id={file_id}")
    Ответ написан
    Комментировать