Как наколхозить карту для Pokemon GO

Данный пост следовало опубликовать пару недель назад, но я бросил всю эту движуху и занялся другими делами. Мини рассказ о том, как убить вечер выходного дня, поехали 🙂.

На волне хайпа по покемонам уже создано сумасшедшее количество ПО, только на github’е на момент написания статьи больше 16к репозиториев. И до изменения API с картами всё было довольно просто — качаешь https://github.com/AHAAAAAAA/PokemonGo-Map и вперёд. Но потом Niantic обиделись и вместо нормального апгрейда сетевой части игры и серверных мощностей начали делать всякие глупости, о чём писали в https://habrahabr.ru/post/307974/. Ну а чем меньше фич в игре нормально работало (лапки, трекинг, изначальное отсутствие чатов, пвп, развития геймплея) и чем больше было банов, тем больше падал интерес честных игроков. А после «расшифровки» новой версии API количество ботов, карт и прочего фансервиса только увеличилось, ибо очень уж много кто хотел урвать себе кусочек такого знатного пирога. Разрабы всей этой прелести призывают к пожертвованиям через PayPal, биткоины, etc… или просто показывают рекламу.

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

Гугление дало десктопную карту https://github.com/mchristopher/PokemonGo-DesktopMap/releases и т.к. было почему-то лень искать другие форки или обратиться к 4pda, я решил позапускать данную карту в большом количестве экземпляров на виртуалке. С чем и возникли проблемы. Карта решительно не хотела работать на win 2008 server, после чего переехала на win 7 x64, после чего не хотела работать более чем с 8 аккаунтами. Впоследствии выяснилось, что дело в другом — ниантик ужесточил условия для аккаунтов и теперь после регистрации нужно было логиниться в игре, принимать лицензионное соглашение, выбирать внешность, ловить первого покемона, вводить никнейм и после этого уже бегать и наслаждаться жизнью. Тем не менее, я думал, что это проблема с БД, плюс программа потребляла много ресурсов (особенно в таком количестве копий) и решил поискать другие решения. Таким образом были просмотрены некоторые конфигурационные файлы и в итоге найдена волшебная папка, аналогичная AHAAAAAAA/PokemonGo-Map, только с новым API.

C:\Users\UserName\AppData\Local\pokemon\app-0.2.1\resources\app\map

Папка была тут же перенесена на Debian 7 и карта не запустилась, потому что просила всякого и разного. Установить все зависимости не получилось, споткнулся на старой версии libc6, поэтому всё переехало на Ubuntu, запустилось, а потом уже на минималистичную виртуалку с Debian 8.

Затем мне захотелось сделать покрытие без дыр, благо карта позволяет отрисовать отслеживаемые области, по которым «прыгает» бот и сканирует окрестности. В зависимости от количества шагов получаются соты с радиусом в количество шагов. Я напечатал карту на принтере и попытался порисовать и поприкладывать вырезанные соты… как вы понимаете, точность была не велика, но принцип понятен, поэтому всё это дело я перенёс в гугл таблицы и начал думать как рассчитывать смещение сот относительно друг друга. С математикой было довольно тяжко разбираться в час ночи, тем более сначала я не учёл некоторые детали, вроде количества окружностей и поправки на радиус этих маленьких окружностей…

С рисунком будет понятнее. Разные цвета — это наши соты, красный-прекрасный это точка отсчёта в удобном месте района или города. Следующие соты подбираются исходя из удобства и необходимости покрыть территорию. Диаметр большого круга — это круг, описанный около соты (т.е. вокруг шестиугольника), маленького круга — одного шага (если не понятно — смотрите следующую картинку), dy — сдвиг по оси y (вертикальная), dx — соответственно по x (горизонтальной). Диаметры вычислялись приблизительно по Google Maps вычитанием координат, сдвиги вычислялись на основе каких-то забытых знаний геометрии, а потом корректировались подбором, т.к. наши соты должны слегка «залазить» друг на друга, чтобы исключить просветы.

Дальше всё просто, вбиваем координаты в ячейки начальной точки (Внимание! Алярм! В гугло картах и соответственно скриптах в качестве разделителей целой и дробной части числа используются точки, в вычислениях в таблице — запятые). Выбираем следующую соту, например она будет выше и правее, значит координата y увеличится и координата x, внезапно, тоже, поэтому смело печатаем что-то вроде =Q19+C3 и =R19+C4 соответственно, аналогичным образом получаем сколько угодно координат нужных сот. Пусть не особо автоматизировано, зато просто и понятно.

Подготавливаем серверную часть. Переносим файлы карты в, хм… какой-нибудь /opt/go или в ~/go

Переходим в эту директорию, устанавливаем нужных владельцев на файлы и папки. Затем устанавливаем необходимые зависимости и проверяем что всё хорошо. Операционная система, напомню, debian 8 или ubuntu 15.04 и старше.

apt install python-pip python-dev
pip install -r requirements.txt
pip install --upgrade pip
pip install -r requirements.txt
pip install xxhash
pip install raven

Содержимое скрипта startthis.sh (и не забываем сделать его исполняемым!)

#!/bin/bash

tokillbypid=`ps axu | grep кусок_вашего_ключа_гугло_карт | grep runserver.py | awk '{print $2}' | head -n1`

while [ "$tokillbypid" ]
 do
 echo -e "PID процесса: $tokillbypid"
 kill -9 $tokillbypid
 sleep 1
 tokillbypid=`ps axu | grep кусок_вашего_ключа_гугло_карт | grep runserver.py | awk '{print $2}' | head -n1`
 echo "Следующий PID: $tokillbypid"
 done

# Формируем строки запуска отдельных экземпляров карты, для каждого экземпляра отдельные: логин и пароль (PTC), координаты и порт.
# Одни на всех: ваш личный (специально зарегистрированный) ключ для гугло карт из панели https://console.developers.google.com , IP адрес или имя хоста.

sleep 2; python runserver.py -a ptc -u логин -p пароль -st 4 -fl -k ключ -l "координата_y, координата_x" -H IP_адрес_или_имя_хоста -P порт > /dev/null 2>&1 &

exit 0

Ранее карты работали не особо стабильно, поэтому проще было не проверять их, а просто убивать каждые 30-40 минут. Добавляем в крон по crontab -e

*/30 * * * * cd ~/go && bash startthis.sh

Не кошерно? — Ну, пока как умею.

По следующей картинке виден результат (по умолчанию данные области не отображаются, можно включить в боковой панели настроек на самой странице с картой). Далее страницу можно встроить в какой-нибудь html фрейм, как душе угодно.

Кстати все скрипты пишут данные в одну и ту же БД sqlite, поэтому результаты работы всех копий отображаются вместе. Чем цвет зеленее — тем свежее данные по данной области, соответственно оттенки в сторону жёлтого и красного — самые старые данные.

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *