Что нового

Функция GeoIP для AutoIt

simba48

Новичок
Сообщения
14
Репутация
0
AutoIt: 3.
Версия: 1.0

Категория: Разное

Описание:
Определение страны для IP
Пока только определим где IP, в России или нет.
Готовится полная версия.
 

Вложения

  • GeoIP-RU.zip
    58.8 КБ · Просмотры: 17

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
simba48
Пока вы не созреете до понимания своего творения, тема будет находится в "Полезняшки".
Кстати, GeoIP это IMHO функция, ну уж никак ни UDF.
 
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
Прошу прощения если что не так сделал при размещении на форуме информации.
GeoIP-FULL.au3 можно взять здесь https://yadi.sk/d/eAlxnn_xTMWRP

В планах GeoIP-City
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
simba48,
Такие вещи, ИМХО, проще через базу данных делать.
А для России, так раза в 4, в 5 быстрее будет.
 

Вложения

  • NewGeoIP-RU.7z
    32.9 КБ · Просмотры: 16
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
Я потому и начал тему, чтобы понять как ещё можно реализовать. Спасибо за совет. Я давно ничего не писал, а тут пришлось. Как у меня сделано пока устраивает, но попробую и Ваш вариант.

ps Могу Вам выслать приложение, для которого всё это понадобилось. Приложение перебирает URL и делает сводную таблицу с результатами.

Код там конечно не идеальный, т.к. я не программист и лет 10 назад последний раз что-то писал, а то и более, но с учётом этого вышло вроде неплохо. Хотя совершенству нет предела :smile:
 
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
[Сеть, интернет] Re: Функция GeoIP для AutoIt

Имею созданную из CVS файла базу данных geoip.sqlite3

Взять можно здесь https://yadi.sk/d/YQycH1TQTMVjg
Размер 18 Мбайт.

Подключаюсь к ней через sqlite3.exe

Даю запрос
Код:
SELECT COL3 FROM GeoIPA where COL1>1064096512 AND COL2 <1064096512;
получаю пустой ответ

даю запрос
Код:
SELECT COL3 FROM GeoIPA where COL1>'1064096512' AND COL2 <'1064096512';
получаю ответ

AS65456
"AS7474 SingTel Optus Pty Ltd"

