Pokémon GO сейчас повсюду, и если вы, как Эш Кетчум или я, хотите поймать их всех, это путешествие может быть непростым. Такие инструменты, как PokeVision, могут помочь в этом квесте. Проблема в том, что эти инструменты требуют постоянной проверки. Давайте создадим сервис с использованием Twilio SMS, который будет уведомлять вас по SMS, когда рядом с вашим местоположением появятся определённые покемоны.
**ВНИМАНИЕ:** *У Pokémon GO нет официального API, и механизмы, которые использует сообщество для создания инструментов вокруг игры, постоянно меняются. Этот метод может полностью перестать работать.*
Теперь давайте узнаем, как создать это самостоятельно!
Для начала нужно сделать несколько выборов. В отличие от выборов, которые предлагает вам профессор Оук, для этого проекта вы можете выбрать из множества языков программирования и веб-фреймворков, если они могут отправлять и получать HTTP-запросы.
В этом руководстве мы будем использовать базовый сервер Express и Node.js. Что вам понадобится для этого путешествия:
— Node.js версии 6.0 или выше. Проверьте свою версию с помощью команды `node -v`.
— Аккаунт Twilio для отправки и получения SMS – зарегистрируйтесь бесплатно!
— ngrok – подробнее об ngrok можно прочитать здесь.
Чтобы создать базовый сервер Express, начните с клонирования следующей ветки `template` этого проекта и установите зависимости:
Разместив код, запустите приложение, выполнив команду:
Вы не сможете стать лучшим в этом путешествии без необходимых данных. Или, другими словами, вам нужен ваш Покедекс. В нашем случае мы будем использовать Node-модуль под названием `pokespotter`. Это базовая обёртка вокруг API Niantic, которая вернёт вам список покемонов вокруг определённого местоположения.
Начните с установки `pokespotter`:
Подключите модуль `pokespotter` в начале файла `index.js`.
Для работы `pokespotter` вам понадобится хотя бы один аккаунт Pokémon GO. Это может быть либо аккаунт Google, либо аккаунт Pokémon Trainer Club. Сохраните данные вашего аккаунта вместе с выбранным провайдером (‘google’, если вы используете аккаунт Google, или ‘ptc’ для аккаунта Pokémon Trainer Club) в переменных окружения `PGO_USERNAME`, `PGO_PASSWORD` и `PGO_PROVIDER`. Вы также можете передать эти значения напрямую в качестве аргументов вызова `Pokespotter()`.
Добавьте следующие две строки в ваш файл `index.js`:
Теперь добавьте функцию, которая будет вызывать `spotter.getNearby` и выполнять функцию, просто возвращающую список покемонов на данный момент:
Метод `getNearby` принимает два параметра: адрес или набор координат, а также объект опций, где мы указываем значение steps. Пока мы выбрали `2`, что даёт примерно радиус в 200 метров. Текущее время сканирования для этого радиуса составляет примерно 30 секунд. Вы можете сократить это время, передав в конструктор `Pokespotter()` массив пользователей. При текущем радиусе посещается 7 точек, поэтому оптимальное количество аккаунтов будет 7. Вы также можете увеличить радиус, но это значительно увеличит время ответа.
Теперь, когда у нас есть эта функция, нам нужно её использовать. Измените обработчик для `/:address`:
Снова откройте http://localhost:3000/Central Park, New York, и вы должны увидеть первых покемонов вокруг Центрального парка. Не стесняйтесь заменить всё после `3000/` на свой адрес, чтобы проверить покемонов рядом с вами.
Для наших текстовых сообщений нас интересуют три части информации о каждом покемоне:
— Имя покемона
— Расстояние от местоположения
— Время до исчезновения
Первые две уже предоставляются `pokespotter`. Для третьей у нас есть временная метка, когда покемон исчезнет. Мы можем использовать её и модуль `moment`, чтобы предоставить эту информацию. Кроме того, мы отсортируем результат по расстоянию.
Подключите два модуля в начале файла:
Добавьте новую функцию, которая использует `moment.duration().humanize()` для добавления читаемой версии продолжительности к каждому покемону, и функцию, которая сравнивает расстояние между двумя покемонами. Измените функцию `getPokemonByAddress`, чтобы использовать две новые функции:
Хорошо, у нас есть базовая информация. Но мы хотели создать не веб-сервис для нашего Покедекса, а SMS-сервис. Здесь на помощь приходит Twilio SMS.
Чтобы получать SMS, нам нужно создать новую конечную точку `POST` для нашего веб-сервера, которая будет обрабатывать все входящие SMS. Twilio будет передавать содержимое нашего SMS и всю связанную информацию на эту конечную точку.
Сначала добавьте функцию, которая сделает нашу информацию более читаемой и ограничит её шестью покемонами, чтобы SMS оставалась короткой:
Теперь добавьте новую конечную точку `POST` для `/incoming`, которая будет использовать `Body`, отправляемый Twilio в качестве адреса, и выводить результат поиска в консоль. Не стесняйтесь также изменить другую конечную точку, чтобы использовать функцию форматирования:
Обязательно перезапустите сервер. Чтобы получать SMS, сначала нужно открыть наш локальный сервер для доступа из интернета, чтобы Twilio мог к нему подключиться. Запустите в отдельном окне консоли:
Получите номер телефона Twilio и настройте URL вебхука для входящих сообщений на `http://<ваш_поддомен>.ngrok.io/incoming`. После этого отправьте SMS на ваш номер телефона Twilio с адресом, и вы должны увидеть результат в окне терминала.
Теперь последний шаг – фактически ответить SMS. Если бы мы знали ответ сразу, мы могли бы напрямую ответить на запрос, который Twilio отправляет нашему серверу, используя TwiML. Однако, поскольку запрос данных занимает довольно много времени, нам нужно использовать Twilio REST API или, в нашем случае, библиотеку-помощник Twilio, чтобы ответить на сообщение позже.
Установите её с помощью:
Измените обработчик запроса `POST`, чтобы отправлять сообщение с результатом:
Перезапустите сервер и отправьте ещё одно SMS на ваш номер телефона Twilio. Теперь вы получите ответное SMS с шестью ближайшими покемонами в этом месте.
И последняя проблема: как получать уведомления, если тот покемон, которого вы ищете, появляется в определённом месте? Давайте добавим SMS-уведомление, когда это произойдёт, и простой способ подписаться на него.
Сначала создайте новый экземпляр Map в начале вашего файла, который будет хранить всю необходимую информацию о подписчиках:
Далее нам нужно добавить подписчиков в эту карту. Мы будем добавлять их на основе формата отправляемых ими SMS. Если вы отправите что-то вроде: `Подписаться: Пикачу; Александерплац, Берлин`, вас будут уведомлять, когда рядом с Александерплац в Берлине появится Пикачу.
Для этого измените наш обработчик SMS-запросов:
Теперь, когда мы знаем, какого покемона нужно искать и где, всё, что нам остаётся, – это искать их регулярно. Мы будем делать это каждые 60 секунд. Как только мы найдём нужного покемона для кого-то, мы перестанем его искать. Вы можете повторно подписаться, отправив то же сообщение.
Чтобы отправить сообщение без предварительного получения, нам снова нужно использовать библиотеку-помощник Twilio.
Создайте новую функцию `watchForPokemon` и запустите `setInterval` при старте сервера. Не забудьте заменить `{{ВАШ НОМЕР TWILIO}}` на ваш собственный номер Twilio:
Вот и всё! Перезапустите сервер, и вы можете начать отправлять сообщения `Подписаться`. Для тестирования я рекомендую искать покемона, который очень часто встречается в той местности, за которой вы хотите следить. Таким образом, вы должны сразу получить SMS.
Мы сделали это! Надеюсь, теперь мы сможем поймать их всех. Однако на этом можно не останавливаться. Как насчёт фильтрации обычных покемонов или предоставления возможности сортировать их по редкости?
Я не могу дождаться, чтобы увидеть, что вы создадите с помощью этого! Не стесняйтесь связаться со мной, чтобы рассказать, что вы создали, или если у вас есть вопросы:
— Email: dkundel@twilio.com
— Twitter: @dkundel
— GitHub: dkundel
— Twitch (стриминг живого кода): dkundel
Пожалуйста, помните, что эта система основана на неофициальном API, который не гарантирует постоянную работу, и они могут заблокировать вас. Поэтому иногда вам, возможно, придётся путешествовать по земле в поисках покемонов.