Что нового

Бот для video.yandex.ru автоматически скачивающий новое видео.

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Поднадоело каждый раз качать в ручную... решил убить время на написание бота для него.

Системные требования:
1. Windows XP +
2. IE7/IE8 на базовых настройках.
3. AutoIt 3.3.6.1

Что он умеет уже:

1. Открывать http://video.yandex.ru/ и собирать с него все ссылки с пометкой "новое"...
2. В цикле через http://ru.savefrom.net/ получать ссылку на файл и скачивать по ссылке в указанную папку.
4. Запускать скачивание раз в сутки и в определенный час.
5. Паузить скрипт
6. Переименовывать файлы в "Дата" + "Индекс".
7. Вести LOG.

Умеет обрабатывать ошибки:
1. Не открывается http://video.yandex.ru/
2. Не открывается http://ru.savefrom.net/
3. При открытии не находит прямую ссылку на файл.
4. Ссылка на файл битая.

В планах добавить/улучшить:
1. Минимальное GUI.
2. Запускался только при простое компьютера N-минут + картинка на экране не меняется (просмотр видео)
3. Проверка на трафик(в только win7)... если идет активно трафик не запускается...
4. Также проверка соединения... (есть/нет интернета)


Собственно скрипт:

Код:
#include <IE.au3>
#Include <Log.au3>
#Include <date.au3>
#Include <array.au3>
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)
HotKeySet('{ESC}', '_Exit'); выход по кнопке Esc
HotKeySet("{F9}", "_Pause"); Пауза.


Dim $j = 0 ;счетчик найденных ссылок
Dim $aLinks[$j + 1][3];массив, в котором будут храниться найденные ссылки
Global $Paused
Global $sSearch = 'новое';слово, которое будем искать
Global $hLog, $Time
Global $oIE, $oForm, $oSearch, $URL, $oInput, $oSubmit, $iStart, $dStart, $oUrls, $oUrl, $FormatVideo, $hDownloadVideo, $nBytesVideo, $old, $timedate, $error
Global $Chek=0, $Chek1=0, $Chek2=0, $chek11=0
Global $oLink, $oLinks, $sText, $oSubmit
Global $OldData_regread, $NowData_regwrite, $NowData
Global $povtor1, $povtor2 
Global $i, $n, $index, $Folder_DW
Global $NewName=1 ;Если 1 то переименовывает видео файл Дата + порядковый номер 

Global $HourStart=@HOUR ;Час старта скрипта													<<<<<<<<<<<<<<<<<<<<< ОБЯЗАТЕЛЬНО ВЫСТАВИТЬ!!!

Global $sUrl = 'http://ru.savefrom.net/'

DIM $Format[9], $sUrlFormat[9]
$format[1]="MP4 HD (1080p)"
$format[2]="FLV H.264 HD 720p"
$format[3]="MP4 HD (720p)"
$format[4]="FLV H.264"
$format[5]="FLV HQ"
$format[6]="MP4 HD"
$format[7]="FLV"
$format[8]="MP4"
$Folder_DW = "D:\Downloads\video\yandex.video.ru" ;Папка куда будет качаться видео.			<<<<<<<<<<<<<<<<<<<<< ОБЯЗАТЕЛЬНО ВЫСТАВИТЬ!!!
DirCreate($Folder_DW & '\Temp')
$hLog = _Log_Open(@ScriptDir & '\VideoYandex.log', '###Log for Video.Yandex.ru###')
_Log_Report($hLog, 'Program start', 1)

While 1
	$OldData_regread = regread("HKEY_CURRENT_USER\Software\VideoYandex", "OldData")
If $OldData_regread=_NowDate() Then
	_Log_Report($hLog, 'Ждем следующий день', 3)
	;_Exit()
ElseIf $HourStart=@HOUR Then
	_VideoYandex(2) ; Сбор ссылок с Video.Yandex.ru. Если 2, то с проверкой.
;~ 	_ArrayDisplay($aLinks)
;~ 	_sfrom(2) ; Скачивание по каждой ссылке. Если 2, то с проверкой.
	_DW_master()
	;_Exit()
	sleep(60*60*1000) ; Слип на час... что бы 2-й раз не запуститься по новой.
EndIf
sleep(30*60*1000) ;Раз в пол часа проверяет текущий час.
WEnd



		
;Функция для поиска ссылок на video.yandex.ru
Func _VideoYandex($povtor1)
For $i=1 to $povtor1
$oIE = _IECreate('http://video.yandex.ru/',0,0);открываем IE в скрытом виде
$oForm = _IEFormGetCollection($oIE, 0);получаем форму
$oSearch = _IEFormElementGetObjByName($oForm, 'text') ;получаем объект по имени
_IELoadWait($oIE);ждем
While 1
sleep(6*1000)
$oLinks = _IELinkGetCollection($oIE) ;получаем коллекцию ссылок на странице
For $oLink In $oLinks ;в цикле проверяем все ссылки на странице
    If StringInStr($oLink.innertext, $sSearch) Then ;если в тексте ссылки есть искомое слово
        $j += 1;увеличиваем счетчик на 1
        ReDim $aLinks[$j + 1][3];изменяем размер массива
        $aLinks[$j][0] = $oLink.innertext;добавляем в массив текст ссылки
        $aLinks[$j][1] = $oLink.href;добавляем в массив адрес ссылки
		$aLinks[$j][2] = "new"
    EndIf
Next
If $j>0 Then ; Если хотя бы одна ссылка найдена, то выходим из цикла
    ExitLoop
Else ; Если не находит, то плюсует счетчик... и если 60 сек не грузится video.yandex.ru закрывает скрипт
    $Chek+=1
	If $chek>10 Then
		_Log_Report($hLog, 'video.yandex.ru не грузится', 101)
		;MsgBox(0,"","video.yandex.ru не грузится")
		_IEQuit($oIE)
		ExitLoop
	EndIf
EndIf
WEnd
$aLinks[0][0] = $j;присваиваем этому элементу массива число - количество найденных ссылок.
_IEQuit($oIE)
If $J>1 then
ExitLoop
EndIf
Next
EndFunc
;Функция обрабатывающая ссылки через sfrom.net...
Func _sfrom($Povtor2)
For $n=1 to $Povtor2
For $i=1 to UBound($aLinks)-1
$Chek1=0
$Chek2=0
$chek11=0
$URL = _IECreate("sfrom.net/" & $aLinks[$i][1]) ; открывается ссылка обработаная сайтом.

While 1
	If $n>1 Then
		If $aLinks[$i][2]="rdy" then
			_IEQuit($URL)
			_Log_Report($hLog, 'n>1' & $aLinks[$i][1], 301)
			ExitLoop
		EndIf
	EndIf
