Что нового

Автоматически скачать документы формата .doc с интернет-страницы?

Suppir

Продвинутый
Сообщения
967
Репутация
62
Подскажите, можно ли с помощью AutoIt скачать документы формата *.doc с этой страницы:
http://www.krd.ru/norma/F3FFE108C5EA21AFC32578B2001C3E08.htm
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Suppir [?]
можно ли с помощью AutoIt скачать документы формата *.doc с этой страницы
Можно:

Код:
InetGet("http://old.krd.ru/www/norma.nsf/8f9751d349198654c3256a7500362825/f3ffe108c5ea21afc32578b2001c3e08/$FILE/105-р.doc", @DesktopDir & "\105-р.doc")
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir,
Так у меня скачивает все *.doc с этого адреса:
Код:
#include <Encoding.au3>
#include <Array.au3>

$sUrl = 'http://www.krd.ru/norma/F3FFE108C5EA21AFC32578B2001C3E08.htm'
$iSize = 0
$sSourse = InetRead($sUrl, 17)
If @error Then
	MsgBox(16, 'Error', @error)
	Exit
EndIf

$aLiks = StringRegExp(BinaryToString($sSourse), 'a href="(http.*?.doc)"><', 3)
If @error Then
	MsgBox(16, 'Error', @error)
	Exit
