Сторонние сервисы для обмена сообщениями с Whatapp находятся сегодня на пике развития. Такие сервисы предлагают некоторые функции, недоступные в Whatsapp Business API, например история сообщений, список контактов, групповые чаты. Ключевым моментом в их работе является используемый метод авторизации. Самый популярный – это интеграция через WEB интерфейс Whatsapp путем сканирования QR кода в связанных устройствах мобильного приложения. Но есть и другой незаслуженной забытый способ - это интеграция через SMS-верификацию.
Данный способ отошел на второй план вместе с прекращением поддержки библиотеки Yowsup в 2021 г. Но сейчас наблюдаются предпосылки его второго рождения. Важным моментом в этом играет обратная совместимость. Независимо от выбранного способа авторизации, практически все функции Whatsapp, за исключением специфических для мобильного приложения (например, геолокации), будут работать одинаково, а значит API не будет отличаться. Рассмотрим оба способа подробнее:
Авторизация по QR
В Whatsapp заложена функция синхронизации мобильного приложения с Desktop и Web версиями. Эти версии не могут работать независимо от мобильного приложения. При первом запуске в них генерируется QR код, который нужно отсканировать в мобильном приложении на вкладке «связанные устройства» . QR код содержит публичный ключ клиента, идентификаторы клиента и сервера, версию ватсаппа и кое-что другое. Народные умельцы давно научились генерировать QR своими библиотеками и выдавать себя либо за Web, либо за Desktop версию клиента.
Авторизация по SMS
SMS-верификация в Whatsapp предназначена для проверки подлинности телефонного номера пользователя. Она основывается на отправке текстового кода подтверждения или получение кода через звонок на указанный номер телефона, который затем необходимо ввести в соответствующее поле в приложении. SMS верификация для API бота работает также. Важный момент – к одному номеру телефона может быть привязано только одно приложение Whatsapp, поэтому ввод SMS кода в API сервисе приводит к автоматическому выходу из приложения на телефоне.
QR против SMS
Критерий | Авторизация по QR | Авторизация через СМС / Звонок |
Легкость авторизации | QR-коды легко получить с сервера Whatsapp. Нет таймаутов и задержек | Есть жесткие ограничения на количество и задержки запросов кодов авторизации с одного номера. Желательно вводить код с первого раза |
Баны | Есть проблема сброса авторизации по QR коду. Причем это может произойти как из-за неправильного использования протокола Whatsapp, так из-за ручных действий по невнимательности | Нет проблемы со сбросом авторизации по QR коду |
Юзабилити | Требуется обучение конечных клиентов. Многие пользователи не знают о наличии этой функции | Ввод SMS кода более привычен для конечных пользователей, поэтому не требует обучения |
Поддержка нескольких устройств | Можно работать на одном телефоне как через API с функцией чат-бота, так и в пользовательском режиме | Невозможно использовать на одном номере телефона одновременно Whatsapp приложение и API сервис. |
Приватность данных | Есть риск нарушения приватности личных данных, когда клиент по незнанию сканирует QR код с личного номера и все контакты с историей переписок оказываются на чьих-то серверах | Практически исключен риск утечки приватных личных данных, т.к. нельзя на одном номере связать несколько приложений по этой технологии |
Стабильность технологии | Технология давно используется | Практически не используется |
Процент доставки сообщений | Не всегда доставляются отправленные сообщения, т.к. отправка идет со связанного устройства, а не с основного. | Теоретически процент доставки сообщений выше, т.к. отправка идет с основного устройства, а не со связанного |
Автономность | Требует установленное приложения Whatsapp на телефоне. | Не требует установленного приложения Whatsapp. Физический телефон требуется только в процессе регистрации. Для виртуальных номеров и вовсе не требуется |
Привязка к телефону | Нельзя зарегистрировать много номеров в качестве API используя один телефон | Можно зарегистрировать любое количество номеров в качестве API, используя один лишь физический телефон или вообще обойтись без телефона, прибегая к услугам поставщика виртуальных номеров |
Пример использования API для регистрации телефона
С авторизацией по QR-коду все понятно. Есть бесчисленное количество сервисов, предоставляющих такой вариант подключения API. Но что насчет авторизации по СМС коду? API без телефона, чем-то напоминающий Whatsapp Business API, только с расширенными функциями по управлению чатами и контактами, казалось бы, это «вожделенный», хотя и «кусачий» способ авторизации для альтернативных сервисов Whatsapp API, должен найти своего клиента.
Но данный способ все еще не получил пока широкого распространения. Здесь я приведу последовательность выполнения запросов для авторизации по SMS, которые предоставляются:
Берем подходящий номер телефона и выполняем метод requestRegistrationCode, например, используя библиотеку baileys для nodejs, представляющую собой программную реализацию альтернативного мобильного и веб-клиента WhatsApp
import makeWASocket, { fetchLatestBaileysVersion, makeCacheableSignalKeyStore, useMultiFileAuthState } from "@whiskeysockets/baileys"
const { state, saveCreds } = await useMultiFileAuthState('baileys_auth_info')
const { version, isLatest } = await fetchLatestBaileysVersion()
const sock = makeWASocket({
mobile: true,
auth: {
creds: state.creds,
/** caching makes the store faster to send/recv messages */
keys: makeCacheableSignalKeyStore(state.keys, null),
},
})
const { registration } = sock.authState.creds || { registration: {} }
await sock.requestRegistrationCode(registration)
В качестве ответа приходит сырой json из Whatsapp примерно следующего содержания:
{
"flash_type": 0,
"length": 6,
"login": "790012345673442",
"method": "sms",
"notify_after": 86400,
"retry_after": 172805,
"sms_wait": 172805,
"status": "sent",
"voice_wait": -1,
"wa_old_wait": 65
}
Если "status": "sent", то в течение нескольких секунд мы должны получить SMS сообщение на телефон с проверочным кодом:
Далее выполняем второй запрос register, куда передаем сам код:
const response = await sock.register(whatsappCode)
В ответ получаем json
{
"autoconf_type": 1,
"lid": "64832766259272",
"login": "790012345673442",
"security_code_set": false,
"status": "ok",
"type": "existing"
}
Поле "status": "ok" означает, что номер зарегистрирован в качестве клиента Whatsapp и теперь можно использоваться как API.
Заключение
В заключение следует отметить, что при выборе стороннего сервиса Whatsapp необходимо понимать плюсы и минусы использования QR и SMS авторизации. Если требуется максимальная универсальность, то QR-верификация является более предпочтительным решением. Если же нужно обеспечить максимальную бесшовность и удобство для пользователей, то использование SMS-кодов может быть более подходящим вариантом. Что касается этической стороне вопроса, то зная номера телефонов, есть риск злоупотребления запросами смс-ок, и голосовыми звонками, что несомненно будет раздражать пользователей. Именно поэтому в Whatsapp применяется очень суровый лимит на запрос кодов для одного номера.