;~ 	If StringRegExp ($aLinks[$i][1], "(vimeo)" , 0)=1 then ;Проверка на vimeo. С ним не корректно работает. Пытается сразу открыть в плеере.
;~ 		msgbox(0,"","vimeo кака",5)
;~ 		_IEQuit($URL)
;~ 		sleep($n*1000)
;~ 		$aLinks[$i][2]="vimeo"
;~ 		_Log_Report($hLog, 'Vimeo kaka' & "sfrom.net/" & $aLinks[$i][1], 203)
;~ 		ExitLoop
;~ 	EndIf	
    Sleep($n*1000)
    $sText = _IEBodyReadText($URL) ; Получаем текст странички
    If StringInStr($sText, "Ссылка") Then ; Если в тексте есть "Ссылка" то продолжаем
        If StringInStr($sText, "Не найдена ссылка для скачивания") Then ; Если не найдена ссылка на сайте, пробуем ещё раз и выходим из цикла для поиска следующей
                $chek11+=1
				_Log_Report($hLog, 'ssyoutube.ru не нашел страничку' & "sfrom.net/" & $aLinks[$i][1], 201)
                ;msgbox(0,"","ERROR ssyoutube.ru не нашел страничку",10)
                _IEQuit($URL)
                sleep(500)
                $URL = _IECreate("sfrom.net/" & $aLinks[$i][1])
                If $chek11>1 Then
                    $chek11=0
					$aLinks[$i][2]="Bad URL"
					_Log_Report($hLog, 'ssyoutube.ru совсем не находит ' & "sfrom.net/" & $aLinks[$i][1], 202)
                    ;msgbox(0,"","ERROR ssyoutube.ru совсем не находит",20)
                    _IEQuit($URL)
                    sleep($n*1000)
                    ExitLoop
                EndIf
			Else
        While 1
            sleep($n*5000)
            $oSubmit = _IEGetObjByName ($URL, "sf_url") ; Если ссылка найдена, то фокус на поле для ввода и 2 Таба и мы на первой ссылке с как правило лучшим качеством
            _IEAction($oSubmit, "Focus")
            sleep($n*100)
            Send("{TAB 2}")
            ;If $Chek2=5 then
            ;   Send("{TAB}")
            ;ElseIf $Chek2>8 then
            ;   Send("{TAB 2}")
            ;EndIf
            sleep($n*1000)
			For $index=1 to 10
				WinKill("Не удается отобразить веб-страницу - Windows Internet Explorer")
			Next
            ; Send("{ENTER}") ; Пробовал сделать через _IELinkClickByText и _IENavigate... из-за использования JavaScript не работает
			send("{APPSKEY}")	
			sleep(1000)
			send("{down 4}")
			sleep(1000)
			send("{ENTER}")
			sleep(1000)
;~ 			WinWaitActive("Загрузка файла", "", $n*15) ;Ждет диалогового окна с вопросом сохранить/открыть
;~ 			If WinExists("Не удается отобразить веб-страницу - Windows Internet Explorer") Then
;~ 				$Chek2=0
;~ 				$aLinks[$i][2]="BadLink"
;~ 				_Log_Report($hLog, 'ERROR битая ссылка ' & "sfrom.net/" & $aLinks[$i][1], 205)
;~ 				;msgbox(0,"","ERROR Битая ссылка",10)
;~ 				_IEQuit($URL)
;~ 				ExitLoop
;~ 			EndIf
;~ 			If WinActive("","Временная папка") Then ;Если сразу пытается открыть сохраняя в временную папку
;~                 Sleep($n*1000)
;~                 Send("{TAB}")
;~                 Sleep($n*1000)
;~                 Send("{ENTER}") ; Через ControlSend корректно работать не хочет... :( Надо додумать...
;~ 				_Log_Report($hLog, 'не сохраняет... пытается открыть... ' & "sfrom.net/" & $aLinks[$i][1], 203)
;~                 $aLinks[$i][2]="Vimeo2"
;~ 				;msgbox(0,"ERROR","не сохраняет... пытается открыть...", 10)
;~                 $Chek2=0
;~                 _IEQuit($URL)
;~                 ExitLoop
;~             EndIf
;~             If WinActive("Загрузка файла") then
;~                 sleep($n*1000)
;~                 Send("{Left}")
;~                 sleep($n*1000)
;~                 send("{ENTER}")
                WinWaitActive("Сохранить как", "", $n*30)
				If WinActive("Windows Internet Explorer","Не удалось загрузить.") then
					$aLinks[$i][2]="BadLink"
					_Log_Report($hLog, 'ERROR битая ссылка ' & "sfrom.net/" & $aLinks[$i][1], 205)
					;msgbox(0,"","ERROR Битая ссылка",10)
					_IEQuit($URL)
					ExitLoop
				EndIf
                If WinActive("Сохранить как") then
					sleep(1000)
					If $NewName=1 then
					Send("{RIGHT}")
					sleep(100)
					Send("{Left 4}")
					sleep(100)
					Send("+^{Home}")
					sleep(100)
					send("{del}")
					sleep(100)
					Send(_NowDate() & " - " & $i)
					EndIf
                    sleep($n*1000)
                    Send("{ENTER}")
                    WinWaitActive("Подтвердить сохранение в виде","",$n*5) ;Если файл уже был ранее сохранен... то далее просто нажмет нет и отмена и выйдет из цикла
                        If WinActive("Подтвердить сохранение в виде") then
                            ;sleep(1000)
                            ;Send("{Left}")
                            sleep($n*1000)
                            send("{ENTER}")
                            Sleep($n*1000)
                            Send("{TAB 4}")
                            Sleep($n*1000)
                            Send("{ENTER}")
							_Log_Report($hLog, 'ERROR был уже такой файл ' & "sfrom.net/" & $aLinks[$i][1], 204)
                            $aLinks[$i][2]="Rdy"
							;MsgBox(0,"","ERROR был уже такой файл",10)
                            _IEQuit($URL)
                            Sleep($n*100)
                            ExitLoop
                        EndIf
                    WinWaitClose("","Осталось времени:") ; ждет пока докачается
					$aLinks[$i][2]="Rdy"
					_Log_Report($hLog, 'Скачалось видео ' & "sfrom.net/" & $aLinks[$i][1], 200)
                    _IEQuit($URL)
                    Sleep($n*100)
					$Chek2=0
					ExitLoop   
				Else   
					$Chek2+=1
					_Log_Report($hLog, '$chek2 ' & $chek2, 305)
					IF $Chek2>2 Then
                    $Chek2=0
					$aLinks[$i][2]="saveERROR"
					_Log_Report($hLog, 'Сохранить как... не появилось О_о ' & "sfrom.net/" & $aLinks[$i][1], 777)
                    ;MsgBox(0,"ERROR", "Сохранить как... не появилось О_о", 10) ; На всякий случай... пока не появлялось
                    _IEQuit($URL)
                    ExitLoop
					EndIf
                EndIf
;~             Else ; Если на ссылку кликнули, а она битая... то можно попробовать, чтобы 2-ю попробовал, но есть вероятность, что кликнет на рекламу... поэтому просто следующую ссылку будет обрабатывать
;~                 $Chek2+=1
;~                 IF $Chek2>2 Then
;~                     $Chek2=0
;~ 					$aLinks[$i][2]="BadLink"
;~ 					_Log_Report($hLog, 'ERROR битая ссылка ' & "sfrom.net/" & $aLinks[$i][1], 205)
;~                     ;msgbox(0,"","ERROR Битая ссылка",10)
;~                     _IEQuit($URL)
;~                     ExitLoop
;~                 EndIf
;~             EndIf
        WEnd
        EndIf
        ExitLoop
    Else ; В случае если не грузится сайтец.... то будет 2-я попытка... и после нее переход на следующую ссылку... =)
        $Chek1+=1
        If $chek1>60 then
            $Chek1=0
            $chek11+=1
            If $chek11>2 then
				$aLinks[$i][2]="sfromDown"
				_Log_Report($hLog, 'ERROR ssyoutube.ru совсем не грузится ', 206)
                ;msgbox(0,"","ERROR ssyoutube.ru совсем не грузится",20)
                _IEQuit($URL)
                sleep($n*500)
                ExitLoop
            Else
				_Log_Report($hLog, 'ERROR ssyoutube.ru не грузится ', 207)
                ;msgbox(0,"","ERROR ssyoutube.ru не грузится",10)
                _IEQuit($URL)
                sleep($n*500)
                $URL = _IECreate("sfrom.net/" & $aLinks[$i][1])
            EndIf
        EndIf
    EndIf
WEnd
next
Next
$NowData=_NowDate()
$NowData_regwrite=regwrite("HKEY_CURRENT_USER\Software\VideoYandex", "OldData", "REG_SZ", $NowData)
EndFunc

Func _DW_master()

For $index=1 to UBound($aLinks)-1
;~ $oIE = _IECreate($sUrl);окно IE будет видно
$oIE = _IECreate($sUrl, 0, 0);окно IE будет скрыто
$oInput = _IEGetObjById($oIE, 'sf_url')
$oSubmit = _IEGetObjById($oIE, 'sf_submit')
_IEFormElementSetValue($oInput, $aLinks[$index][1])
_IEAction($oSubmit, 'click')
_IELoadWait($oIE)

