rails hacer ejemplos como ruby-on-rails ip-geolocation

hacer - Obtener un nombre de país de usuario de la dirección IP de origen con Ruby on Rails



como hacer un login en ruby on rails (9)

Acabo de publicar una joya para la API IPLocate.io que he creado.

Súper fácil, sin bases de datos para descargar y 1.500 solicitudes gratuitas por día:

require ''iplocate'' # Look up an IP address results = IPLocate.lookup("8.8.8.8") # Or with an API key results = IPLocate.lookup("8.8.8.8", "abcdef") results["country"] # "United States" results["country_code"] # "US" results["org"] # "Google LLC" results.inspect # { # "ip"=>"8.8.8.8", # "country"=>"United States", # "country_code"=>"US", # "city"=>nil, # "continent"=>"North America", # "latitude"=>37.751, # "longitude"=>-97.822, # "time_zone"=>nil, # "postal_code"=>nil, # "org"=>"Google LLC", # "asn"=>"AS15169" # }

Sin gema

También se puede usar sin una gema solo con Ruby''s Net::HTTP y URI :

response = Net::HTTP.get( URI.parse( "https://www.iplocate.io/api/lookup/8.8.8.8" ) )

La solicitud devolverá JSON para que pueda analizarlo y acceder a él de la siguiente manera:

country = JSON.parse( response )["country"] # => "US"

Quiero extraer un nombre de país de usuario de las direcciones IP de los visitantes.

Pude obtener la dirección IP con remote_ip . Pero, ¿cuál podría ser la forma más fácil de obtener el nombre del país?

No tiene que ser súper preciso. Cualquier biblioteca de rubí (gema o complemento) para hacer esto?

Quiero una solución simple y fácil para esto.


Aquí hay un ejemplo de Ruby llamando a la API de ipdata.co .

Es rápido y tiene un rendimiento confiable gracias a tener 10 puntos finales globales, cada uno capaz de manejar ¡> 10,000 solicitudes por segundo!

Esta respuesta utiliza una clave API de "prueba" que es muy limitada y solo para probar algunas llamadas. Regístrese para obtener su propia clave de API gratuita y obtenga hasta 1500 solicitudes diarias para el desarrollo.

Reemplaza 78.8.53.5 con cualquier ip que quieras buscar

require ''rubygems'' if RUBY_VERSION < ''1.9'' require ''rest_client'' headers = { :accept => ''application/json'' } response = RestClient.get ''https://api.ipdata.co/78.8.53.5?api-key=test'', headers puts response

Eso te daría

{ "ip": "78.8.53.5", "is_eu": true, "city": "G/u0142og/u00f3w", "region": "Lower Silesia", "region_code": "DS", "country_name": "Poland", "country_code": "PL", "continent_name": "Europe", "continent_code": "EU", "latitude": 51.6557, "longitude": 16.089, "asn": "AS12741", "organisation": "Netia SA", "postal": "67-200", "calling_code": "48", "flag": "https://ipdata.co/flags/pl.png", "emoji_flag": "/ud83c/uddf5/ud83c/uddf1", "emoji_unicode": "U+1F1F5 U+1F1F1", "carrier": { "name": "Netia", "mcc": "260", "mnc": "07" }, "languages": [ { "name": "Polish", "native": "Polski" } ], "currency": { "name": "Polish Zloty", "code": "PLN", "symbol": "z/u0142", "native": "z/u0142", "plural": "Polish zlotys" }, "time_zone": { "name": "Europe/Warsaw", "abbr": "CEST", "offset": "+0200", "is_dst": true, "current_time": "2018-08-29T15:34:23.518065+02:00" }, "threat": { "is_tor": false, "is_proxy": false, "is_anonymous": false, "is_known_attacker": false, "is_known_abuser": false, "is_threat": false, "is_bogon": false }, }


Estoy usando este one-liner:

locale = Timeout::timeout(5) { Net::HTTP.get_response(URI.parse(''http://api.hostip.info/country.php?ip='' + request.remote_ip )).body } rescue "US"


Lo más simple es usar un servicio web existente para esto.

Hay complementos que le permiten hacer mucho más, incluso hacer que sus modelos sean conscientes de la geolocalización (geokit-rails) de forma automática, pero si todo lo que necesita es un código de país, por ejemplo, simplemente enviando un HTTP Get a http://api.hostip.info/country.php (hay otros servicios pero este no requiere una clave API) lo devolverá, por ejemplo:

Net::HTTP.get_response(URI.parse(''http://api.hostip.info/country.php'')) => US


O el sondeo http://api.hostip.info/ devolverá una respuesta XML completa con ciudad, latitud, longitud, etc.

Tenga en cuenta que los resultados que obtiene no son 100% precisos. Por ejemplo, ahora mismo estoy en Francia pero informado como en Alemania. Este será el caso para casi cualquier servicio basado en IP.


Prueba el IP2Location Ruby

https://github.com/ip2location/ip2location-ruby

Requisito previo

Descargue la base de datos gratuita LITE de http://lite.ip2location.com/ y utilícela a continuación.

Instalar

gem install ip2location_ruby

Uso

require ''ip2location_ruby'' i2l = Ip2location.new.open("./data/IP-COUNTRY-SAMPLE.BIN") record = i2l.get_all(''8.8.8.8'') print ''Country Code: '' + record.country_short + "/n" print ''Country Name: '' + record.country_long + "/n" print ''Region Name: '' + record.region + "/n" print ''City Name: '' + record.city + "/n" print ''Latitude: '' print record.latitude print "/n" print ''Longitude: '' print record.longitude print "/n" print ''ISP: '' + record.isp + "/n" print ''Domain: '' + record.domain + "/n" print ''Net Speed: '' + record.netspeed + "/n" print ''Area Code: '' + record.areacode + "/n" print ''IDD Code: '' + record.iddcode + "/n" print ''Time Zone: '' + record.timezone + "/n" print ''ZIP Code: '' + record.zipcode + "/n" print ''Weather Station Code: '' + record.weatherstationname + "/n" print ''Weather Station Name: '' + record.weatherstationcode + "/n" print ''MCC: '' + record.mcc + "/n" print ''MNC: '' + record.mnc + "/n" print ''Mobile Name: '' + record.mobilebrand + "/n" print ''Elevation: '' print record.elevation print "/n" print ''Usage Type: '' + record.usagetype + "/n"


Puede probar la gema localizadora Yandex , el servicio devuelve longitud, latitud y precisión.

conn = YandexLocator::Client.new result = conn.lookup(ip: "109.252.52.39") # => {"position"=>{"altitude"=>0.0, "altitude_precision"=>30.0, "latitude"=>55.75395965576172, "longitude"=>37.62039184570312, "precision"=>100000.0, "type"=>"ip"}}


Puedes usar gema geoip .

environment.rb

config.gem ''geoip''

Descargue GeoIP.dat.gz desde http://www.maxmind.com/app/geolitecountry . descomprime el archivo. A continuación se asume bajo #{RAILS_ROOT}/db dir.

@geoip ||= GeoIP.new("#{RAILS_ROOT}/db/GeoIP.dat") remote_ip = request.remote_ip if remote_ip != "127.0.0.1" #todo: check for other local addresses or set default value location_location = @geoip.country(remote_ip) if location_location != nil @model.country = location_location[2] end end


También puedes usar " Geocoder "

Simplemente te hará la vida más fácil. Coloque la siguiente línea en su Gemfile y emita el comando de instalación del paquete

gem ''geocoder''

Usando esta Gema, puedes obtener fácilmente el país, ip o incluso la ciudad de la IP de origen. Ver un ejemplo a continuación

request.ip # => "182.185.141.75" request.location.city # => "" request.location.country # => "Pakistan"


Un servicio que puede usar para hacer esto es el mío, https://ipinfo.io . Le da el código de país y un montón de otros detalles:

$ curl ipinfo.io { "ip": "24.6.61.239", "hostname": "c-24-6-61-239.hsd1.ca.comcast.net", "city": "Mountain View", "region": "California", "country": "US", "loc": "37.3845,-122.0881", "org": "AS7922 Comcast Cable Communications, LLC", "postal": "94040" }

Si solo quiere el país, puede obtenerlo solicitándolo /country

$ curl ipinfo.io/country US

A continuación, puede asignar un código de país a un nombre usando los datos de http://country.io , o usando el ejemplo en http://ipinfo.io/developers/full-country-names