API для внешних инструментов (замена map.sql)

  • Travian Kingdoms, как и TRAVIAN, располагает интерфейсом для анализа игровых данных, которые могут быть официально использованы для созданиях различных приложений/анализаторов для игры. Для разработчиков доступна следующая информация:


    • Информация по игровому серверу;
    • Информация по игрокам (включая их деревни);
    • Информация по альянсам;
    • Информация, полученная с карты.


    Технические данные


    При каждом запросе вы получите JSON закодированный объект в следующем формате:


    {
    time: long
    error: (опционально) объект с дополнительной информацией об ошибке
    response: API - ответ
    }


    Все данные запрашиваются по следующей ссылке: http://[сервер]/api/external.php
    Действия и параметры передаются по следующему URL-параметру: http://[spielwelt]/api/external.php?action=[Aktion]&[param]=[paramvalue]


    Как я могу получить данные?



    1. requestApiKey


    Для использования интерфейса вам понадобится, в первую очередь, запросить privateApiKey / publicSiteKey. С privateApiKey вы сможете запросить дальнейшие данные.


    Aktion:

    • requestApiKey


    Parameters:

    • email: String (макс. 255 знаков): Действующий адрес электронной почты, по которому мы сможем с вами связаться
    • siteName: String макс. 255 знаков): Название вашего приложения
    • siteUrl: String макс. 255 знаков): Действующая ссылка (http://) на ваше приложение
    • public: bool: true/false: true = ваше приложение, возможно, будет опублиновано в списке приложений


    Response:

    Code
    [FONT=courier new]privateApiKey (String)[/FONT][FONT=courier new]
    publicSiteKey (String)[/FONT]



    2. updateSiteData


    Вы можете запросить этот параметр, если вы желаете обновить какие-либо данные в вашем приложении.


    Action:

    • updateSiteData


    Parameters:

    • privateApiKey: String: Ваш личный Api Key (получаете через запрос requestApiKey)
    • email: String (макс. 255 знаков): Действующий адрес электронной почты, по которому мы сможем с вами связаться
    • siteName: String (макс. 255 знаков): Название вашего приложения
    • siteUrl: String (макс. 255 знаков): Действующая ссылка (http://) на ваше приложение
    • public: bool: true/false: true = ваше приложение, возможно, будет опублиновано в списке приложений


    Response:

    • true = если всё правильно


    3. getMapData

    Для получения публичных данных карты (старая map.sql) с определенной датой.


    Action:

    • getMapData


    Parameters:

    • privateApiKey: String: Ваш личный Api Key (получаете через запрос requestApiKey)
    • date: String (опционально): Дата должна быть в формате: d.m.Y (например, 27.08.2014). Если дата не будет указана, будет взято «сегодня».


    Response:



    4. Что такое «externalLoginToken»


    С «externalLoginToken» вы можете идентифицировать игрока, без которого игроку нужно было бы пройти регистрацию в вашем приложении.


    Если вы запросите requestApiKey вы получите privateApiKey и publicSiteKey. PrivateApiKey является вашим личным ключом, который должен держаться в тайне. Этот ключ вам понадобится для запросов к нашему интерфейсу (API). PublicSiteKey, в отличии от privateApiKey, может быть опубликован.


    Если игрок желает войти на ваш сайт, ему понадобится accessToken для вашего сайта. Чтобы получить accessToken, игроку понадобится перейти в настройки своей игровой учетной записи, перейти к информации о внешних инструментах, нажать на «Создать доступ» и указать ваш publicSiteKey.


    Если игрок введет accessToken на вашем сайте, вы сможете рассчитать externalLoginToken следующим образом:

    Code
    $externalLoginToken = md5($accessToken.$privateApiKey);


    Теперь вы сможете найти игрока в созданной таблице с помощью данных getMapData и позволить игроку войти на ваш сайт.

  • Теперь вы сможете найти игрока в созданной таблице с помощью данных getMapData и позволить игроку войти на ваш сайт.


    Этот механизм не пригоден для аутентификации пользователей!
    accessToken игрока действителен только для сервера, на котором он был сгенерирован. Получается, что опознать пользователя возможно только. если знать, на каком сервере был сгенерирован этот токен и данные по этому серверу присутствуют в базе. Кроме прочего, данные могут буть, но игрока в них может не быть, потому что он зарегистрировался на сервере только что (или не только что, но после последнего обновления).


    Этот способ пригоден только для автоматической подгрузки данных по акаунту игрока на сервере (чтоб их загурзить мог только владелец ака).


    Если у разработчиков есть желание использовать Травиан в качестве провайдера аутентификации для сторонних сайтов, они должны сделать генерацию токена в лобби.


    Кстати, а с какой периодичностью обновляются данные в этом апи?

  • privateApiKey и publicSiteKey имеют какой-то срок действия или вечны? Они генерируются при каждом их запросе новые или будут неизменны при неизменности данных приложения? Если генерируются новые, то старые аннулируются или могут работать параллельно?

  • privateApiKey - не меняется.
    publicSiteKey - не использую потому не в курсе.


    - - - Добавлено - - -


    Кстати, а с какой периодичностью обновляются данные в этом апи?


    в час ночи по МСК просиходит обновление. Я как-то пытался скачать свежак в 2 ночи - выдало ошибку. обычно качаю в районе 5-6 утра.

  • А где получить эти данные , какой экшен использовать, какие параметры передавать, есть гденибудь документация?



    Информация по игровому серверу;
    Информация по игрокам (включая их деревни);
    Информация по альянсам;
    Информация, полученная с карты.

  • Вот мой запрос http://ks2-ru.travian.com/api/…&privateApiKey=****&data=22.08.2015


    Может, дело в дате? Возможно, сервер не умеет отдавать данные из будущего :)
    Ну и, учитывая. что данные обновляются в полночь по серверу, самые свежие данные, которые можно получить - за вчерашнюю дату (это выплывает не только из времени обновления, но и проверено экспериментально).


    И ещё один явно не указанный нюанс - для каждого сервера свой набор ключей (но там в ответе будет ещё дополнительно указано, что нет доступа).


  • https://ru.wikipedia.org/wiki/…B%D1%8E%D1%87%D0%BE%D0%BC


    Читай мануалы. Если не разбираешься не городи чушь. Все работает.


    НО для пользователя этот способ на мой взгляд сложнее чем просто внести имя и пароль и зарегиться на сайте "по старинке".


    - - - Добавлено - - -



    Если игрок введет accessToken на вашем сайте, вы сможете рассчитать externalLoginToken следующим образом:

    Code
    $externalLoginToken = md5($accessToken.$privateApiKey);


    Теперь вы сможете найти игрока в созданной таблице с помощью данных getMapData и позволить игроку войти на ваш сайт.


    md5 уже устарел.



    Даже в мануале его не рекомендуют использовать:

    Quote

    Замечание: Безопасное хэширование паролей
    В связи с быстрой природой хэширующего алгоритма не рекомендуется использовать эту функцию для обеспечения безопасности паролей. Подробнее об этом можно прочитать здесь.

  • Читай мануалы. Если не разбираешься не городи чушь. Все работает.


    Я не говорил, что оно не работает!
    Ты вообще понимаешь, в чём смысл провайдера аутентификации? Толку мне от того, что пользователь вместо пароля введёт токен и я смогу проверить, что токен действительный? Я даже не могу просто понять, заходил ли уже этот пользователь раньше на сайт, если он использовал токен с другого сервера.

  • Quote

    если он использовал токен с другого сервера.


    Ну это уже проблема которую ТГ и не собирается решать. Если на акке А играло 3 человека, то по хорошему на стороннем сайте надо создать 3 учетки и реализовать систему дуалов, с общим доступом в оффкору/дефккор/войскам/пуш-листу/сам-листу или ради чего там этот сайт создавался. Ну и ТГ ен собираюстя давать инфу об реальных игроках которые играют на одном акке.


    Единственное для чего прикольна эта система: можно оставить обычную регистрацию, но сделать проверку на реальность акка.

  • Поэтому я и говорю, что привязку надо делать к лобби, а не серверу. Тогда как минимум можно будет опознать пользователя независимо от его текущего сервера и его роли там.


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

  • Ну, на php могло бы быть только апи (оно всего лишь генерирует ключи и выдёргивает данные из базы), а серверная часть на чём угодно, но если покопаться, то можно найти и другие ссылки с расширением php, так что таки php.

  • Quote

    Ну, на php могло бы быть только апи (оно всего лишь генерирует ключи и выдёргивает данные из базы)


    Ну это было бы знатное извращение)


    А можно еще показать где есть php?
    А то меня уверяли что серверная часть на javascript, node.js который.

  • Я уже не помню, как я это обнаружил. Возможно, изначально где-то забыли скрыть имя файла из ссылки, но такие ссылки можно было увидеть в консоли. Сейчас я найти не смог.


    http://ks-fis.travian.com/api/index.php?c=map&a=getByRegionIds&t1432483144464


    Этого index.php сейчас в ссылках нет, но если его добавить ссылка работает точно так же, как и без него. Сомневаюсь, что запросы к index.php куда-то проксируются.


    Правда, тут тоже в ссылке есть api, но через этот адрес работает весь фронтенд.



    node.js, я уверен, тут тоже есть - на нём должны работать чаты.

  • А почему нельзя реализовать чаты на php?


    Видимо, потому, что для чатов используется библиотека socket.io, в которой и клиент и сервер на js :)
    Почему использовали именно socket.io, а не, например, Ratchet я точно сказать не могу, но есть вероятность, что причина в том, что Ratchet - это только сокет сервер, а socket.io имеет и клиентскую часть.

  • Всем привет,
    честно не смог разобраться. Для некоторых серверов API не работает.
    http://ks2-ru.travian.com/api/external.php - работает
    http://ks4-ru.travian.com/api/external.php не работает
    http://тs4-ru.travian.com/api/external.php не работает



    Где взять правильный линк для 4 сервера? Сервер называется тs4, http://тs4-ru.travian.com/api/external.php - должно работать, но не работает