$iStart = TimerInit()
While 1
    $oUrls = _IETagNameGetCollection($oIE, 'a')
	For $i=1 to 8
    For $oUrl In $oUrls
        ConsoleWrite($oUrl.innertext & ' - ' & $oUrl.href & @CR)
        If $oUrl.innertext == $format[$i] Then
            $sUrlFormat[$i] = $oUrl.href
            ExitLoop
        EndIf
    Next
	NExt
	If $sUrlFormat[1]<>"" or $sUrlFormat[2]<>"" or $sUrlFormat[3]<>"" or $sUrlFormat[4]<>"" Then ExitLoop
    If TimerDiff($iStart) > 10000 Then
	If $sUrlFormat[5]<>"" or $sUrlFormat[6]<>"" or $sUrlFormat[7]<>"" or $sUrlFormat[8]<>"" Then ExitLoop
	EndIf
	If TimerDiff($iStart) > 60000 Then
        ;MsgBox(16, 'Error', 'Время вышло')
        _IEQuit($oIE)
		$error="Time over"
		For $ii=1 to 8
		$sUrlFormat[$ii]=""
		Next
        ExitLoop
    EndIf
	Sleep(500)
WEnd
If $error="Time over" then
	ContinueLoop
	_Log_Report($hLog, 'За 60 сек не нашел ссылок' & $Format[$i], 502)
EndIf
_IEQuit($oIE)

