Существует ли способ показывать внутренние объявления на основе местоположения текущего пользователя?

Привет!

Хотел уточнить: есть ли в Discourse способ показывать внутренние объявления в зависимости от местоположения текущего пользователя? Я понимаю, что у нас есть: House Ads in the official Ad Plugin, готовая для показа объявлений, но мне просто нужно знать, можно ли как-то получить местоположение текущего пользователя через Discourse.

Если такого способа в Discourse нет (например, требуется сторонний инструмент), я знаю, что у нас есть IP-адреса при регистрации. Можно ли использовать их для определения местоположения пользователя?

С уважением!

Привет, hyphalos! :blob_wave:

Независимо от контекста существующего или гипотетического плагина рекламы, в Discourse есть встроенная функция для этого, доступная из административного представления профиля пользователя:

Конечная точка: https://your-discourse.com/admin/users/ip-info.json?ip={user_ip}, с использованием GET-запроса.

Привет, @Canapin,

Спасибо за быстрый ответ!

Я попытался написать короткий скрипт на Python для этого, но он возвращает мне веб-страницу, а не JSON. Когда я добавил .json к GET-URL, он возвращал просто {}. Однако, когда я делаю запрос с использованием ID пользователя (https://your-discourse.com/admin/users/{user_id}/ip-info.json?ip={user_ip}), информация о пользователе с IP-адресом отображается.

Я даже попытался открыть этот URL в браузере, но получил сообщение: Oops! That page doesn’t exist or is private.

Кстати, наш Discourse сейчас работает на стабильной версии (v3.1.1).

Я хотел спросить: нужен ли мне лицензия MaxMind для работы этого функционала? Если нет, возможно ли, что предоставленная конечная точка неверна? Я получаю ответ от /admin/users/{user_id}.json, но по какой-то причине не получаю корректный ответ от /admin/users/ip-info?ip={user_ip}. Вместо этого я получаю пустую веб-страницу в формате HTML с нашего сайта Discourse.

Кроме того, есть ли ссылка на список полезных конечных точек, которые предоставляет Discourse, например, на ту, которую вы поделились?

Спасибо!

Это потому, что он возвращает только содержимое https://your-discourse.com/admin/users/{user_id}.json. Он игнорирует часть ip-info, так как это некорректная конечная точка в данном случае.

И да, я не подумал об этом :person_facepalming:, но да, думаю, вам, вероятно, понадобится ключ Maxmind для получения геолокации.

Итак, подытожим:

  1. Если вы хотите получить IP-адрес пользователя, вам нужно сделать GET-запрос (с учетными данными администратора) к https://your-discourse.com/admin/users/{user_id}.json. Он вернет IP-адрес наряду с другой информацией о пользователе.

  2. Если вы хотите определить местоположение по IP-адресу, вам нужен ключ Maxmind (который нужно добавить в app.yml), и вы должны сделать GET-запрос к этой конечной точке: https://your-discourse.com/admin/users/ip-info.json?ip={user_ip}.

Существует документация по API: https://docs.discourse.org/
Но не все конечные точки перечислены здесь. Однако API Discourse очень легко реверс-инжинирить: Reverse engineer the Discourse API. Именно так я и получил эту информацию.

Спасибо, @Canapin, думаю, это именно то, что мне нужно. Я попробую оформить лицензию MaxMind и двигаться дальше. Если мне удастся получить лицензию и повторить попытку, я обновлю эту тему. До связи!

Привет @Canapin,

Я получил бесплатную лицензию MaxMind, и API https://your-discourse.com/admin/users/ip-info.json?ip={user_ip} работает отлично, спасибо!

У меня есть ещё один вопрос: поскольку для получения IP-адреса и последующего вызова этого API требуется идентификатор пользователя (user ID), как быть с анонимными пользователями? Что, если мы захотим показывать им рекламу, но у них нет user ID? Это всё ещё возможно, или эта функция предназначена исключительно для авторизованных пользователей?