Данный пост следовало опубликовать пару недель назад, но я бросил всю эту движуху и занялся другими делами. Мини рассказ о том, как убить вечер выходного дня, поехали 🙂.
На волне хайпа по покемонам уже создано сумасшедшее количество ПО, только на 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, поэтому результаты работы всех копий отображаются вместе. Чем цвет зеленее — тем свежее данные по данной области, соответственно оттенки в сторону жёлтого и красного — самые старые данные.