For $i=1 to 8
	IF $i=1 or $i=3 or $i=6 or $i=8 Then
		$FormatVideo='.mp4'
	ElseIf $i=2 or $i=4 or $i=5 or $i=7 then
		$FormatVideo='.flv'
	Else
		$FormatVideo='.avi'
		_Log_Report($hLog, 'Формат Avi??? O_o', 501)
	EndIf
		$timedate = _NowDate()
	IF $sUrlFormat[$i]<>"" Then
		If FileExists($Folder_DW & '\' & $timedate & " - " & $index & $FormatVideo) Then 
			FileMove ($Folder_DW & '\' & $timedate & " - " & $index & $FormatVideo, $Folder_DW & '\' & $timedate & " - " & $index & "(1)" & $FormatVideo, 1)
		EndIf
			$hDownloadVideo = InetGet($sUrlFormat[$i], $Folder_DW & '\' & $timedate & " - " & $index & $FormatVideo, 1, 1)
		ExitLoop
	EndIf
	;msgbox(0,"",$i & @CRLF & $sUrlFormat[$i],1)

$old=InetGetInfo($hDownloadVideo, 0)/1024
Do
	$dStart = TimerInit()
	sleep(1000)
	; $hDownloadVideo/TimerDiff($dStart)
    ConsoleWrite($index & " " & $Format[$i] & ' скачано: ' & Round(InetGetInfo($hDownloadVideo, 0)/1024/1024, 2) & ' Mb' & _ 
	' Скороть = ' & Round((InetGetInfo($hDownloadVideo, 0)/1024-$old)/(TimerDiff($dStart)/1000), 2) & ' kb/s' & @CR)
	$old=InetGetInfo($hDownloadVideo, 0)/1024
Until InetGetInfo($hDownloadVideo, 2)
_Log_Report($hLog, 'Докачалось ' & $Format[$i], 500)
$nBytesVideo = Round(InetGetInfo($hDownloadVideo, 0)/1024/1024, 2)
InetClose($hDownloadVideo)
;MsgBox(64, 'Info', $timedate & " - " & $index & '.mp4  ' & $nBytesVideo & ' b' & @CRLF & $format[$i])
		For $ii=1 to 8
		$sUrlFormat[$ii]=""
		Next
Next
Next
EndFunc

Func _Pause()
    $Paused = Not $Paused
    While $Paused
        Sleep(100)
        WEnd
EndFunc

Func _Exit()
	_Log_Report($hLog, 'Program exit функция _exit', 2)
	_Log_Close($hLog)
    _IEQuit($oIE)
    _IEQuit($URL)
    Exit
EndFunc   ;==>_Exit


_Log_Report($hLog, 'Program exit конец скрипта', 2)
_Log_Close($hLog)

Изменения:
[box title=VideoYandex002]добавлено ведения лога[/box]
[box title=VideoYandex003]Поправил ведения Log
Добавил таймер. Скрипт работает 24/7 и в определнный час скачивает.
Добавил повторную проверку для скачивания. Т.е. то что не скачалось по той или иной причине в конце пытается скачать сново.
Добавил возможность переименовывать файлы в "Текущая Дата" + "Порядковый номер ссылки" В этом случае избавляет от бессмысленных кракозябр... но если был осмысленный текст, то меняет на дату и номер.
Добавил паузу. :smile:
Переделал механику нажатия на ссылку с файлом. Теперь это делает через ПКМ/сохранить как. Это избавило от ошибки с ресурсом "vimeo" "Не пытается сохранить и сразу пытается открыть и сохраняет временную папку"...
Поправил мелкие ошибки.[/box]
[box title=VideoYandex004]
Полностью переделал метод скачивания файла. благодаря madmasles http://autoit-script.ru/index.php?topic=4850.msg35190#msg35190
Теперь работает в скрытом режиме не отнимая мышь и клаву.
Можно указывать папку куда качать.
Также пока нет проверки на дублирующее имя... пока перезатирает.
[/box]

В общем жду критику... как это улучшить и т.д. наверняка будут какие-нибудь идеи... =) Также наверняка не учел, какие-либо ошибки... =)
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Не так давно делал бота, который вытягивал новости(текст) с сайта. Тоже сначала делал на _IECreate...
Потом попробовал WinHTTP и офигел от скорости обработки.
На _IE скрипт работал около получаса(переходы по страницам, раскрытие спойлеров и т.п.)
На WinHTTP скрипт делал тоже самое за ~3 минуты :laugh:, а если бы не защита от флуда на сайте, то справился бы за полторы, а так пришлось после каждых 9 запросов делать паузу на 10 секунд.

Такая скорость получается за счет прямого обращения к сайту без браузера, т.е. без всей обработки верстки, скачивания картинок/флеша/звуков и т.п. - на выходе имеем скелет сайта и работаем с ним как с текстом через наши любимые :D RegExp.

Вот примерчик - вытягивает все непустые ссылки с сайта, в комментарии написал как примерно должен выглядеть RegExp для ссылки "новое"(у меня таких ссылок нет, похоже нужна регистрация)
Код:
#include <Array.au3>
$sUrl = 'http://video.yandex.ru'
Global $oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oHTTP.Open('GET', $sUrl, False)
$oHTTP.Send('')
$oHTTP.WaitForResponse
$sHTML = $oHTTP.responseText
$aLinks = StringRegExp($sHTML, '(?si)<a.*?href="(http.*?)".*?/a>', 3)
; для ссылок "новое" должно выглядеть как-то так:
;~ $aLinks = StringRegExp($sHTML, '(?si)<a.*?href="(http.*?)".*?>.*?новое.*?</a>', 3)
_ArrayDisplay($aLinks)


Правда как скачать файл через запросы не подскажу.
 
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Redline
Хм... регистрация нигде не нужна... :smile: Это открытые ресурсы... :smile:

C video.yandex.ru работать должно, но с http://ru.savefrom.net/ скорее всего возникнут проблемы... там ссылку генерит JavaScript... и пока не кликнешь по ней или не перейдешь TAB'ом не нажмешь ENTER коректно работать не будет. :smile:
Если через _IENavigate, то тупо пустая страница и ничего...
Если через _IELinkClickByText или _IELinkClickByIndex, то сохраняет видео файл весом в 10-20Кб...

С WinHTTP пока не знаком... но спасибо за подсказку... обязательно познакомлюсь... :smile:
P.S. В принципе скорость в 3 часа или 2.5 часа выполнения скрипта не критично, если делать будет без меня и ночью... :smile:
P.S.S С RegExp пока не дружу... тоже думаю стоит подружиться... :beer:
 
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
[box title=VideoYandex003]
Поправил ведения Log
Добавил таймер. Скрипт работает 24/7 и в определнный час скачивает.
Добавил повторную проверку для скачивания. Т.е. то что не скачалось по той или иной причине в конце пытается скачать сново.
Добавил возможность переименовывать файлы в "Текущая Дата" + "Порядковый номер ссылки" В этом случае избавляет от бессмысленных кракозябр... но если был осмысленный текст, то меняет на дату и номер.
Добавил паузу. :smile:
Переделал механику нажатия на ссылку с файлом. Теперь это делает через ПКМ/сохранить как. Это избавило от ошибки с ресурсом "vimeo" "Не пытается сохранить и сразу пытается открыть и сохраняет временную папку"...
Поправил мелкие ошибки.[/box]

Код:
#include <IE.au3>
#Include <Log.au3>
#Include <date.au3>



Opt('MustDeclareVars', 1)
HotKeySet('{ESC}', '_Exit'); выход по кнопке Esc
HotKeySet("{F12}", "_Pause"); Пауза.


Dim $j = 0 ;счетчик найденных ссылок
Dim $aLinks[$j + 1][3];массив, в котором будут храниться найденные ссылки
Global $Paused
Global $sSearch = 'новое';слово, которое будем искать
Global $hLog, $Time
Global $oIE, $oForm, $oSearch, $URL
Global $Chek=0, $Chek1=0, $Chek2=0, $chek11=0
Global $oLink, $oLinks, $sText, $oSubmit
Global $OldData_regread, $NowData_regwrite, $NowData
Global $povtor1, $povtor2 
Global $i, $n, $index
Global $NewName=1 ;Если 1 то переименовывает видео файл Дата + порядковый номер 
Global $HourStart=18

$hLog = _Log_Open(@ScriptDir & '\VideoYandex.log', '###Log for Video.Yandex.ru###')
_Log_Report($hLog, 'Program start', 1)

While 1
	$OldData_regread = regread("HKEY_CURRENT_USER\Software\VideoYandex", "OldData")
If $OldData_regread=_NowDate() Then
	_Log_Report($hLog, 'Ждем следующий день', 3)
	;_Exit()
ElseIf $HourStart=@HOUR Then
	_VideoYandex(2) ; Сбор ссылок с Video.Yandex.ru. Если 2, то с проверкой.
	_sfrom(2) ; Скачивание по каждой ссылке. Если 2, то с проверкой.
	;_Exit()
	sleep(60*60*1000) ; Слип на час... что бы 2-й раз не запуститься по новой.
EndIf
sleep(30*60*1000) ;Раз в пол часа проверяет текущий час.
WEnd




;Функция для поиска ссылок на video.yandex.ru
Func _VideoYandex($povtor1)
For $i=1 to $povtor1
$oIE = _IECreate('http://video.yandex.ru/');открываем IE
$oForm = _IEFormGetCollection($oIE, 0);получаем форму
$oSearch = _IEFormElementGetObjByName($oForm, 'text') ;получаем объект по имени
_IELoadWait($oIE);ждем
While 1
sleep(6*1000)
$oLinks = _IELinkGetCollection($oIE) ;получаем коллекцию ссылок на странице
For $oLink In $oLinks ;в цикле проверяем все ссылки на странице
    If StringInStr($oLink.innertext, $sSearch) Then ;если в тексте ссылки есть искомое слово
        $j += 1;увеличиваем счетчик на 1
        ReDim $aLinks[$j + 1][3];изменяем размер массива
        $aLinks[$j][0] = $oLink.innertext;добавляем в массив текст ссылки
        $aLinks[$j][1] = $oLink.href;добавляем в массив адрес ссылки
		$aLinks[$j][2] = "new"
    EndIf
Next
If $j>0 Then ; Если хотя бы одна ссылка найдена, то выходим из цикла
    ExitLoop
Else ; Если не находит, то плюсует счетчик... и если 60 сек не грузится video.yandex.ru закрывает скрипт
    $Chek+=1
	If $chek>10 Then
		_Log_Report($hLog, 'video.yandex.ru не грузится', 101)
		;MsgBox(0,"","video.yandex.ru не грузится")
		_IEQuit($oIE)
		ExitLoop
	EndIf
EndIf
WEnd
$aLinks[0][0] = $j;присваиваем этому элементу массива число - количество найденных ссылок.
_IEQuit($oIE)
If $J>1 then
ExitLoop
EndIf
Next
EndFunc
;Функция обрабатывающая ссылки через sfrom.net...
Func _sfrom($Povtor2)
For $n=1 to $Povtor2
For $i=1 to UBound($aLinks)-1
$Chek1=0
$Chek2=0
$chek11=0
$URL = _IECreate("sfrom.net/" & $aLinks[$i][1]) ; открывается ссылка обработаная сайтом.

While 1
	If $n>1 Then
		If $aLinks[$i][2]="rdy" then
			_IEQuit($URL)
			_Log_Report($hLog, 'n>1' & $aLinks[$i][1], 301)
			ExitLoop
		EndIf
	EndIf
;~ 	If StringRegExp ($aLinks[$i][1], "(vimeo)" , 0)=1 then ;Проверка на vimeo. С ним не корректно работает. Пытается сразу открыть в плеере.
;~ 		msgbox(0,"","vimeo кака",5)
;~ 		_IEQuit($URL)
;~ 		sleep($n*1000)
;~ 		$aLinks[$i][2]="vimeo"
;~ 		_Log_Report($hLog, 'Vimeo kaka' & "sfrom.net/" & $aLinks[$i][1], 203)
;~ 		ExitLoop
;~ 	EndIf	
    Sleep($n*1000)
    $sText = _IEBodyReadText($URL) ; Получаем текст странички
    If StringInStr($sText, "Ссылка") Then ; Если в тексте есть "Ссылка" то продолжаем
        If StringInStr($sText, "Не найдена ссылка для скачивания") Then ; Если не найдена ссылка на сайте, пробуем ещё раз и выходим из цикла для поиска следующей
                $chek11+=1
				_Log_Report($hLog, 'ssyoutube.ru не нашел страничку' & "sfrom.net/" & $aLinks[$i][1], 201)
                ;msgbox(0,"","ERROR ssyoutube.ru не нашел страничку",10)
                _IEQuit($URL)
                sleep(500)
                $URL = _IECreate("sfrom.net/" & $aLinks[$i][1])
                If $chek11>1 Then
                    $chek11=0
					$aLinks[$i][2]="Bad URL"
					_Log_Report($hLog, 'ssyoutube.ru совсем не находит ' & "sfrom.net/" & $aLinks[$i][1], 202)
                    ;msgbox(0,"","ERROR ssyoutube.ru совсем не находит",20)
                    _IEQuit($URL)
                    sleep($n*1000)
                    ExitLoop
                EndIf
			Else
        While 1
            sleep($n*5000)
            $oSubmit = _IEGetObjByName ($URL, "sf_url") ; Если ссылка найдена, то фокус на поле для ввода и 2 Таба и мы на первой ссылке с как правило лучшим качеством
            _IEAction($oSubmit, "Focus")
            sleep($n*100)
            Send("{TAB 2}")
            ;If $Chek2=5 then
            ;   Send("{TAB}")
            ;ElseIf $Chek2>8 then
            ;   Send("{TAB 2}")
            ;EndIf
            sleep($n*1000)
			For $index=1 to 10
				WinKill("Не удается отобразить веб-страницу - Windows Internet Explorer")
			Next
            ; Send("{ENTER}") ; Пробовал сделать через _IELinkClickByText и _IENavigate... из-за использования JavaScript не работает
			send("{APPSKEY}")	
			sleep(1000)
			send("{down 4}")
			sleep(1000)
			send("{ENTER}")
			sleep(1000)
;~ 			WinWaitActive("Загрузка файла", "", $n*15) ;Ждет диалогового окна с вопросом сохранить/открыть
;~ 			If WinExists("Не удается отобразить веб-страницу - Windows Internet Explorer") Then
;~ 				$Chek2=0
;~ 				$aLinks[$i][2]="BadLink"
;~ 				_Log_Report($hLog, 'ERROR битая ссылка ' & "sfrom.net/" & $aLinks[$i][1], 205)
;~ 				;msgbox(0,"","ERROR Битая ссылка",10)
;~ 				_IEQuit($URL)
;~ 				ExitLoop
;~ 			EndIf
;~ 			If WinActive("","Временная папка") Then ;Если сразу пытается открыть сохраняя в временную папку
;~                 Sleep($n*1000)
;~                 Send("{TAB}")
;~                 Sleep($n*1000)
;~                 Send("{ENTER}") ; Через ControlSend корректно работать не хочет... :( Надо додумать...
;~ 				_Log_Report($hLog, 'не сохраняет... пытается открыть... ' & "sfrom.net/" & $aLinks[$i][1], 203)
;~                 $aLinks[$i][2]="Vimeo2"
;~ 				;msgbox(0,"ERROR","не сохраняет... пытается открыть...", 10)
;~                 $Chek2=0
;~                 _IEQuit($URL)
;~                 ExitLoop
;~             EndIf
;~             If WinActive("Загрузка файла") then
;~                 sleep($n*1000)
;~                 Send("{Left}")
;~                 sleep($n*1000)
;~                 send("{ENTER}")
                WinWaitActive("Сохранить как", "", $n*30)
				If WinActive("Windows Internet Explorer","Не удалось загрузить.") then
					$aLinks[$i][2]="BadLink"
					_Log_Report($hLog, 'ERROR битая ссылка ' & "sfrom.net/" & $aLinks[$i][1], 205)
					;msgbox(0,"","ERROR Битая ссылка",10)
					_IEQuit($URL)
					ExitLoop
				EndIf
                If WinActive("Сохранить как") then
					sleep(1000)
					If $NewName=1 then
					Send("{RIGHT}")
					sleep(100)
					Send("{Left 4}")
					sleep(100)
					Send("+^{Home}")
					sleep(100)
					send("{del}")
					sleep(100)
					Send(_NowDate() & " - " & $i)
					EndIf
                    sleep($n*1000)
                    Send("{ENTER}")
                    WinWaitActive("Подтвердить сохранение в виде","",$n*5) ;Если файл уже был ранее сохранен... то далее просто нажмет нет и отмена и выйдет из цикла
                        If WinActive("Подтвердить сохранение в виде") then
                            ;sleep(1000)
                            ;Send("{Left}")
                            sleep($n*1000)
                            send("{ENTER}")
                            Sleep($n*1000)
                            Send("{TAB 4}")
                            Sleep($n*1000)
                            Send("{ENTER}")
							_Log_Report($hLog, 'ERROR был уже такой файл ' & "sfrom.net/" & $aLinks[$i][1], 204)
                            $aLinks[$i][2]="Rdy"
							;MsgBox(0,"","ERROR был уже такой файл",10)
                            _IEQuit($URL)
                            Sleep($n*100)
                            ExitLoop
                        EndIf
                    WinWaitClose("","Осталось времени:") ; ждет пока докачается
					$aLinks[$i][2]="Rdy"
					_Log_Report($hLog, 'Скачалось видео ' & "sfrom.net/" & $aLinks[$i][1], 200)
                    _IEQuit($URL)
                    Sleep($n*100)
					$Chek2=0
					ExitLoop   
				Else   
					$Chek2+=1
					_Log_Report($hLog, '$chek2 ' & $chek2, 305)
					IF $Chek2>2 Then
                    $Chek2=0
					$aLinks[$i][2]="saveERROR"
					_Log_Report($hLog, 'Сохранить как... не появилось О_о ' & "sfrom.net/" & $aLinks[$i][1], 777)
                    ;MsgBox(0,"ERROR", "Сохранить как... не появилось О_о", 10) ; На всякий случай... пока не появлялось
                    _IEQuit($URL)
                    ExitLoop
					EndIf
                EndIf
;~             Else ; Если на ссылку кликнули, а она битая... то можно попробовать, чтобы 2-ю попробовал, но есть вероятность, что кликнет на рекламу... поэтому просто следующую ссылку будет обрабатывать
;~                 $Chek2+=1
;~                 IF $Chek2>2 Then
;~                     $Chek2=0
;~ 					$aLinks[$i][2]="BadLink"
;~ 					_Log_Report($hLog, 'ERROR битая ссылка ' & "sfrom.net/" & $aLinks[$i][1], 205)
;~                     ;msgbox(0,"","ERROR Битая ссылка",10)
;~                     _IEQuit($URL)
;~                     ExitLoop
;~                 EndIf
;~             EndIf
        WEnd
        EndIf
        ExitLoop
    Else ; В случае если не грузится сайтец.... то будет 2-я попытка... и после нее переход на следующую ссылку... =)
        $Chek1+=1
        If $chek1>60 then
            $Chek1=0
            $chek11+=1
            If $chek11>2 then
				$aLinks[$i][2]="sfromDown"
				_Log_Report($hLog, 'ERROR ssyoutube.ru совсем не грузится ', 206)
                ;msgbox(0,"","ERROR ssyoutube.ru совсем не грузится",20)
                _IEQuit($URL)
                sleep($n*500)
                ExitLoop
            Else
				_Log_Report($hLog, 'ERROR ssyoutube.ru не грузится ', 207)
                ;msgbox(0,"","ERROR ssyoutube.ru не грузится",10)
                _IEQuit($URL)
                sleep($n*500)
                $URL = _IECreate("sfrom.net/" & $aLinks[$i][1])
            EndIf
        EndIf
    EndIf
WEnd
next
Next
$NowData=_NowDate()
$NowData_regwrite=regwrite("HKEY_CURRENT_USER\Software\VideoYandex", "OldData", "REG_SZ", $NowData)
EndFunc

Func _Pause()
    $Paused = Not $Paused
    While $Paused
        Sleep(100)
        WEnd
EndFunc

Func _Exit()
	_Log_Report($hLog, 'Program exit функция _exit', 2)
	_Log_Close($hLog)
    _IEQuit($oIE)
    _IEQuit($URL)
    Exit
EndFunc   ;==>_Exit


_Log_Report($hLog, 'Program exit конец скрипта', 2)
_Log_Close($hLog)
 
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
[box title=VideoYandex004]
Полностью переделал метод скачивания файла. благодаря madmasles http://autoit-script.ru/index.php?topic=4850.msg35190#msg35190
Теперь работает в скрытом режиме не отнимая мышь и клаву.
Можно указывать папку куда качать.
Также пока нет проверки на дублирующее имя... пока перезатирает.
[/box]

P.S. Думаю следующее, что будет это GUI... имхо пора... :smile:
Код:
#include <IE.au3>
#Include <Log.au3>
#Include <date.au3>
#Include <array.au3>
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)
HotKeySet('{ESC}', '_Exit'); выход по кнопке Esc
HotKeySet("{F9}", "_Pause"); Пауза.