Пишу код функции
Код/Пример:
Код:
Func _ResolvGeoIP_AS($IP,$State)

	  $AS_Is = "Unknown"

		 Switch $State
			case '0'
			   _SQLite_Startup()
			   If @error Then
				   MsgBox($MB_SYSTEMMODAL, "SQLite Error", "SQLite.dll Can't be Loaded!")
				   Exit -1
			   EndIf
			   _SQLite_Open(@WorkingDir & '\' & 'geoip_as.sqlite3') ; Open a :memory: database

			   If @error Then
				   MsgBox($MB_SYSTEMMODAL, "SQLite Error", "Can't Load Database!")
				   Exit -1
				EndIf

			case '1'

			   $temp=StringSplit($IP,'.')
			   $decIP = '"' & ($temp[1]*256*256*256)+($temp[2]*256*256)+($temp[3]*256)+$temp[4] & '"'
			   $QuerySingleRow = 'SELECT COL3 FROM GeoIPA WHERE COL1 >= ' & $decIP & ' AND ' & ' COL2 < ' & $decIP & ';'
			   _SQLite_QuerySingleRow(-1, $QuerySingleRow, $AS_Is)

			   MsgBox($MB_SYSTEMMODAL, "SQLite Error: ", $QuerySingleRow & '  '& $decIP & '  '& $AS_Is)

			case '2'

			   	_SQLite_Close ()
				_SQLite_Shutdown ()

		 EndSwitch

  Return $AS_Is

EndFunc

Значение $decIP в сообщении на экране есть, а $AS_Is пустое

Прошу помощи у гуру.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
Я сохранил и потом сразу оформил по правилам. Не думал, что так быстро нагоняй получу :( Сорри. Буду внимательней.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
simba48 [?]
Имею созданную из CVS файла базу данных geoip_as.sqlite3
Структура базы данных какая? (имена колонок, типы данных в них и т.д.)
 
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
madmasles сказал(а):
Структура базы данных какая? (имена колонок, типы данных в них и т.д.)
Имен колонкам не присваивал.
Все данные текст.
Я привел пример запросов. Из примера видно, что данные находятся, если взять значения в кавычки.
Возможно это ошибка при создании базы и нужны имена колонок. Тогда могу переделать. Это не долго.
Структура - обычная двумерная таблица.
 
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
madmasles сказал(а):
SQLite и определяет числа как текст и ничего не находит.

Код:
SELECT COL3 FROM GeoIPA where COL1>"1064096512" AND COL2 <"1064096512";
Этот запрос при подключении к базе дает нужный ответ. Но в коде AutoIt он не работает.
Для контроля вывожу на посмотреть через MsgBox
Код/Пример:
Код:
$QuerySingleRow = 'SELECT COL3 FROM GeoIPA WHERE COL1 >= ' & $decIP & ' AND ' & ' COL2 < ' & $decIP & ';'
_SQLite_QuerySingleRow(-1, $QuerySingleRow, $AS_Is)
MsgBox(64, "QuerySingleRow ", $QuerySingleRow &'         '& $AS_Is )
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
simba48,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
#include<SQLite.au3>
Local $sIP = '195.122.250.12', $hQuery, $aRow, $sMsg, $AS_Is = "Unknown"
_SQLite_Startup()
_SQLite_Open(@ScriptDir & '\geoip_as.sqlite3')
$aTmp = StringSplit($sIP,'.')
$iDecIP = ($aTmp[1]*256*256*256)+($aTmp[2]*256*256)+($aTmp[3]*256)+$aTmp[4]
_SQLite_Query(-1, "SELECT COL3 FROM GeoIPA where COL1>'"& $iDecIP  &"' AND COL2 <'"& $iDecIP  &"';", $hQuery)
While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
	$sMsg &= StringFormat('%s\n', $aRow[0])
WEnd
				
MsgBox(0, "Answer", $sMsg)

_SQLite_Close ()
_SQLite_Shutdown ()
 
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
Garrett спасибо огромное за подсказки, только знаки больше и меньше в запросе нужно в другие стороны поставить и всё сразу заработало. Я видимо изначально немного запутался.
Код:
_SQLite_Query(-1, "SELECT COL3 FROM GeoIPA where COL1<'"& $iDecIP  &"' AND COL2 >'"& $iDecIP  &"';", $hQuery)

Тем, кто будет качать базу нужно учесть, что по замечанию madmasles база была перестроена и тип данных в 1 и 2 колонке теперь integer, в третьей text, а названия колонок ip_start, ip_end и asystem и запрос в коде теперь должен быть
Код:
_SQLite_Query(-1, "SELECT asystem FROM GeoIP_AS where ip_start<" & $iDecIP  & " AND ip_end >" & $iDecIP & " LIMIT 1;", $hQuery)


Следующий этап, буду делать определение города по IP по базе geoip_city.sqlite3 , которая пока имеет размер 75 Мбайт.

Уважаемые модераторы, скажите, имеет смысл потом обобщить всё и выложить куда-нибудь?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
simba48,
Я бы еще добавил в запрос LIMIT 1 и, ИМХО, должно быть не < и >, а <= и >=.
 
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
Мой вариант
Код:
$iDecIP_start = $iDecIP+1
$iDecIP_end = $iDecIP-1

_SQLite_Query(-1, "SELECT asystem FROM GeoIP_AS where ip_start<" & $iDecIP_start  & " AND ip_end >" & $iDecIP_end & " LIMIT 1;", $hQuery)

Сравните
$iDecIP = 10
$iDecIP_start = 11
$iDecIP_end = 9
ip_start = 10
ip_end = 12

Код:
ip_start<" & $iDecIP_start  & " AND ip_end >" & $iDecIP_end
будет 10 < 11 и 12 > 9 поэтому получим
Код:
asystem FROM GeoIP_AS

или

$iDecIP = 12
$iDecIP_start = 13
$iDecIP_end = 11
ip_start = 10
ip_end = 12

Код:
ip_start<" & $iDecIP_start  & " AND ip_end >" & $iDecIP_end
будет 10 < 13 и 12 > 11 поэтому получим
Код:
asystem FROM GeoIP_AS

и ещё

$iDecIP = 11
$iDecIP_start = 12
$iDecIP_end = 10
ip_start = 10
ip_end = 12

Код:
ip_start<" & $iDecIP_start  & " AND ip_end >" & $iDecIP_end
будет 10 < 12 и 12 > 10 поэтому получим
Код:
asystem FROM GeoIP_AS

$iDecIP = 13
$iDecIP_start = 14
$iDecIP_end = 12
ip_start = 10
ip_end = 12

Код:
ip_start<" & $iDecIP_start  & " AND ip_end >" & $iDecIP_end
будет 10 < 14 и 12 > 12 поэтому не получим
Код:
asystem FROM GeoIP_AS
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
simba48
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 
Верх