EndIf
$iDownload_Counter = UBound($aLiks)
Dim $ahInetGet[$iDownload_Counter + 1][3] = [[$iDownload_Counter]]
ConsoleWrite('-------> Всего файлов: ' & $iDownload_Counter & @CR)
For $i = 1 To $ahInetGet[0][0]
	$ahInetGet[$i][0] = _Encoding_HexToURL(StringRegExpReplace($aLiks[$i - 1], '^.*/', ''))
	$ahInetGet[$i][1] = InetGet($aLiks[$i - 1], @ScriptDir & '\' & $ahInetGet[$i][0], 17, 1)
Next
While $iDownload_Counter
	For $i = 1 To $ahInetGet[0][0]
		If Not $ahInetGet[$i][2] Then
			If InetGetInfo($ahInetGet[$i][1], 2) Then
				If Not InetGetInfo($ahInetGet[$i][1], 4) Then
					ConsoleWrite($ahInetGet[$i][0] & ' --> OK' & @CR)
					$ahInetGet[$i][2] = 'OK'
					$iSize = InetGetInfo($ahInetGet[$i][1], 0)
					$ahInetGet[0][1] += $iSize
				Else
					ConsoleWrite($ahInetGet[$i][0] & ' --> ERROR' & @CR)
					$ahInetGet[$i][2] = 'ERROR'
				EndIf
				InetClose($ahInetGet[$i][1])
				$ahInetGet[$i][1] = $iSize & ' b'
				$iSize = 0
				$iDownload_Counter -= 1
				ConsoleWrite('--> Осталось закачек: ' & $iDownload_Counter & ' (' & $ahInetGet[0][0] & ')' & @CR)
			EndIf
		EndIf
	Next
	Sleep(1000)
WEnd
$ahInetGet[0][1] &= ' b'
_ArrayDisplay($ahInetGet)

С помощью этого примера можно с окном сделать.
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
madmasles опередил меня :(

Мой код:
Код:
;~ #include <Array.au3>


$sDDir = @ScriptDir&"\DOCS"
$sTempFile = $sDDir&"\temp.txt"

DirCreate($sDDir)
FileDelete($sTempFile)

InetGet("http://www.krd.ru/norma/F3FFE108C5EA21AFC32578B2001C3E08.htm",$sTempFile)

$hOpen = FileOpen($sTempFile, 0)
If $hOpen = -1 Then
	MsgBox(16,"krd.ru","Не удалось скачать страницу!")
	Exit
EndIf

$sRead = FileRead($hOpen)
FileClose($hOpen)

FileDelete($sTempFile)

If $sRead = "" Then
	MsgBox(16,"krd.ru","Как это скачали пустую страницу?! :D")
	Exit
EndIf

$aFiles = StringRegExp($sRead,'<a href="([^>]+)\.doc">',3)

;~ _ArrayDisplay($aFiles)

If Not IsArray($aFiles) Or UBound($aFiles) < 1 Then
	MsgBox(16,"krd.ru","Ссылки не найдены!")
	Exit
EndIf

$iMsg = MsgBox(68,"krd.ru","Найденно ссылок: "&UBound($aFiles)-1&@CRLF&"Начать скачивать?")
If $iMsg <> 6 Then Exit

ToolTip("Готовимся к скачиванию!",10,10,"0 из "&UBound($aFiles)-1)

For $n = 0 To UBound($aFiles)-1
	$sName = _Encoding_HexToURL(StringRegExpReplace($aFiles[$n],"(.+)/([^/]+)","\2"))&".doc"
;~ 	MsgBox(0,"",$sName)
	$hDownLoad = InetGet($aFiles[$n]&".doc",$sDDir&"\"&$n+1&"_"&$sName,1,1)
	Do
		Sleep(100)
		ToolTip($sName&" ("&Int(InetGetInfo($hDownLoad,0)*100/InetGetInfo($hDownLoad,1))&"%)",10,10,$n+1&" из "&UBound($aFiles)-1)
	Until InetGetInfo($hDownLoad,2)
Next

ToolTip("Готово!",10,10,"Всё!")
Sleep(3000)
Run(@WindowsDir&'\explorer.exe "'&$sDDir&'"')
Exit

;Description: Converts HEX string to URL string (equivalent to _StringURIDecode function)
;Author: CreatoR
Func _Encoding_HexToURL($sURLHex)
	Local $aURLHexSplit = StringSplit($sURLHex, "")
	Local $sRetString = "", $iDec, $iUbound = UBound($aURLHexSplit)

	For $i = 1 To $iUbound - 1
		If $aURLHexSplit[$i] = "%" And $i + 2 <= $iUbound - 1 Then
			$i += 2
			$iDec = Dec($aURLHexSplit[$i - 1] & $aURLHexSplit[$i])

			If Not @error Then
				$sRetString &= Chr($iDec)
			Else
				$sRetString &= $aURLHexSplit[$i - 2]
			EndIf
		Else
			$sRetString &= $aURLHexSplit[$i]
		EndIf
	Next

	Return _Encoding_UTF8ToANSI($sRetString)
EndFunc   ;==>_Encoding_HexToURL

;Description: Converts UTF-8 string to ANSI encoding
;Author: CreatoR
Func _Encoding_UTF8ToANSI($sString)
	Return BinaryToString(StringToBinary($sString), 4)
EndFunc   ;==>_Encoding_UTF8ToANSI
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
madmasles
Программа работает великолепно! Сначала у меня ругался на функцию _Encoding_HexToURL, но потом я обновил udf Creator'а и все заработало!
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Suppir, я что зря писал? :whistle:
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
SECTOR
А можно ли сделать следующую вещь: скачать не с указанной в скрипте страницы, а той страницы, которая у тебя активна в данный момент? (в IE, для простоты)
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Наверно только если IE будет открыт скриптом... Попробую написать :smile:
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
SECTOR
Видел, что в AutoIt есть UDF для работы с IE, но не пользовался никогда ей. Конечно, круто было бы, если б скрипт работал под любым браузером (IE, Chrome, Opera, Firefox), но и если только для IE, то будет здорово!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir [?]
страницы, которая у тебя активна в данный момент? (в IE, для простоты)
_IEAttach(), а дальше возможны варианты.

SECTOR
Код:
;...поменяйте у себя
$hOpen = FileOpen($sTempFile, 0)
If Not $hOpen Then
;...на
$hOpen = FileOpen($sTempFile, 0)
If $hOpen = -1 Then
;...и
$iMsg = MsgBox(68, "krd.ru", "Найденно ссылок: " & UBound($aFiles) - 1 & @CRLF & "Начать скачивать?")
;...на
$iMsg = MsgBox(68, "krd.ru", "Найденно ссылок: " & UBound($aFiles) & @CRLF & "Начать скачивать?")
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Код:
$iMsg = MsgBox(68, "krd.ru", "Найденно ссылок: " & UBound($aFiles) - 1 & @CRLF & "Начать скачивать?")
;...на
$iMsg = MsgBox(68, "krd.ru", "Найденно ссылок: " & UBound($aFiles) & @CRLF & "Начать скачивать?")

Зачем? Первая ссылка в нулевом элементе массива! :smile:
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Ставьте снифер... (если юзаете FireFox то для него есть вездесущий FireBug - модуль)
Перехватывайте запрос из браузера...
потом при помощи
Код:
$oHTTP = ObjCreate('winhttp.winhttprequest.5.1')

повторяйте запрос
описание методов здесь
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
SECTOR [?]
Зачем? Первая ссылка в нулевом элементе массива!
Код:
Dim $aArray[5] = [1, 2, 3, 4, 5]

MsgBox(64, 'Info', 'Всего элементов в массиве: ' & UBound($aArray) & @LF & _
		'Их индексы от 0 до 4')
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Код:
#include <IE.au3>
#include <Array.au3>

Global $s_Download_Dir = @ScriptDir&"\DOCS"

Global $i_File = 0
Global $a_Downloads_Files[1][2] = [[0]]

Global $i_Check = 1

DirCreate($s_Download_Dir)

Global $h_IE = _IECreate("http://www.krd.ru/norma/F3FFE108C5EA21AFC32578B2001C3E08.htm",0,1,0)
If @error Then
	MsgBox(16,@ScriptName,"_IECreate() ошибка! Код: "&@error)
	Exit
EndIf

HotKeySet("{INS}","_CheckLinks")
HotKeySet("{DEL}","_Arr")
HotKeySet("{END}","_Exit")

While 1
	If Not IsObj($h_IE) Then Exit
	If $i_Check Then _CheckDownloads()
	Sleep(100)
WEnd

Func _Exit()
	Local $iMsg = MsgBox(68,@ScriptName,"Выйти?")
	If $iMsg = 6 Then
		For $n = 1 To $a_Downloads_Files[0][0]
			InetClose($a_Downloads_Files[$n][0])
		Next
		ReDim $a_Downloads_Files[1][2]
		$a_Downloads_Files[0][0] = 0
		Exit
	EndIf
EndFunc

Func _Arr()
	_ArrayDisplay($a_Downloads_Files)
EndFunc

Func _CheckLinks()

	Local $sHTML = _IEBodyReadHTML($h_IE)
	If @error Or $sHTML = "" Then
		MsgBox(16,@ScriptName,"Не удалось прочитать исходный код страницы!")
		Return 0
	EndIf

	ClipPut($sHTML)

	Local $aFiles = StringRegExp($sHTML,'href="([^>]+)\.doc"',3)

	If Not IsArray($aFiles) Or UBound($aFiles) < 1 Then
		MsgBox(16,@ScriptName,"Ссылки не найдены!")
		Return 0
	EndIf

	Local $iMsg = MsgBox(68,@ScriptName,"Найденно ссылок: "&UBound($aFiles)&@CRLF&"Начать скачивать?")
	If $iMsg <> 6 Then Return 0

	For $i = 0 To UBound($aFiles)-1
;~ 		_Arr()
		_AddDownload($aFiles[$i]&".doc")
	Next

;~ 	_Arr()


EndFunc

Func _AddDownload($sURL)

	Local $sFile = _Encoding_HexToURL(StringRegExpReplace($sURL,"(.+)/([^/]+)","\2"))&".doc"
	Local $iInetGet = InetGet($sURL,$s_Download_Dir&"\"&$sFile,1,1)

;~ 	MsgBox(0,$iInetGet,$sURL&@CRLF&$sFile)

	If @error Then Return 0

	ReDim $a_Downloads_Files[UBound($a_Downloads_Files)+1][2]

	$a_Downloads_Files[0][0] = UBound($a_Downloads_Files)-1
	$a_Downloads_Files[$a_Downloads_Files[0][0]][0] = $iInetGet
	$a_Downloads_Files[$a_Downloads_Files[0][0]][1] = $sFile

EndFunc

Func _CheckDownloads()

	If $a_Downloads_Files[0][0] < 1 Then Return 0

	Local $a[1][2] = [[0]], $stext = "Всего: %s", $proc

	For $o = 1 To $a_Downloads_Files[0][0]
		If Not InetGetInfo($a_Downloads_Files[$o][0],2) Then
			ReDim $a[UBound($a)+1][2]
			$a[0][0] = UBound($a)-1
			$a[$a[0][0]][0] = $a_Downloads_Files[$o][0]
			$a[$a[0][0]][1] = $a_Downloads_Files[$o][1]
			$proc = Int(InetGetInfo($a_Downloads_Files[$o][0],0)*100/InetGetInfo($a_Downloads_Files[$o][0],1))
			If $proc < 0 Then $proc = 0
			$stext &= @CRLF&$a_Downloads_Files[$o][1]&" ("&$proc&"%)"
		EndIf
	Next

	Global $a_Downloads_Files = $a

	If $stext = "Всего:" Then Return ToolTip("")
	ToolTip(StringFormat($stext,$a_Downloads_Files[0][0]),10,10,"Закачки:")

EndFunc

Func _Encoding_HexToURL($sURLHex)
	Local $aURLHexSplit = StringSplit($sURLHex, "")
	Local $sRetString = "", $iDec, $iUbound = UBound($aURLHexSplit)

	For $i = 1 To $iUbound - 1
		If $aURLHexSplit[$i] = "%" And $i + 2 <= $iUbound - 1 Then
			$i += 2
			$iDec = Dec($aURLHexSplit[$i - 1] & $aURLHexSplit[$i])

			If Not @error Then
				$sRetString &= Chr($iDec)
			Else
				$sRetString &= $aURLHexSplit[$i - 2]
			EndIf
		Else
			$sRetString &= $aURLHexSplit[$i]
		EndIf
	Next

	Return _Encoding_UTF8ToANSI($sRetString)
EndFunc   ;==>_Encoding_HexToURL

Func _Encoding_UTF8ToANSI($sString)
	Return BinaryToString(StringToBinary($sString), 4)
EndFunc   ;==>_Encoding_UTF8ToANSI

Код немного кривой и заканчивает работу как то "тормознуто", но дело делает :smile:

PS: Ненавижу IE


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

RUVATA, заинтересовало... Можно небольшой пример отлова HTML?


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

ты просто не оставляешь шансов SECTOR'у ! ;D
:rofl:
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
SECTOR [?]

Я пользуюсь Chrome, также Opera/Firefox иногда, а наш системный администратор пользуется исключительно IE. Говорит, что в Хроме нет политик безопасности, и, вообще, это не браузер, а недоразумение одно. Я с ним не стал спорить, так как бесполезно. :-X
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Для ''отлова HTML'' как вы его называете... это неверно...
отлова tcp-трафика, а именно запросов... идут они через 80 порт (протокол http по умолчанию) браузеры принимают запросы там... можно посадить туда сокет и хватать все подрят... проблема с тем, чтобы понять что это и притворить в человеко-читаемый вид... именно этим и занимаются программы называемые "сниферы"
Ваша задача, скачать документ со страницы из браузера...
снифер отловит запрос и покажет вам... а вы потом его воссоздадите через 'winhttp.winhttprequest.5.1'



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

Говорит, что в Хроме нет политик безопасности
:rofl:
^__^ их в браузерах как-бы вообще нет, ни в одном, включая "осла" политики это фича ОС Windows //
большая часть его "политик" тусуется в explorer...
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Я было подумал что с помощью "winhttp.winhttprequest.5.1" можно отлавливать :smile:
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
нет, с ее помощью можно отправлять
 
Верх