Dim $j = 0 ;счетчик найденных ссылок
Dim $aLinks[$j + 1][3];массив, в котором будут храниться найденные ссылки
Global $Paused
Global $sSearch = 'новое';слово, которое будем искать
Global $hLog, $Time
Global $oIE, $oForm, $oSearch, $URL, $oInput, $oSubmit, $iStart, $dStart, $oUrls, $oUrl, $FormatVideo, $hDownloadVideo, $nBytesVideo, $old, $timedate, $error
Global $Chek=0, $Chek1=0, $Chek2=0, $chek11=0
Global $oLink, $oLinks, $sText, $oSubmit
Global $OldData_regread, $NowData_regwrite, $NowData
Global $povtor1, $povtor2 
Global $i, $n, $index, $Folder_DW
Global $NewName=1 ;Если 1 то переименовывает видео файл Дата + порядковый номер 

Global $HourStart=@HOUR ;Час старта скрипта													<<<<<<<<<<<<<<<<<<<<< ОБЯЗАТЕЛЬНО ВЫСТАВИТЬ!!!

Global $sUrl = 'http://ru.savefrom.net/'

DIM $Format[9], $sUrlFormat[9]
$format[1]="MP4 HD (1080p)"
$format[2]="FLV H.264 HD 720p"
$format[3]="MP4 HD (720p)"
$format[4]="FLV H.264"
$format[5]="FLV HQ"
$format[6]="MP4 HD"
$format[7]="FLV"
$format[8]="MP4"
$Folder_DW = "D:\Downloads\video\yandex.video.ru" ;Папка куда будет качаться видео.			<<<<<<<<<<<<<<<<<<<<< ОБЯЗАТЕЛЬНО ВЫСТАВИТЬ!!!
DirCreate($Folder_DW & '\Temp')
$hLog = _Log_Open(@ScriptDir & '\VideoYandex.log', '###Log for Video.Yandex.ru###')
_Log_Report($hLog, 'Program start', 1)

