Билеты на Burning Man раскупают за многие месяцы до того, как толпы людей садятся в переоборудованные школьные автобусы, грузят велосипеды на багажники машин и отправляются в пустыню. Когда пришло время покупать билет, Мануэль Эберт опоздал.
За несколько дней до Burning Man он отчаянно пытался найти билет. Он мониторил форумы, Craigslist, пытался просить друзей, но всё безуспешно. На каждый пост на форуме, на который он отвечал, он опаздывал. Билеты исчезали уже через несколько минут после публикации. Поэтому он создал приложение, которое сканировало форум Burning Man ePlaya на наличие объявлений о билетах и уведомляло его о новых билетах через Twilio SMS.
С помощью своего приложения Мануэль успешно отправился в пустыню и оказался в Black Rock City, «опутанный проводами EL и взрывающимися наковальнями на 100 футов в воздух». Вот как он это сделал.
Ниже представлен синдицированный пост Мануэля. Полный пост можно прочитать в блоге Мануэля здесь.
Я лично считаю неэтичным писать бота для получения билета за меня, но, по крайней мере, процесс сидения за компьютером и нажатия кнопки обновления можно автоматизировать. План битвы — превратить HTML-хаос доски ePlaya phpBB, которая едва graduated from nested tables, в чистые данные с помощью Kimono, а затем уведомлять меня каждый раз, когда эти данные изменяются.
Сначала определим, что нам нужно в нашем API. Вот как выглядит раздел форума:
Открыв представление необработанных данных, мы теперь видим данные, все данные и ничего, кроме данных:
{«Title»: {«text»: «Oh… my… god…»,»href»: «https://eplaya.burningman.com/viewtopic.php?f=370&t=71750″},»Date»: {«text»: «Sat Aug 30, 2014 9:16 pm»,»href»: «https://eplaya.burningman.com/viewtopic.php?f=370&t=71750″},»Replies»: «0»}
Обратите внимание, как KimonoLabs аккуратно захватывает URL-адрес отдельной темы. Мы будем использовать это позже.
Теперь мы можем сказать Kimono отправлять нам электронное письмо каждый раз, когда эти данные изменяются. Однако мы
1. не заинтересованы в получении письма каждый раз, когда кто-то отвечает в старой теме, и
2. минимальный интервал для автоматического опроса — 15 минут.
Итак, давайте напишем несколько строк на Python для работы с данными. Мы будем использовать модуль requests для вызова API:
Теперь data будет списком словарей, как показано выше. Далее нам нужно найти все новые посты. Давайте внимательнее посмотрим на URL-адреса в атрибуте title:
https://eplaya.burningman.com/viewtopic.php?f=370&t=71750
Здесь 370 — это id форума, а 71750 — id темы. Перед первым запуском скрипта давайте создадим файл с именем latest_topic.txt и поместим туда 71750. В Python мы загружаем файл, находим новейшую тему, разделяем каждый URL, чтобы найти id темы поста, и если он новее, чем новейшая тема с прошлого запуска скрипта, мы сохраняем этот пост в список new_posts. И заодно мы отслеживаем максимальный id темы, который встречаем, чтобы сохранить его, когда закончим поиск новых тем:
Отлично. Теперь обратимся к нашим друзьям из Twilio, чтобы превратить данные в службу веб-уведомлений консьержа. Twilio позволяет отправлять текстовые сообщения на любой телефон и настраивается менее чем за 5 минут. Давайте напишем короткий метод, который будет принимать пост и отправлять текстовое сообщение на номер:
Операция format превращает пост в строку, например:
*»Sat Aug 30, 2014 9:16 pm: ‘Oh… my… god…’ (0 replies) https://eplaya.burningman.com/viewtopic.php?f=370&t=71750″*
Наконец, простого POST-запроса к API Twilio достаточно, чтобы отправить эту строку на номер. Всё, что осталось сделать, — отправить текстовое сообщение для каждого поста в new_posts. Но подождите… слышали ли вы о термине «геопространственный арбитраж»? Вместо того чтобы уведомлять только себя, давайте отправим это сообщение друзьям в трёх разных часовых поясах: в США, Великобритании и Японии, чтобы максимизировать вероятность того, что кто-то из нас сможет ответить первым:
Готово. Если вы используете бесплатный пробный аккаунт Twilio, убедитесь, что все номера получателей верифицированы. Последнее, что нужно сделать, — убедиться, что этот скрипт запускается, ну, очень часто. Давайте сохраним его как ticket_search.py и добавим запись в наш Crontab, введя crontab -e в Терминале и добавив строку
* * * * * python ticket_search.py
Чтобы этот скрипт запускался раз в минуту.
Откиньтесь на спинку кресла.
В 7:04 утра по тихоокеанскому времени три телефона на трёх разных континентах мягко завибрировали как часть нашего глобально скоординированного концерта API и данных, скриптов и серверов. Я первым нажал на ссылку ответа, и, конечно же:
Невероятно счастливый и измотанный, я перевёл деньги продавцу через PayPal, написал от руки открытку с благодарностью и начал собирать сумку для Burning Man.
Полный скрипт для создания собственного уведомителя о билетах на Burning Man можно получить здесь.
* Изображение на обложке через cultriot.com*