Как реализовать geoip в node.js и mongodb - PullRequest
5 голосов
/ 14 декабря 2011

Я видел несколько примеров использования geoip в node.js, таких как https://github.com/kuno/GeoIP.git и https://github.com/wadey/node-geoip. Однако я хочу отобразить карту, показывающую geoip для конкретного зарегистрированного пользователя. Как можно это будет реализовано.

Ответы [ 5 ]

8 голосов
/ 15 декабря 2011

Вы можете получить базу данных геолокации (например, от http://www.maxmind.com)) и сохранить ее в монго. Каждая запись содержит диапазон IP (начало / конец) и широту / долготу, связанные с этим диапазоном IP. Представляются IP-адреса.в виде целых чисел. Вы можете создать индекс в поле start и выполнить запрос к mongo, чтобы найти запись с наибольшим значением start, которое меньше, чем IP-адрес вашего клиентского пользователя, и найти соответствующий лат/lon.

Что касается построения карты с этим широтой / долготой, очень легко создать карту Google с центром в определенном месте: (Просмотреть источник по адресу: http://code.google.com/apis/maps/documentation/javascript/v2/examples/map-simple.html)

Существует много разных способов хранения / запроса данных о геолокации, но это только один из возможных подходов, использующих монго, которые могут сработать. Надеюсь, это поможет.

4 голосов
/ 15 декабря 2011

На мой взгляд, лучший модуль для GeoIP - https://github.com/kuno/GeoIP (я фактически использовал этот модуль для проекта, и он отлично работал для меня).Вам необходимо загрузить базу данных из Maxmind, а также установить некоторые библиотеки для конкретной ОС и затем скомпилировать модуль.

Нет необходимости помещать базу данных в MongoDB, если вы не хотите легко реплицировать ее на несколько серверов.Вы можете просто поместить свою базу данных в файл и указать путь в модуле Node.js.

Вот пример:

// Open the GeoLiteCity.dat file first.
var City = geoip.City;
var city = new City('/path/to/GeoLiteCity.dat');
console.log(city); // this contains country, city, lat, long, continent, postal code etc
0 голосов
/ 11 декабря 2017

Я только что опубликовал модуль NPM для IPLocate.io API , который я создал, который позволяет вам найти местоположение (город, страну и координаты) на основе IP-адреса.

Супер просто, нет баз данных для загрузки и 1500 бесплатных запросов в день.

Установить

npm install node-iplocate

Использование

const iplocate = require("node-iplocate");

iplocate("8.8.8.8").then(function(results) {
  console.log("IP Address: " + results.ip);
  // IP Address: 8.8.8.8
  console.log("Country: " + results.country + " (" + results.country_code + ")"); 
  // Country: United States (US)
  console.log("Continent: " + results.continent); 
  // Continent: North America
  console.log("Organisation: " + results.org + " (" + results.asn + ")"); 
  // Organisation: Google LLC (AS15169)

  console.log(JSON.stringify(results, null, 2));
  /*
    {
      "ip": "8.8.8.8",
      "country": "United States",
      "country_code": "US",
      "city": null,
      "continent": "North America",
      "latitude": 37.751,
      "longitude": -97.822,
      "time_zone": null,
      "postal_code": null,
      "org": "Google LLC",
      "asn": "AS15169"
    }
  */
});

// Or with callbacks
iplocate("8.8.8.8", null, function(err, results) {
  // ...
  console.log(JSON.stringify(results, null, 2));
});

// Provide an API key from IPLocate.io
iplocate("8.8.8.8", { api_key: "abcdef" }).then(function(results) {
  // ...
});
0 голосов
/ 17 апреля 2015

расширяя ответ mpobrien-

Я нашел, что это более простой и быстрый подход.

Загрузите двоичный БД в maxmind

http://dev.maxmind.com/geoip/geoip2/geolite2/ http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz

Используйте node-maxmind-db

https://github.com/PaddeK/node-maxmind-db

var mmdbreader = require('maxmind-db-reader');

// open database
var countries = mmdbreader.openSync('./countries.mmdb');

// get geodata
app.get('/api/v1/ip/', function(req, res) {
    var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

    countries.getGeoData(ip, function(err, geodata) {
        if(!err && geodata.location) return res.json({success: true, location: geodata.location});
        return res.json({success: false, location: null, error: err});
    });
});

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

Преимущества -

Файл данных с дополнительными данными имеет небольшой размер и его легко обновить.Нет БД-импорт-экспорт.Просто поменяйте местами файл и перезагрузите данные.т.е.- mmdbreader.openSync()

0 голосов
/ 12 ноября 2012

Python Реализация:

#!/usr/bin/python
#coding: utf-8
import os
import pygeoip


gi = pygeoip.GeoIP('GeoIP.dat')
gic = pygeoip.GeoIP('GeoIPCity.dat')


fl = file(r'apache-unique.log')
lines = fl.readlines()

for line in lines:
    print gi.country_code_by_addr(line)
    print gic.record_by_addr(line)

os.system('pause')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...