Что нового

Клик по ссылке ( mediafire )

miku

Новичок
Сообщения
3
Репутация
0
Здравствуйте!
Мне необходимо кликнуть по ссылке 'Download' на странице http://www.mediafire.com/?vnzgmd5hxfjnbiv
по идее далее должен запуститься интегрированный в IE9 Internet Download Manager
вот мой первый код в AutoIT, который не работает :(
Код:
#include <IE.au3>

$sUrl = 'http://www.mediafire.com/?vnzgmd5hxfjnbiv'
$oIE = _IECreate($sUrl)
$oLinks = _IETagNameGetCollection($oIE, 'a')
For $oLink In $oLinks
    If $oLink.className == 'button' And StringInStr($oLink.title, 'Download') Then
        _IEAction($oLink, 'click')
        ExitLoop
    EndIf
Next


Ещё пара вопросов, можно ли после перехода на эту страницу и клика по ссылке, закрыть окно браузера примерно через 5-6 сек.? А если этих ссылок 300-1000, как их все прописать в одном коде?
Не обессудьте, это мой первый опыт работы в AutoIT :smile:
 

kaster

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


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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
miku [?]
Мне необходимо кликнуть по ссылке 'Download'
Можно и без IE попробовать скачать.
Код:
#include <WinAPIEx.au3>;Yashied, http://autoit-script.ru/index.php/topic,47.0.html

$iAll = 0
$sUrl = 'http://www.mediafire.com/?vnzgmd5hxfjnbiv'

$s_Sourse = InetRead($sUrl, 17)
If @error Then
	MsgBox(16, 'Error', 'InetRead')
	Exit
EndIf
$s_Sourse = BinaryToString($s_Sourse)
$sLink = StringRegExpReplace($s_Sourse, '(?si).*href="(.*?)"\h.*?Download\h?<span>.*', '$1')
If @extended <> 1 Then
	MsgBox(16, 'Error', 'StringRegExpReplace')
	Exit
EndIf
$sFile = StringRegExpReplace($sLink, '^.*/', '')
If StringLen($sFile) > 10 Then $sFile = StringRight($sFile, 10)
$hDownload = InetGet($sLink, @ScriptDir & '\' & $sFile, 17, 1)
ProgressOn('Download mediafire.com', StringFormat('%s:\t[%s]', 'File', $sFile), '0%', 50, 50, 16)
Do
	Sleep(500)
	If Not $iAll Then
		$iAll = InetGetInfo($hDownload, 1)
		$sAll = _WinAPI_StrFormatByteSize($iAll)
	EndIf
	$iNow = InetGetInfo($hDownload, 0)
	If $iAll And $iNow Then
		$iPersent = 100 * $iNow / $iAll
		ProgressSet($iPersent, StringFormat('%.2f%\t[%s], [%s]', $iPersent, _
				_WinAPI_StrFormatByteSize($iNow), $sAll))
	EndIf
Until InetGetInfo($hDownload, 2)
InetClose($hDownload)
MsgBox(64, 'Info', 'Все :)')
;Sleep(5000)
ProgressOff()
 
Автор
M

miku

Новичок
Сообщения
3
Репутация
0
а есть ли какая-нибудь альтернатива WinAPIEx? у меня часть библиотеки при распаковке антивирусы сносят, как вредоносный код :(
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Автор
M

miku

Новичок
Сообщения
3
Репутация
0
ясненько, тогда это всё на виртуалке запущу.
у меня ещё вопрос, а как прописать несколько ссылок в этот код?
поправьте пожалуйста

Код:
#include <WinAPIEx.au3>;Yashied, http://autoit-script.ru/index.php/topic,47.0.html

$iAll = 0
$sUrl = 'http://www.mediafire.com/?2o1ptow7z04ebni'
$sUrl = 'http://www.mediafire.com/?vnzgmd5hxfjnbiv'
$sUrl = 'http://www.mediafire.com/?2p861h0z7j8ptbl'
$sUrl = 'http://www.mediafire.com/?i61m74lfuu7n2c6'

$s_Sourse = InetRead($sUrl, 17)
If @error Then
    MsgBox(16, 'Error', 'InetRead')
    Exit
EndIf
$s_Sourse = BinaryToString($s_Sourse)
$sLink = StringRegExpReplace($s_Sourse, '(?si).*href="(.*?)"\h.*?Download\h?<span>.*', '$1')
If @extended <> 1 Then
    MsgBox(16, 'Error', 'StringRegExpReplace')
    Exit
EndIf
$sFile = StringRegExpReplace($sLink, '^.*/', '')
If StringLen($sFile) > 10 Then $sFile = StringRight($sFile, 10)
$hDownload = InetGet($sLink, @ScriptDir & '\' & $sFile, 17, 1)
ProgressOn('Download mediafire.com', StringFormat('%s:\t[%s]', 'File', $sFile), '0%', 50, 50, 16)
Do
    Sleep(500)
    If Not $iAll Then
        $iAll = InetGetInfo($hDownload, 1)
        $sAll = _WinAPI_StrFormatByteSize($iAll)
    EndIf
    $iNow = InetGetInfo($hDownload, 0)
    If $iAll And $iNow Then
        $iPersent = 100 * $iNow / $iAll
        ProgressSet($iPersent, StringFormat('%.2f%\t[%s], [%s]', $iPersent, _
                _WinAPI_StrFormatByteSize($iNow), $sAll))
    EndIf
Until InetGetInfo($hDownload, 2)
InetClose($hDownload)
MsgBox(64, 'Info', 'Все :)')
;Sleep(5000)
ProgressOff()
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
miku,
Я здесь использую WinAPIEx.au3 только для форматирования размеров файлов, в моем коде можно заменить функцию _WinAPI_StrFormatByteSize() на, например, такую:
Код:
Dim $Val[7] = [532, 1340, 23506, 2400016, 2400000000, 7099511627776, 999999999999999]

For $i = 0 To 6
	ConsoleWrite('ru: ' & _Format_Size($Val[$i]) & ', en: ' & _Format_Size($Val[$i], 1) & @LF)
Next

Func _Format_Size($i_Size, $i_Lang = 0);$i_Lang = 0 - рус, 1 - англ.
	Local $a_Str[5][2] = [['байт', 'byte'],['КБ', 'KB'],['МБ', 'MB'],['ГБ', 'GB'],['ТБ', 'TB']]
	$i_Lang = Int($i_Lang)
	If $i_Lang > 1 Or $i_Lang < 0 Then $i_Lang = 0
	$i_Size = Abs($i_Size)
	If $i_Size < 1024 Then Return StringFormat('%d ' & $a_Str[0][$i_Lang], $i_Size)
	For $i = 1 To 4
		$i_Size /= 1024
		If $i_Size < 1024 Then ExitLoop
	Next
	Return StringFormat('%.2f ' & $a_Str[$i][$i_Lang], $i_Size)
EndFunc   ;==>_Format_Size
Но я Вам рекомендую сделать так, как советует Kaster, это очень нужная и полезная библиотека.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
miku [?]
а как прописать несколько ссылок в этот код?
Попробуйте так, по одному.
Код:
Dim $aUrl[5] = [4, 'http://www.mediafire.com/?2o1ptow7z04ebni', _
		'http://www.mediafire.com/?vnzgmd5hxfjnbiv', _
		'http://www.mediafire.com/?2p861h0z7j8ptbl', _
		'http://www.mediafire.com/?i61m74lfuu7n2c6']

$sDir = @ScriptDir & '\Download';папка, в котороую скачиваем
If Not FileExists($sDir) Then DirCreate($sDir)

For $i = 1 To $aUrl[0]
	$s_Sourse = InetRead($aUrl[$i], 17)
	If @error Then
		MsgBox(16, 'Error', 'InetRead')
		ContinueLoop
	EndIf
	$s_Sourse = BinaryToString($s_Sourse)
	$sLink = StringRegExpReplace($s_Sourse, '(?s).*href="(.+?)"\h.*?Download\h<span>.*', '$1')
	If @extended <> 1 Then
		MsgBox(16, 'Error', 'StringRegExpReplace')
		ContinueLoop
	EndIf
	$sFile = StringRegExpReplace($sLink, '^.*/', '')
	If StringLen($sFile) > 10 Then $sFile = StringRight($sFile, 10)
	If FileExists($sDir & '\' & $sFile) Then $sFile = $i - 1 & '_' & $sFile
	$hDownload = InetGet($sLink, $sDir & '\' & $sFile, 17, 1)
	ProgressOn('Download mediafire.com', StringFormat('%d.\tFile: [%s]', $i, $sFile), '0%', 50, 50, 16)
	$iAll = 0
	$iCount = 0
	Do
		Sleep(1000)
		$iCount += 1
		If Not $iAll Then
			$iAll = InetGetInfo($hDownload, 1)
			$sAll = _Format_Size($iAll)
		EndIf
		$iNow = InetGetInfo($hDownload, 0)
		If $iAll And $iNow Then
			$iSpeed = $iNow / $iCount
			$iPersent = 100 * $iNow / $iAll
			ProgressSet(Int($iPersent), StringFormat('%.2f%\t%s/сек, [%s], [%s]', $iPersent, _
					_Format_Size($iSpeed), _Format_Size($iNow), $sAll))
		EndIf
	Until InetGetInfo($hDownload, 2)
	InetClose($hDownload)
	Sleep(5000)
	ProgressOff()
Next
MsgBox(64, 'Info', 'Все :)')

Func _Format_Size($i_Size, $i_Lang = 0);$i_Lang = 0 - рус, 1 - англ.
	Local $a_Str[5][2] = [['байт', 'byte'],['КБ', 'KB'],['МБ', 'MB'],['ГБ', 'GB'],['ТБ', 'TB']]
	$i_Lang = Int($i_Lang)
	If $i_Lang > 1 Or $i_Lang < 0 Then $i_Lang = 0
	$i_Size = Abs($i_Size)
	If $i_Size < 1024 Then Return StringFormat('%d ' & $a_Str[0][$i_Lang], $i_Size)
	For $i = 1 To 4
		$i_Size /= 1024
		If $i_Size < 1024 Then ExitLoop
	Next
	Return StringFormat('%.2f ' & $a_Str[$i][$i_Lang], $i_Size)
EndFunc   ;==>_Format_Size
Или так, все сразу и быстрее (у меня).
Код:
#include <Date.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $aUrl[5] = [4, 'http://www.mediafire.com/?2o1ptow7z04ebni', _
		'http://www.mediafire.com/?vnzgmd5hxfjnbiv', _
		'http://www.mediafire.com/?2p861h0z7j8ptbl', _
		'http://www.mediafire.com/?i61m74lfuu7n2c6'], _
		$sDir = @ScriptDir & '\Download', _ ;папка, в котороую скачиваем
		$aInfo[$aUrl[0] + 1][4] = [[$aUrl[0]]], $sString = '|', $sTitle = 'Download mediafire.com', _
		$sSourse, $vLink, $iCount

If WinExists($sTitle & '{[/@$@\]}') Then Exit
AutoItWinSetTitle($sTitle & '{[/@$@\]}')

HotKeySet('+{Esc}', '_Exit');Shift + Esc - exit

TrayTip($sTitle, 'Get links now', 5, 1)
For $i = 1 To $aUrl[0]
	$sSourse = InetRead($aUrl[$i], 17)
	If @error Then ContinueLoop
	$sSourse = BinaryToString($sSourse)
	$vLink = StringRegExpReplace($sSourse, '(?s).*href="(.+?)"\h.*?Download\h<span>.*', '$1')
	If @extended <> 1 Then ContinueLoop
	$iCount += 1
	$aInfo[$iCount][0] = StringRegExpReplace($vLink, '^.*/', '')
	$aInfo[$iCount][1] = $vLink
	If StringLen($aInfo[$iCount][0]) > 10 Then $aInfo[$iCount][0] = StringRight($aInfo[$iCount][0], 10)
	$vLink = 0
	While FileExists($sDir & '\' & $aInfo[$iCount][0]) Or _
			StringInStr($sString, $aInfo[$iCount][0] & '|')
		$vLink += 1
		$aInfo[$iCount][0] = $vLink & '_' & StringRegExpReplace($aInfo[$iCount][0], '^.*_', '')
	WEnd
	$sString &= $aInfo[$iCount][0] & '|'
Next
If $iCount Then
	ReDim $aInfo[$iCount + 1][4]
	$aInfo[0][0] = $iCount
	$sString = ''
	$sSourse = 0
	$vLink = 0
	$aUrl = 0
Else
	MsgBox(16, $sTitle, 'Error get links')
	Exit
EndIf
TrayTip($sTitle, '', 1)
If Not FileExists($sDir) Then DirCreate($sDir)
If Not FileExists($sDir & '\Temp') Then DirCreate($sDir & '\Temp')
For $i = 1 To $aInfo[0][0]
	$aInfo[$i][2] = InetGet($aInfo[$i][1], $sDir & '\Temp' & '\' & $aInfo[$i][0] & '.tmp', 17, 1)
	$aInfo[$i][1] = 0
Next
ProgressOn($sTitle, StringFormat('Downloading %d files, [%d], [%s]', _
		$aInfo[0][0], $aInfo[0][0] - $iCount, _Timer($vLink * 1000)), '0%', 50, 50, 16)
While $iCount
	Sleep(1000)
	$vLink += 1
	$aInfo[0][3] = 0
	$aInfo[0][2] = 0
	For $i = 1 To $aInfo[0][0]
		If $aInfo[$i][2] Then
			If InetGetInfo($aInfo[$i][2], 2) Then
				$iCount -= 1
				If InetGetInfo($aInfo[$i][2], 4) Then
					$aInfo[$i][1] = 0
					FileDelete($sDir & '\Temp' & '\' & $aInfo[$i][0] & '.tmp')
					$aInfo[0][1] -= $aInfo[$i][1]
					TrayTip($sTitle, 'Error downloading: ' & $aInfo[$i][0], 5, 3)
				Else
					TrayTip($sTitle, 'Download ' & $aInfo[$i][0] & ' completed', 5, 1)
					FileMove($sDir & '\Temp' & '\' & $aInfo[$i][0] & '.tmp', $sDir & '\' & $aInfo[$i][0], 1)
				EndIf
				InetClose($aInfo[$i][2])
				$aInfo[$i][2] = 0
			Else
				If Not $aInfo[$i][1] Then
					$aInfo[$i][1] = InetGetInfo($aInfo[$i][2], 1)
					$aInfo[0][1] += $aInfo[$i][1]
				EndIf
				$aInfo[$i][3] = InetGetInfo($aInfo[$i][2], 0)
				$aInfo[0][3] += $aInfo[$i][3]
			EndIf
		EndIf
		$aInfo[0][2] += $aInfo[$i][3]
	Next
	If $aInfo[0][1] And $aInfo[0][3] Then
		ProgressSet(Int(100 * $aInfo[0][2] / $aInfo[0][1]), _
				StringFormat('%.2f%\t%s/sec, [%s], [%s]', 100 * $aInfo[0][2] / $aInfo[0][1], _
				_Format_Size($aInfo[0][3] / $vLink), _Format_Size($aInfo[0][2]), _
				_Format_Size($aInfo[0][1])), StringFormat('Downloading %d files, [%d], [%s]', _
				$aInfo[0][0], $aInfo[0][0] - $iCount, _Timer($vLink * 1000)))
	EndIf
WEnd
ProgressSet(100, 'Download completed', StringFormat('Downloading %d files, [%d], [%s]', _
		$aInfo[0][0], $aInfo[0][0] - $iCount, _Timer($vLink * 1000)))
$sString = StringFormat('Downloaded files: %d, [%s], [%s]\n\n', $aInfo[0][0], _
		_Format_Size($aInfo[0][1]), _Timer($vLink * 1000))
For $i = 1 To $aInfo[0][0]
	$sString &= StringFormat('%s\t%s\t%s\n', $aInfo[$i][0], _Format_Size($aInfo[$i][1]))
Next
DirRemove($sDir & '\Temp', 1)
MsgBox(64, $sTitle, StringTrimRight($sString, 1))
ProgressOff()

Func _Format_Size($i_Size, $i_Lang = 1);$i_Lang = 0 - рус, 1 - англ.
	Local $a_Str[5][2] = [['байт', 'byte'],['КБ', 'KB'],['МБ', 'MB'],['ГБ', 'GB'],['ТБ', 'TB']]
	$i_Lang = Int($i_Lang)
	If $i_Lang > 1 Or $i_Lang < 0 Then $i_Lang = 0
	$i_Size = Abs($i_Size)
	If $i_Size < 1024 Then Return StringFormat('%d ' & $a_Str[0][$i_Lang], $i_Size)
	For $i = 1 To 4
		$i_Size /= 1024
		If $i_Size < 1024 Then ExitLoop
	Next
	Return StringFormat('%.2f ' & $a_Str[$i][$i_Lang], $i_Size)
EndFunc   ;==>_Format_Size

Func _Timer($i_Diff)
	Local $i_Hour, $i_Min, $i_Sec
	_TicksToTime(Abs(Int($i_Diff)), $i_Hour, $i_Min, $i_Sec)
	Return StringFormat('%02d:%02d:%02d', $i_Hour, $i_Min, $i_Sec)
EndFunc   ;==>_Timer

Func _Exit()
	For $i = 1 To $aInfo[0][0]
		If $aInfo[$i][2] Then
			InetClose($aInfo[$i][2])
			FileDelete($sDir & '\Temp' & '\' & $aInfo[$i][0] & '.tmp')
		EndIf
	Next
	DirRemove($sDir & '\Temp', 1)
	Exit
EndFunc   ;==>_Exit
 
Верх