While 1
	$OldData_regread = regread("HKEY_CURRENT_USER\Software\VideoYandex", "OldData")
If $OldData_regread=_NowDate() Then
	_Log_Report($hLog, 'Ждем следующий день', 3)
	;_Exit()
ElseIf $HourStart=@HOUR Then
	_VideoYandex(2) ; Сбор ссылок с Video.Yandex.ru. Если 2, то с проверкой.
;~ 	_ArrayDisplay($aLinks)
;~ 	_sfrom(2) ; Скачивание по каждой ссылке. Если 2, то с проверкой.
	_DW_master()
	;_Exit()
	sleep(60*60*1000) ; Слип на час... что бы 2-й раз не запуститься по новой.
EndIf
sleep(30*60*1000) ;Раз в пол часа проверяет текущий час.
WEnd



		
;Функция для поиска ссылок на video.yandex.ru
Func _VideoYandex($povtor1)
For $i=1 to $povtor1
$oIE = _IECreate('http://video.yandex.ru/',0,0);открываем IE в скрытом виде
$oForm = _IEFormGetCollection($oIE, 0);получаем форму
$oSearch = _IEFormElementGetObjByName($oForm, 'text') ;получаем объект по имени
_IELoadWait($oIE);ждем
While 1
sleep(6*1000)
$oLinks = _IELinkGetCollection($oIE) ;получаем коллекцию ссылок на странице
For $oLink In $oLinks ;в цикле проверяем все ссылки на странице
    If StringInStr($oLink.innertext, $sSearch) Then ;если в тексте ссылки есть искомое слово
        $j += 1;увеличиваем счетчик на 1
        ReDim $aLinks[$j + 1][3];изменяем размер массива
        $aLinks[$j][0] = $oLink.innertext;добавляем в массив текст ссылки
        $aLinks[$j][1] = $oLink.href;добавляем в массив адрес ссылки
		$aLinks[$j][2] = "new"
    EndIf
Next
If $j>0 Then ; Если хотя бы одна ссылка найдена, то выходим из цикла
    ExitLoop
Else ; Если не находит, то плюсует счетчик... и если 60 сек не грузится video.yandex.ru закрывает скрипт
    $Chek+=1
	If $chek>10 Then
		_Log_Report($hLog, 'video.yandex.ru не грузится', 101)
		;MsgBox(0,"","video.yandex.ru не грузится")
		_IEQuit($oIE)
		ExitLoop
	EndIf
EndIf
WEnd
$aLinks[0][0] = $j;присваиваем этому элементу массива число - количество найденных ссылок.
_IEQuit($oIE)
If $J>1 then
ExitLoop
EndIf
Next
EndFunc
;Функция обрабатывающая ссылки через sfrom.net...
Func _sfrom($Povtor2)
For $n=1 to $Povtor2
For $i=1 to UBound($aLinks)-1
$Chek1=0
$Chek2=0
$chek11=0
$URL = _IECreate("sfrom.net/" & $aLinks[$i][1]) ; открывается ссылка обработаная сайтом.

While 1
	If $n>1 Then
		If $aLinks[$i][2]="rdy" then
			_IEQuit($URL)
			_Log_Report($hLog, 'n>1' & $aLinks[$i][1], 301)
			ExitLoop
		EndIf
	EndIf
;~ 	If StringRegExp ($aLinks[$i][1], "(vimeo)" , 0)=1 then ;Проверка на vimeo. С ним не корректно работает. Пытается сразу открыть в плеере.
;~ 		msgbox(0,"","vimeo кака",5)
;~ 		_IEQuit($URL)
;~ 		sleep($n*1000)
;~ 		$aLinks[$i][2]="vimeo"
;~ 		_Log_Report($hLog, 'Vimeo kaka' & "sfrom.net/" & $aLinks[$i][1], 203)
;~ 		ExitLoop
;~ 	EndIf	
    Sleep($n*1000)
    $sText = _IEBodyReadText($URL) ; Получаем текст странички
    If StringInStr($sText, "Ссылка") Then ; Если в тексте есть "Ссылка" то продолжаем
        If StringInStr($sText, "Не найдена ссылка для скачивания") Then ; Если не найдена ссылка на сайте, пробуем ещё раз и выходим из цикла для поиска следующей
                $chek11+=1
				_Log_Report($hLog, 'ssyoutube.ru не нашел страничку' & "sfrom.net/" & $aLinks[$i][1], 201)
                ;msgbox(0,"","ERROR ssyoutube.ru не нашел страничку",10)
                _IEQuit($URL)
                sleep(500)
                $URL = _IECreate("sfrom.net/" & $aLinks[$i][1])
                If $chek11>1 Then
                    $chek11=0
					$aLinks[$i][2]="Bad URL"
					_Log_Report($hLog, 'ssyoutube.ru совсем не находит ' & "sfrom.net/" & $aLinks[$i][1], 202)
                    ;msgbox(0,"","ERROR ssyoutube.ru совсем не находит",20)
                    _IEQuit($URL)
                    sleep($n*1000)
                    ExitLoop
                EndIf
			Else
        While 1
            sleep($n*5000)
            $oSubmit = _IEGetObjByName ($URL, "sf_url") ; Если ссылка найдена, то фокус на поле для ввода и 2 Таба и мы на первой ссылке с как правило лучшим качеством
            _IEAction($oSubmit, "Focus")
            sleep($n*100)
            Send("{TAB 2}")
            ;If $Chek2=5 then
            ;   Send("{TAB}")
            ;ElseIf $Chek2>8 then
            ;   Send("{TAB 2}")
            ;EndIf
            sleep($n*1000)
			For $index=1 to 10
				WinKill("Не удается отобразить веб-страницу - Windows Internet Explorer")
			Next
            ; Send("{ENTER}") ; Пробовал сделать через _IELinkClickByText и _IENavigate... из-за использования JavaScript не работает
			send("{APPSKEY}")	
			sleep(1000)
			send("{down 4}")
			sleep(1000)
			send("{ENTER}")
			sleep(1000)
