Вот как я использовал Selenium и голосовой API Twilio на Python, чтобы позвонить, когда рядом с моим местоположением в Индии появились свободные места для вакцин.
Ситуация с пандемией в Индии в мае 2021 г.
Индия переживает вторую волну пандемии коронавируса, когда во время ее пика в начале мая ежедневно регистрируется 400 тысяч случаев заболевания. Covisield и Covaxin были двумя вакцинами, которые были доступны через веб-сайт CoWIN. Covisield — это название, данное вакцине Oxford-AstraZenica, разработанной Индийским институтом сывороток, а Covaxin разработан индийской биотехнологической компанией Bharat Biotech в сотрудничестве с Индийским советом медицинских исследований и Национальным институтом вирусологии. До 1 мая вакцины были доступны только для людей старше 45 лет, а с 1 мая они также стали доступны для людей в возрасте от 18 до 45 лет. Учитывая огромное население Индии и ограниченный запас вакцин. , места на веб-сайте CoWIN заполнялись менее чем за час, а в некоторых местах даже менее чем за пять минут.
Необходимость в инструменте уведомления
Проблема заключалась в том, что не было фиксированного времени, когда появлялись слоты для вакцин. У людей были некоторые предположения о времени открытия новых слотов на основе данных за предыдущие дни, но обновлять сайт, скажем, каждые две минуты, очень утомительно. Существуют и другие приложения для оповещения, которые уведомляют вас через Telegram, электронную почту, SMS и т. д., когда слоты открываются в определенном месте. Но, насколько я знаю, нет приложения, которое звонило бы вам на ваш телефон, когда место открывается в вашем местоположении.
Когда вы получаете уведомления по электронной почте, проблема сводится к обновлению почтового ящика. Мне нужно было что-то вроде телефонного звонка, чтобы предупредить меня даже посреди ночи, если рядом со мной откроется слот. Поэтому я решил написать этот код самостоятельно. Я прочитал, что у API CoWIN были некоторые проблемы, связанные с тем, что он не получал последние данные (проблема может быть решена сейчас), поэтому я решил использовать Selenium. Однако в этом посте я также создам аналогичный инструмент уведомлений, используя CoWIN API.
Звонок на наш телефон через голосовой API Twilio
Во-первых, давайте посмотрим, как мы можем использовать голосовой API Twilio для вызова самих себя в Python. Это отличный блог, чтобы понять, как совершать телефонные звонки на Python с помощью Twilio; на самом деле его написал Мэтт Макай, работающий в Twilio.
Во-первых, нам нужно создать аккаунт на сайте Twilio. Это бесплатно. Нам нужно подтвердить нашу электронную почту и наш номер телефона после регистрации. Это номер телефона, на который мы в конечном итоге получим звонок. Мы собираемся использовать продукт Голос для Оповещений и уведомлений, и мы хотим запустить стартовое приложение без кода. Как только мы достигнем консоли Twilio, мы где-нибудь запишем SID нашей учетной записи и токен аутентификации. Они понадобятся позже в нашем коде для вызова API. Теперь нам нужен пробный номер, с которого мы будем получать звонки. Нажмите Получить пробный номер в консоли. Пожалуйста, запишите пробный номер, который мы получили здесь.
Теперь давайте установим twilio, выполнив приведенную ниже команду в терминале.
pip install twilio==5.7.0
Теперь следующий скрипт вызовет API, который позвонит нам по телефону.
В приведенном выше сценарии вставьте свой пробный номер, подтвержденный номер телефона, SID своей учетной записи и токен аутентификации в соответствующих местах. TWIML_INSTRUCTIONS_URL — это URL-адрес этой сути, в котором говорится о завершении вызова, если он получен. Если вы ответите на звонок, из вашего пробного баланса будет вычтена небольшая сумма, поэтому отклоните звонок, когда получите его.
Использование Selenium для доступа к данным CoWIN
Теперь мы собираемся использовать селен для навигации по домашней странице CoWIN. Selenium — это инструмент, который может автоматизировать взаимодействие с веб-браузером. Используя селен, мы можем заполнять поля и переходить по ссылкам.
Здесь мы видим, какой импорт нам нужен. Нам нужен импорт Selenium, Beautiful Soup для парсинга HTML и Pandas для работы с фреймворком данных. А «call» — это наш собственный файл, который мы написали в предыдущем разделе.
Чтобы перемещаться по этой странице в селене, нам нужно что-то, известное как XPath (XML Path). Например, мы можем получить XPath для нашего поля пин-кода, проверив этот конкретный элемент, а затем нам нужно щелкнуть правой кнопкой мыши, чтобы получить параметры, как показано на изображении выше.
Используя безголовую версию браузера Firefox, мы вводим пин-код в соответствующее поле и нажимаем кнопку поиска. Безголовый браузер означает браузер без графического пользовательского интерфейса. Если вы хотите увидеть ввод пин-кода в этом поле, вы можете закомментировать вторую строку в приведенном выше коде. Исполняемый файл geckodriver должен находиться в том же каталоге, что и скрипт Python для запуска приведенного выше кода.
Приведенный выше сегмент кода нажимает кнопку «Возраст 18+», получает HTML-код базы данных, анализирует его в кадре данных Pandas, а затем вызывает функцию набора номера, если количество доступных доз для дозы 1 больше нуля. Он повторяет те же инструкции через 10 минут. Переменная count отслеживает, сколько раз был сделан вызов. Пользователю делается максимум три вызова, как видно из оператора break в строке 22 в приведенном выше сегменте.
Функция convert_df в приведенном выше коде — самая запутанная часть кода, где мы создаем кадр данных pandas из проанализированного HTML.
Вышеупомянутые сегменты кода собраны в этом репозитории GitHub. Все, что вам нужно для запуска этого кода, — это заполнить файл data.json соответствующими полями и запустить команду python cowin.py в вашем терминале.
Использование API для доступа к данным CoWIN
Я видел, что это более популярный способ доступа к данным CoWIN. Я не пошел по этому пути, чтобы получить уведомление о своем слоте вакцины, потому что я прочитал, что API CoWIN имел некоторые проблемы, из-за которых он не получал последние данные. Но я включил этот метод в этот пост в блоге, чтобы представить полную картину получения данных с веб-сайта CoWIN.
Функция циферблата остается прежней; что меняется, так это способ получения данных. Этот способ намного проще предыдущего.
https://cdn-api.co-vin.in/api/v2/appointment/sessions/public/calendarByPin?pincode=<your-pin-code>&date=<todays-date in dd-mm-yy format>
Приведенный выше URL-адрес — это то, как мы можем получить доступ к данным CoWIN. Мы можем предоставить пин-код и текущую дату, чтобы получить данные на следующую неделю, если они доступны.
В приведенном выше сегменте кода мы делаем запрос к этому URL. Заголовок в приведенном выше коде указывает, какой тип браузера у пользователя. Очень важно включить этот заголовок, чтобы этот запрос выглядел так, как будто он исходит из браузера.
Приведенный выше сегмент кода получает данные из ответа JSON и проверяет, доступны ли первые дозы для людей с минимальным возрастом 18 лет.
Вышеупомянутые сегменты кода собраны в этом репозитории GitHub. Опять же, все, что вам нужно для запуска этого кода, — это заполнить файл data.json соответствующими полями и запустить команду python cowin.py в своем терминале.
Обратите внимание, что приведенные выше сегменты кода зависят от того, как данные отображаются или становятся доступными через API. Любые изменения в способе отображения данных на веб-сайте CoWIN или любые изменения в API потенциально могут вызвать некоторые ошибки с данным кодом.