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