;~ 			WinWaitActive("Загрузка файла", "", $n*15) ;Ждет диалогового окна с вопросом сохранить/открыть
;~ 			If WinExists("Не удается отобразить веб-страницу - Windows Internet Explorer") Then
;~ 				$Chek2=0
;~ 				$aLinks[$i][2]="BadLink"
;~ 				_Log_Report($hLog, 'ERROR битая ссылка ' & "sfrom.net/" & $aLinks[$i][1], 205)
;~ 				;msgbox(0,"","ERROR Битая ссылка",10)
;~ 				_IEQuit($URL)
;~ 				ExitLoop
;~ 			EndIf
;~ 			If WinActive("","Временная папка") Then ;Если сразу пытается открыть сохраняя в временную папку
;~                 Sleep($n*1000)
;~                 Send("{TAB}")
;~                 Sleep($n*1000)
;~                 Send("{ENTER}") ; Через ControlSend корректно работать не хочет... :( Надо додумать...
;~ 				_Log_Report($hLog, 'не сохраняет... пытается открыть... ' & "sfrom.net/" & $aLinks[$i][1], 203)
;~                 $aLinks[$i][2]="Vimeo2"
;~ 				;msgbox(0,"ERROR","не сохраняет... пытается открыть...", 10)
;~                 $Chek2=0
;~                 _IEQuit($URL)
;~                 ExitLoop
;~             EndIf
;~             If WinActive("Загрузка файла") then
;~                 sleep($n*1000)
;~                 Send("{Left}")
;~                 sleep($n*1000)
;~                 send("{ENTER}")
                WinWaitActive("Сохранить как", "", $n*30)
				If WinActive("Windows Internet Explorer","Не удалось загрузить.") then
					$aLinks[$i][2]="BadLink"
					_Log_Report($hLog, 'ERROR битая ссылка ' & "sfrom.net/" & $aLinks[$i][1], 205)
					;msgbox(0,"","ERROR Битая ссылка",10)
					_IEQuit($URL)
					ExitLoop
				EndIf
                If WinActive("Сохранить как") then
					sleep(1000)
					If $NewName=1 then
					Send("{RIGHT}")
					sleep(100)
					Send("{Left 4}")
					sleep(100)
					Send("+^{Home}")
					sleep(100)
					send("{del}")
					sleep(100)
					Send(_NowDate() & " - " & $i)
					EndIf
                    sleep($n*1000)
                    Send("{ENTER}")
                    WinWaitActive("Подтвердить сохранение в виде","",$n*5) ;Если файл уже был ранее сохранен... то далее просто нажмет нет и отмена и выйдет из цикла
                        If WinActive("Подтвердить сохранение в виде") then
                            ;sleep(1000)
                            ;Send("{Left}")
                            sleep($n*1000)
                            send("{ENTER}")
                            Sleep($n*1000)
                            Send("{TAB 4}")
                            Sleep($n*1000)
                            Send("{ENTER}")
							_Log_Report($hLog, 'ERROR был уже такой файл ' & "sfrom.net/" & $aLinks[$i][1], 204)
                            $aLinks[$i][2]="Rdy"
							;MsgBox(0,"","ERROR был уже такой файл",10)
                            _IEQuit($URL)
                            Sleep($n*100)
                            ExitLoop
                        EndIf
                    WinWaitClose("","Осталось времени:") ; ждет пока докачается
					$aLinks[$i][2]="Rdy"
					_Log_Report($hLog, 'Скачалось видео ' & "sfrom.net/" & $aLinks[$i][1], 200)
                    _IEQuit($URL)
                    Sleep($n*100)
					$Chek2=0
					ExitLoop   
				Else   
					$Chek2+=1
					_Log_Report($hLog, '$chek2 ' & $chek2, 305)
					IF $Chek2>2 Then
                    $Chek2=0
					$aLinks[$i][2]="saveERROR"
					_Log_Report($hLog, 'Сохранить как... не появилось О_о ' & "sfrom.net/" & $aLinks[$i][1], 777)
                    ;MsgBox(0,"ERROR", "Сохранить как... не появилось О_о", 10) ; На всякий случай... пока не появлялось
                    _IEQuit($URL)
                    ExitLoop
					EndIf
                EndIf
;~             Else ; Если на ссылку кликнули, а она битая... то можно попробовать, чтобы 2-ю попробовал, но есть вероятность, что кликнет на рекламу... поэтому просто следующую ссылку будет обрабатывать
;~                 $Chek2+=1
;~                 IF $Chek2>2 Then
;~                     $Chek2=0
;~ 					$aLinks[$i][2]="BadLink"
;~ 					_Log_Report($hLog, 'ERROR битая ссылка ' & "sfrom.net/" & $aLinks[$i][1], 205)
;~                     ;msgbox(0,"","ERROR Битая ссылка",10)
;~                     _IEQuit($URL)
;~                     ExitLoop
;~                 EndIf
;~             EndIf
        WEnd
        EndIf
        ExitLoop
    Else ; В случае если не грузится сайтец.... то будет 2-я попытка... и после нее переход на следующую ссылку... =)
        $Chek1+=1
        If $chek1>60 then
            $Chek1=0
            $chek11+=1
            If $chek11>2 then
				$aLinks[$i][2]="sfromDown"
				_Log_Report($hLog, 'ERROR ssyoutube.ru совсем не грузится ', 206)
                ;msgbox(0,"","ERROR ssyoutube.ru совсем не грузится",20)
                _IEQuit($URL)
                sleep($n*500)
                ExitLoop
            Else
				_Log_Report($hLog, 'ERROR ssyoutube.ru не грузится ', 207)
                ;msgbox(0,"","ERROR ssyoutube.ru не грузится",10)
                _IEQuit($URL)
                sleep($n*500)
                $URL = _IECreate("sfrom.net/" & $aLinks[$i][1])
            EndIf
        EndIf
    EndIf
WEnd
next
Next
$NowData=_NowDate()
$NowData_regwrite=regwrite("HKEY_CURRENT_USER\Software\VideoYandex", "OldData", "REG_SZ", $NowData)
EndFunc

Func _DW_master()

For $index=1 to UBound($aLinks)-1
;~ $oIE = _IECreate($sUrl);окно IE будет видно
$oIE = _IECreate($sUrl, 0, 0);окно IE будет скрыто
$oInput = _IEGetObjById($oIE, 'sf_url')
$oSubmit = _IEGetObjById($oIE, 'sf_submit')
_IEFormElementSetValue($oInput, $aLinks[$index][1])
_IEAction($oSubmit, 'click')
_IELoadWait($oIE)

$iStart = TimerInit()
While 1
    $oUrls = _IETagNameGetCollection($oIE, 'a')
	For $i=1 to 8
    For $oUrl In $oUrls
        ConsoleWrite($oUrl.innertext & ' - ' & $oUrl.href & @CR)
        If $oUrl.innertext == $format[$i] Then
            $sUrlFormat[$i] = $oUrl.href
            ExitLoop
        EndIf
    Next
	NExt
	If $sUrlFormat[1]<>"" or $sUrlFormat[2]<>"" or $sUrlFormat[3]<>"" or $sUrlFormat[4]<>"" Then ExitLoop
    If TimerDiff($iStart) > 10000 Then
	If $sUrlFormat[5]<>"" or $sUrlFormat[6]<>"" or $sUrlFormat[7]<>"" or $sUrlFormat[8]<>"" Then ExitLoop
	EndIf
	If TimerDiff($iStart) > 60000 Then
        ;MsgBox(16, 'Error', 'Время вышло')
        _IEQuit($oIE)
		$error="Time over"
		For $ii=1 to 8
		$sUrlFormat[$ii]=""
		Next
        ExitLoop
    EndIf
	Sleep(500)
WEnd
If $error="Time over" then
	ContinueLoop
	_Log_Report($hLog, 'За 60 сек не нашел ссылок' & $Format[$i], 502)
EndIf
_IEQuit($oIE)

