Что нового

Определить, есть ли в XML файле мои IP адреса

srg777

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

Описание:
Всем добрый вечер!
Очень надеюсь, что снова найдутся добрые люди, которые помогут сделать нужный скрипт.
Снова вопрос по реестру запрещенных сайтов Роскомнадзора.
В результате выгрузки я получаю реестр, файл dump.xml. Список IP адресов оператора связи, которым я на работе занимаюсь (посадили, называется не технаря заниматься оператором связи), у меня в базе данных ms access (в принципе, этот список можно перевести в любой формат).
Эти файлы я приложил.
Возможно ли с помощью Autoit сделать следующие действия (это если файлы не менять)?
1. Открыть бд FindBlockedIP.accdb и удалить таблицу Content.
2. Сделать импорт файла dump.xml в бд FindBlockedIP.accdb (в результате появится новая таблица Content).
3. Выполнить в базе данных запрос Check-IP-toBlock (он там единственный) и получить в результате в Autoit количество полученных записей запроса.
4. Если количество записей 0, то появится сообщение с текстом 0. Если больше нуля, то появится сообщение с количеством сообщение. А я вместо сообщений вставлю код отправки на почту количества записей.

Что касается самой блокировки IPшников, то здесь я пока не озадачивался. Видел скрипты в сети, но вроде как наши IPшники еще не попадали в реестр запрещенных сайтов (проверил вручную). Осталось теперь при каждой выгрузке выяснять, попали ли наши IP в реестр запрещенных сайтов.
Если все таки когда-то попадут, тогда и будем думать.

Если возможно сравнить наши IP с Ip из XML файла другими способами, без использования ms access, то я приму абсолютно любые способы, главное, чтобы это работало через Autoit.

Очень надеюсь на ВАшу помощь!
Заранее спасибо.
 

Вложения

  • Archive.7z
    138.9 КБ · Просмотры: 6

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
srg777 [?]
Если возможно сравнить наши IP с Ip из XML
Код:
$sIP = '37.1.222.40' ; Искомый IP
$sFile = @ScriptDir & '\dump.xml'

$oObj = ObjCreate("MSXml2.DOMDocument")
$oObj.load($sFile)	
$oObj.setProperty('SelectionLanguage', 'XPath')
$oNodes = $oObj.selectNodes(StringFormat('//ip[.="%s"]', $sIP))

ConsoleWrite(StringFormat('>> ==============\n', ''))
ConsoleWrite(StringFormat('>> Найдено IP: %d\n', $oNodes.length))
ConsoleWrite(StringFormat('>> ==============\n', ''))

For $oNode In $oNodes
	ConsoleWrite(StringFormat('>>  %s\n', $oNode.text))
Next
 
Автор
S

srg777

Новичок
Сообщения
21
Репутация
1
Прошу прощения, а если искомых IP 558?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
srg777 [?]
а если искомых IP 558?
Если надо просто проверить наличие заданных IP адресов в файле dump.xml и не надо знать количество их вхождений, то можно примерно так сделать.
Код:
#include <Array.au3>

Local $aSearchIP[4][2] = [[3],['37.1.222.40'],['208.100.25.82'],['123.123.123.123']], $sFile = @ScriptDir & '\dump.xml', $sTxt

$sTxt = FileRead($sFile)
For $i = 1 To $aSearchIP[0][0]
	$aSearchIP[$i][1] = (StringInStr($sTxt, $aSearchIP[$i][0]) <> 0)
Next
$sTxt = ''
_ArrayDisplay($aSearchIP)

PS
В каком виде и где хранятся Ваши IP?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
srg777 [?]
Прошу прощения, а если искомых IP 558?
Код:
#include<Array.au3>

Local $sQuery, $aIP[500][2], $iCount= 0

; $t = TimerInit()

; Читаем файл IP_1428.txt
$hFile = FileOpen('IP_1428.txt', 0)
If $hFile = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

While 1
	If $iCount = UBound($aIP) Then ReDim $aIP[UBound($aIP)+500][2]
    $sText = FileReadLine($hFile)
    If @error = -1 Then ExitLoop
	$aIP[$iCount][0] &= $sText
    $iCount +=1
Wend

ReDim $aIP[$iCount][2]

FileClose($hFile)

; Читаем файл XML
$sFile = @ScriptDir & '\dump.xml'

$oObj = ObjCreate("MSXml2.DOMDocument")
$oObj.load($sFile)	
$oObj.setProperty('SelectionLanguage', 'XPath')

; Считаем кол-во найденных IP.
For $i = 0 To UBound($aIP) -1
	$oNodes = $oObj.selectNodes(StringFormat('//ip[.="%s"]', $aIP[$i][0]))
	$aIP[$i][1] = $oNodes.length
Next

; ConsoleWrite(StringFormat('>> Total time: %d sec\n', Round(TimerDiff($t), 2) /1000))

