Сервис позволяет определять местонахождения IP - адреса.
В базе сервиса IP – адреса РФ, Украина (с точностью до города). США, Канада, Европа и часть Aзии (с точностью до страны).
Сайт сервиса - http://ipgeobase.ru/
Документация по API - http://blog.ipgeobase.ru/?p=76
Регистрация / авторизация не требуется.
Параметры запроса.
Примеры запроса:
http://ipgeobase.ru:7020/geo?ip=109.254.254.155 (ответ – XML).
http://ipgeobase.ru:7020/geo?ip=109.254.254.155&json=1(ответ – JSON).
В ответе содержится: блок ip адресов, страна, город, регион, округ и координаты.
Недостатки: возвращает кириллические символы в кодировке windows-1251, нечитаемые sql server.
CREATE PROCEDURE [dbo].[api_IpGeoBaseru_IPLocation_request]
@parameters ExtendedDictionaryParameter READONLY, -- входящие параметры для внутренней обработки (используйте Key, Value2)
@username nvarchar(32) -- текущий пользователь.
AS
BEGIN
DECLARE @IPStr nvarchar(max)
-- получение значений полей формы из @parameters
SELECT @IPStr = ISNULL( Value2 , '' ) FROM @parameters WHERE [Key] = 'IPStr'
IF LEN( ISNULL( @IPStr , '' ) ) = 0
SET @IPStr = N'178.219.186.12'
DECLARE @apiUrl1 nvarchar(max) = '' -- Финальная строка для отправки -- ФАКТИЧЕСКИ ЭТО Url
-- IP передается как параметр в Url
SET @apiUrl1 = 'http://ipgeobase.ru:7020/geo?ip='+ISNULL( @IPStr, '' )
-------------------------------------------------------------------------------------------
-- ОТЛАДКА
insert into as_trace ( header, text, username, code , created ) values( 'apiUrl1' , @apiUrl1 , @username, 'api_IpGeoBaseru_IPLocation_request' , GETDATE() )
-------------------------------------------------------------------------------------------
-- SELECT 1 Msg, Result, Url (адрес, куда будет идти запрос)
select '' Msg, 1 Result
, @apiUrl1 Url
-- не используется
-- SELECT 2 PARAMETERS - параметры, которые будут передаваться во внешний источник
-- select 'id' name, '5' value, '' [type] -- form (в форме передается), header (в http headers), get запросы передавайте прямо в URL
END
CREATE PROCEDURE [dbo].[api_IpGeoBaseru_IPLocation_response]
@response nvarchar(max),
@parameters ExtendedDictionaryParameter READONLY, -- входящие параметры для внутренней обработки (используйте Key, Value2 - те же что и на request)
@username nvarchar(32)
AS
BEGIN
-- ОТЛАДКА
insert into as_trace ( header, text, username, code , created ) values( 'LEN @response ', LEN ( @response ) , @username, 'api_IpGeoBaseru_IPLocation_response' , GETDATE() )
insert into as_trace ( header, text, username, code , created ) values( '@response - 1 , 1024 ', SUBSTRING ( @response , 1 , 1024 ) , @username, 'api_IpGeoBaseru_IPLocation_response' , GETDATE() )
IF LEN( ISNULL( @response , '' ) ) =0
BEGIN
SELECT 'Ошибка!' AS Msg, 0 Result, 'Ошибка! Получена срока @response нулевой длины!' AS Response
RETURN
END
DECLARE @xml_STR Nvarchar(max)
SET @xml_STR = @response
DECLARE @xml xml -- переменная в которую преобразуем полученную строку
-- ПРИХОДИТ КОДИРОВКА encoding="windows-1251"
set @xml_STR = REPLACE( @xml_STR ,'UTF-8','UTF-16')
set @xml_STR = REPLACE( @xml_STR ,'windows-1251','UTF-16')
set @xml =convert (xml, @xml_STR)
DECLARE @exist_ipAnswer bit = 0
select @exist_ipAnswer = @xml.exist('/ip-answer')
IF @exist_ipAnswer = 0
BEGIN
SELECT 'Ошибка! В результате запроса @response нет корневого элемента ip-answer!' Msg, 0 Result, 'Ошибка! В результате запроса @response нет корневого элемента ip-answer!' Response
RETURN
END
-- Город Москва -- Регион Москва -- Округ Центральный федеральный округ -- Страна /RU
DECLARE @value_IP NVARCHAR(MAX) = N'' -- @value_IP
DECLARE @inetnum NVARCHAR(MAX) = N'' --
DECLARE @country_iso_code NVARCHAR(MAX)= N'' -- Страна RU
DECLARE @city NVARCHAR(MAX) = N'' -- Город Москва
DECLARE @region NVARCHAR(MAX) = N'' -- Регион Москва
DECLARE @district NVARCHAR(MAX) = N'' -- Округ Центральный федеральный округ "Центральный"
DECLARE @lat NVARCHAR(MAX) = N'' -- data_geo_lat
DECLARE @lon NVARCHAR(MAX) = N'' -- data_geo_lon
select @value_IP = @xml.value('/ip-answer[1]/ip[1]/@value' , 'nvarchar(200)' )
select @inetnum = @xml.value('/ip-answer[1]/ip[1]/inetnum[1]' , 'nvarchar(200)' )
select @country_iso_code = @xml.value('/ip-answer[1]/ip[1]/country[1]', 'nvarchar(200)' )
select @city = @xml.value('/ip-answer[1]/ip[1]/city[1]' , 'nvarchar(200)' )
select @region = @xml.value('/ip-answer[1]/ip[1]/region[1]' , 'nvarchar(200)' )
select @district = @xml.value('/ip-answer[1]/ip[1]/district[1]' , 'nvarchar(200)' )
select @lat = @xml.value('/ip-answer[1]/ip[1]/lat[1]' , 'nvarchar(200)' )
select @lon = @xml.value('/ip-answer[1]/ip[1]/lng[1]' , 'nvarchar(200)' )
-- SELECT 1
select 'Ok' Msg
, 1 Result
-- , @response Response -- ТАК при вызов из формы вернет оригинальный @response !!!
, 'Ваш IP: ' +IIF ( @value_IP = '', '' , @value_IP )
+'; Город: ' +IIF ( @city = '' , '' , @city )
+'; Регион: '+IIF ( @region = '' , '' , @region )
+'; Округ: ' +IIF ( @district = '', '' , @district )
+'; Страна: '
-- +IIF ( @country = '' , '' , @country ) + '-'
+IIF ( @country_iso_code = '' , '' ,@country_iso_code )
+'; Координаты : '+IIF ( @lat = '' , '' ,@lat ) + ' ' +IIF ( @lon = '' , '' ,@lon ) + '.'
AS Response
-- SELECT 2 Внешние действия
END