For $i=1 to 8
	IF $i=1 or $i=3 or $i=6 or $i=8 Then
		$FormatVideo='.mp4'
	ElseIf $i=2 or $i=4 or $i=5 or $i=7 then
		$FormatVideo='.flv'
	Else
		$FormatVideo='.avi'
		_Log_Report($hLog, 'Формат Avi??? O_o', 501)
	EndIf
		$timedate = _NowDate()
	IF $sUrlFormat[$i]<>"" Then
		If FileExists($Folder_DW & '\' & $timedate & " - " & $index & $FormatVideo) Then 
			FileMove ($Folder_DW & '\' & $timedate & " - " & $index & $FormatVideo, $Folder_DW & '\' & $timedate & " - " & $index & "(1)" & $FormatVideo, 1)
		EndIf
			$hDownloadVideo = InetGet($sUrlFormat[$i], $Folder_DW & '\' & $timedate & " - " & $index & $FormatVideo, 1, 1)
		ExitLoop
	EndIf
	;msgbox(0,"",$i & @CRLF & $sUrlFormat[$i],1)

$old=InetGetInfo($hDownloadVideo, 0)/1024
Do
	$dStart = TimerInit()
	sleep(1000)
	; $hDownloadVideo/TimerDiff($dStart)
    ConsoleWrite($index & " " & $Format[$i] & ' скачано: ' & Round(InetGetInfo($hDownloadVideo, 0)/1024/1024, 2) & ' Mb' & _ 
	' Скороть = ' & Round((InetGetInfo($hDownloadVideo, 0)/1024-$old)/(TimerDiff($dStart)/1000), 2) & ' kb/s' & @CR)
	$old=InetGetInfo($hDownloadVideo, 0)/1024
Until InetGetInfo($hDownloadVideo, 2)
_Log_Report($hLog, 'Докачалось ' & $Format[$i], 500)
$nBytesVideo = Round(InetGetInfo($hDownloadVideo, 0)/1024/1024, 2)
InetClose($hDownloadVideo)
;MsgBox(64, 'Info', $timedate & " - " & $index & '.mp4  ' & $nBytesVideo & ' b' & @CRLF & $format[$i])
		For $ii=1 to 8
		$sUrlFormat[$ii]=""
		Next
Next
Next
EndFunc

Func _Pause()
    $Paused = Not $Paused
    While $Paused
        Sleep(100)
        WEnd
EndFunc

Func _Exit()
	_Log_Report($hLog, 'Program exit функция _exit', 2)
	_Log_Close($hLog)
    _IEQuit($oIE)
    _IEQuit($URL)
    Exit
EndFunc   ;==>_Exit


_Log_Report($hLog, 'Program exit конец скрипта', 2)
_Log_Close($hLog)
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Вот с помощью r35p3cta добил выдирание ссылок через WinHTTP. Правда на rss видео обновляется не очень часто, и нет пометок "новое". Так что настроил выдирание по сегодняшней дате. Выдача в массив: первый простой прямо из RegExp - чередование названия роликов и ссылок на них, второй по подобию твоего, оставь нужный.
Код:
#include <Array.au3>
Dim $aMonth[12] = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
$sDate = @MDAY & ' ' & $aMonth[@MON - 1] & ' ' & @YEAR
$sUrl = 'http://video.yandex.ru/top-archive/rss/'
$oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oHTTP.Open('GET', $sUrl, False)
$oHTTP.Send('')
$oHTTP.WaitForResponse
$sHTML = $oHTTP.ResponseText
$aLinksRaw = StringRegExp($sHTML, '(?si)<item>.*?<title>(.*?)</title>.*?<pubDate>.*?' & $sDate & '.*?</pubDate>.*?<media:p.*?"(.*?)".*?</item>', 3)
_ArrayDisplay($aLinksRaw)
Dim $aLinks[(UBound($aLinksRaw)/2)][2]
For $i = 0 To UBound($aLinksRaw) - 2 Step 2
	$aLinks[$i/2][0] = $aLinksRaw[$i]
	$aLinks[$i/2][1] = $aLinksRaw[$i + 1]
Next
_ArrayDisplay($aLinks)
 
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
:D
Спасибо.
По дате не подумал. :smile: Опа... еще и название нормальное вытаскивает! Хорошая работа! :thumbs_up:

Там ссылок 450+ задумался, а почему бы не сделать базу ссылок. Добавлять в нее новые и помечать которые уже скачались. :smile: В этом случае не нужно будет делать привязку к времени и дате запуска. Идет сравнение и все что накопилось за 2-3 дня будет подкачиваться. :smile:
И вот в чем вопрос: будет ли нормально и шустро работать с ini... если строк перевалит за 1000 или 2000... или нужно SQL...

P.S. Ушел тестировать ввод/вывод данных... :smile:

---------------------------------------------------------------------------------------------------------

ini-файлик в 10 000 строк вводится и выводится в масив примерно за минуту... если 1 раз делать, то не страшно.. :smile:
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Мне удалось подружиться с youtube.com :laugh:
Скрипт выдирает ссылки напрямую с сайта youtube.
Ограничение: имена файлов должны иметь вид:
http://www.youtube.com/v/M7fn6MsPiug - плеер во все окно
или http://www.youtube.com/watch?v=M7fn6MsPiug - стандартный
На выходе массив из ссылок на ролик(несколько вариантов разрешения для каждого ролика) и форматов видео для наглядности.
Код:
Dim $aLinksInput[6] = ['http://www.youtube.com/v/_vZ8-6zGSTE','http://www.youtube.com/v/M7fn6MsPiug', 'http://www.youtube.com/v/iimMKWF7SK0', _
'http://www.youtube.com/v/JKxiWebVWZ0', 'http://www.youtube.com/v/HmvH2YrimcQ', 'http://www.youtube.com/v/8D9SkivEmsc' ]

Dim $aFormat[11][2] = [['5', 'FLV 240p'], ['17', '3gp'], ['13', '3gp'], ['18', 'MP4 360p'], ['22', 'MP4 720p (HD)'], ['34', 'FLV 360p'], _
['35', 'FLV 480p'], ['37', 'MP4 1080p (HD)'], ['38', 'MP4 Original (HD)'], ['43', 'WebM 480p'], ['45', 'WebM 720p (HD)']] ; массив форматов youtube.com

Dim $aSimbols[10][2] = [['%7C', '|'], ['%253A', ':'], ['%252C', ','], ['%26', '&'], _
['%3A', ':'], ['%2F', '/'], ['%3F', '?'], ['%3D', '='], ['%2C', ','], ['&amp', '']] ; массив для восстановления символов пунктуации из кодировки

For $z = 0 To UBound($aLinksInput) - 1
	$oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1') ; объект WinHTTP создается каждый раз, иначе выдаются кривые ссылки
	$sUrl = StringReplace($aLinksInput[$z], '.com/v/', '.com/watch?v=') ; приводим ссылку к нужному виду
	$oHTTP.Open('GET', $sUrl, False)
	$oHTTP.Send('')
	$oHTTP.WaitForResponse
	$sHTML = $oHTTP.ResponseText
	$sOut = StringRegExpReplace($sHTML, '(?si).*?fmt_url_map=(.*?);.*$', '$1') ; получаем строку со всеми ссылками на ролик
	$sTitle = BinaryToString(StringToBinary(StringRegExpReplace($sHTML, '(?si).*?<meta name="title" content="(.*?)">.*$', '$1'), 4)) ; получаем названия ролика и переводим в кодировку UTF-8
	$sTitle = StringRegExpReplace($sTitle, '(?si)(&.*?;)', '') ; убираем теги (типа "&quote;")из названия ролика
	For $i = 0 To UBound($aSimbols) - 1
		$sOut = StringReplace($sOut, $aSimbols[$i][0], $aSimbols[$i][1]) ; восстанавливаем кодировку пунктуации
	Next
	$aLinks = StringRegExp($sOut, '(?si)(?:^|,)(\d+)\|(http.*?id=.[^,]+)', 3) ; получаем массив из ссылок на ролики и их форматов
	$Format = False
	For $i = 0 To UBound($aLinks) - 1 Step 2
		$aLinks[$i + 1] = $aLinks[$i + 1] & '&title=' & $sTitle ; дописываем к ссылкам тег "title" иначе ролик будет называться "videoplayback"
		For $j = 0 To UBound($aFormat) - 1 ; расшифровка формата
			If $aFormat[$j][0] = $aLinks[$i] Then
				$aLinks[$i] = 'Format: ' & $aFormat[$j][1] & ' [' & $aLinks[$i] & ']'
				$Format = True
				ExitLoop
			EndIf
		Next
		If Not $Format Then $aLinks[$i] = 'Format: unknown [' & $aLinks[$i] & ']'
		ConsoleWrite($aLinks[$i] & @CRLF) ; выдача форматов для ссылки
		ConsoleWrite($aLinks[$i + 1] & @CRLF) ; выдача ссылок в консоль (в _ArrayDisplay() ссылки обрезаются, т.к. слишком длинные)
	Next
	ConsoleWrite('------------------' & @CRLF)
	$oHTTP = 0 ; удаляем объект WinHTTP
Next
На основе создам утилиту для поиска и скачивания напрямую :smile:
Какие еще есть популярные видео-хостинги? Может и для них удастся сварганить подобное
 
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
vimeo.com
rutube.ru
video.mail.ru
video.qip.ru
и т.д. Введи в поиске "видео хостинг"... и выбирай... :smile:
 
Верх