; Смотрим результат.
_ArrayDisplay($aIP, UBound($aIP))

Код:
;...
; Считаем кол-во найденных IP.
_Progress()
; ConsoleWrite(StringFormat('>> Total time: %d sec\n', Round(TimerDiff($t), 2) /1000))

; Смотрим результат.
_ArrayDisplay($aIP, UBound($aIP))

$oObj = 0

Func _Progress()
	
	Local $sFileName = StringRegExpReplace($sFile, '^.*(\\|\/)(.*?)$', '$2')
	Local $iPercent = 0
	Local $iDivisor = Ceiling((UBound($aIP))/100)
	
	ProgressOn(StringFormat('Обработка файла: %s', $sFileName),"", StringFormat('%d %', $iPercent))
	For $i = 0 To UBound($aIP) -1
		$oNodes = $oObj.selectNodes(StringFormat('//ip[.="%s"]', $aIP[$i][0]))
		$aIP[$i][1] = $oNodes.length
		If Mod($i, $iDivisor) = 0 Then
			$iPercent += 1
			ProgressSet($iPercent, StringFormat('%d %', $iPercent))
		EndIf
	Next
	ProgressSet(100 , "Готово")
	Sleep(250)
	ProgressOff()
EndFunc; ==>_Progress


Добавлено:
Сообщение автоматически объединено:

madmasles [?]
и не надо знать количество их вхождений
srg777 [?]
Если больше нуля, то появится сообщение с количеством
IMHO именно количество нужно.
 

Вложения

  • IP_1428.txt
    21.4 КБ · Просмотры: 4
Автор
S

srg777

Новичок
Сообщения
21
Репутация
1
Уважаемый Garret, код работает. Но теперь не пойму, где здесь общее количество найденных IP?
Хочу в код добавить, что если найдено всего 0 совпадений, то отправляем письмо, сообщая, что запрещать ничего не нужно, а если найдено 1 и более совпадений, значит нужно что-то запретить.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
srg777 [?]
Но теперь не пойму, где здесь общее количество найденных IP?
В двумерном массиве:
Код:
$aIP[$n][0]  ; искомый IP
$aIP[$n][1]  ; количество позиций искомого IP в файле dump.xml


Файл IP_1428.txt содержит проверяемые IP. В него можно добавлять или удалять IP. Он включён в скрипт для удобства.


Добавлено:
Сообщение автоматически объединено:

Код:
Local $sQuery, $aIP[500][2], $iCount = 0

; Читаем файл IP_1428.txt
$hFile = FileOpen('IP_1428.txt', 0)
If $hFile = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

While 1
	If $iCount = UBound($aIP) Then ReDim $aIP[UBound($aIP)+500][2]
    $sText = FileReadLine($hFile)
    If @error = -1 Then ExitLoop
	$aIP[$iCount][0] &= $sText
    $iCount +=1
Wend

ReDim $aIP[$iCount][2]

FileClose($hFile)

; Читаем файл XML
$sFile = @ScriptDir & '\dump.xml'
$oObj = ObjCreate("MSXml2.DOMDocument")
$oObj.load($sFile)	
$oObj.setProperty('SelectionLanguage', 'XPath')

; Считаем кол-во найденных IP.
_Progress()

For $i = 0 To UBound($aIP)-1
	If Not $aIP[$i][1] Then
		MsgBox(0, 'Ok!', StringFormat('Ничего не отправляем!\r\nIP %s кол. %d', $aIP[$i][0], $aIP[$i][1]))
	Else
		ConsoleWrite(StringFormat('Отправляем SMS! IP %s кол. %d\r\n', $aIP[$i][0], $aIP[$i][1]))
	EndIf
Next

$oObj = 0

Func _Progress()
	
	Local $sFileName = StringRegExpReplace($sFile, '^.*(\\|\/)(.*?)$', '$2')
	Local $iPercent = 0
	Local $iDivisor = Ceiling((UBound($aIP))/100)
	
	ProgressOn(StringFormat('Обработка файла: %s', $sFileName),"", StringFormat('%d %', $iPercent))
	For $i = 0 To UBound($aIP) -1
		$oNodes = $oObj.selectNodes(StringFormat('//ip[.="%s"]', $aIP[$i][0]))
		$aIP[$i][1] = $oNodes.length
		If Mod($i, $iDivisor) = 0 Then
			$iPercent += 1
			ProgressSet($iPercent, StringFormat('%d %', $iPercent))
		EndIf
	Next
	ProgressSet(100 , "Готово")
	Sleep(250)
	ProgressOff()
EndFunc; ==>_Progress
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett,
А почему Вы не используете новую нативную функцию в версии 3.3.12.0 FileReadToArray()?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles
У меня версия 3.3.6.1.
Привычка. ;D
Однако, спасибо! Учту!

P.S. Наверно, действительно нужно переходить на версию 3.3.12.0.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Верх