1 (изменено: DnsIs, 2010-10-01 12:35:32)

Тема: JScript: Автоматическая закачка файла с сервиса depositfiles.com

Доброго дня.
Нашел на Хабре скрипт для автоматической скачки файлов с сервиса depositfiles.com/ru/. Все бы ничего, но скрипт там для Линукса. А мне захотелось сделать для Windows. Но вот столкнулся с проблемой. Не могу корректно передать POST методом данные в форму, что бы получить страничку со ссылкой.

Стал пробовать 2-мя способами. С помощью консольной утилиты wget.exe и с помощью стандартных средств Windows.
В скрипте имеются 2 функции, которые по моим замыслам должны возвращать страницу с прямым линком на скачку. Какая функция сработает, зависит от флага (5 строка скрипта).
Помогите найти ошибку, не работает POST, не могу понять.

//Скрипт для автоматической скачки файлов с сервиса depositfiles.com
var WshShell=WScript.CreateObject("WScript.Shell");
 
sUrl = "http://depositfiles.com/files/8a6tif7hg";
flag = false; // или изменить на true

if (flag)
    {
        dload_with_wget (sUrl);
    }
    else
    {
        dload_with_ActiveXObject (sUrl);
    }


//Запрос страницы методом POST для дальнейшей обработки

//Функция 1. В системе должна быть установлена утилита для скачки файлов из интернета "wget.exe"
function dload_with_wget (URL)
    {
        var WshExec = WshShell.Exec('wget -O- -q --post-data="gateway_result=1" ' + URL);
        WScript.Sleep (1000);
        var TextStream = WshExec.StdOut;
        sOut = ""; str="";
        while (!TextStream.AtEndOfStream)
            {
                sOut += TextStream.ReadLine();
            }
    }

//Функция 2. Средствами операционной системы    
function dload_with_ActiveXObject (URL)
    {
        var oXMLHTTP = new ActiveXObject('Msxml2.XMLHTTP');
        oXMLHTTP.Open ("POST", URL, false);
        oXMLHTTP.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
        oXMLHTTP.setRequestHeader ("Content-Length", "16");
        oXMLHTTP.setRequestHeader ("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.7");
        oXMLHTTP.setRequestHeader ("Accept-Language", "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3");
        oXMLHTTP.setRequestHeader ("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10");
        oXMLHTTP.Send("gateway_result=1");
        sOut = oXMLHTTP.responseText;
    }
    
//В итоге в переменной sOut должна быть страница со ссылкой на скачку.
//Запускаем закачку файла
sLink = sOut.replace(/\r\n/g,"").replace(/.*<form action=\"([a-z0-9A-Z\/\.:_\-=]+)\" method=\"get\" onsubmit=\"download_started.*/, "$1");
WshShell.Exec('wget -c ' + sLink);

Если поможете решить проблему, то дальше напишу еще обработку которая бы проверяла возможность/невозможность скачать файл, ведение логов, чтение списка закачек из файла. Может быть какой-нибудь прогрессбар. Пока все это не пашет, дальше продолжать не имеет смысла.

Заранее благодарю.

Нас невозможно сбить с пути, нам пофигу куда идти.

2

Re: JScript: Автоматическая закачка файла с сервиса depositfiles.com

WGET
По поводу wget сказать не могу. Использую ее, но оправлять данные методом POST с ее помощью не пробовал еще. Попробуйте запустить руками без скрипта и ключа -q. Посмотрите, что она выводит, включите подробный вцывод работы программы.

ActiveX

oXMLHTTP.Open ("GET", URL, false);

А надо писать POST. Проверьте. Насколько правильно работает POST - я не помню. Надо экспериментировать.

( 2 * b ) || ! ( 2 * b )

3

Re: JScript: Автоматическая закачка файла с сервиса depositfiles.com

В тему: http://ru.savefrom.net/

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

4

Re: JScript: Автоматическая закачка файла с сервиса depositfiles.com

Rumata пишет:

WGET
По поводу wget сказать не могу. Использую ее, но оправлять данные методом POST с ее помощью не пробовал еще. Попробуйте запустить руками без скрипта и ключа -q. Посмотрите, что она выводит, включите подробный вцывод работы программы.

1)

c:\>wget -O output.html --post-data="gateway_result=1" http://depositfiles.com/files/8a6tif7hg
--2010-10-01 15:36:38--  http://depositfiles.com/files/8a6tif7hg
Resolving depositfiles.com... 78.140.171.124, 78.140.176.196, 78.140.176.197, ...
Connecting to depositfiles.com|78.140.171.124|:80... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: /ru/files/8a6tif7hg [following]
--2010-10-01 15:36:38--  http://depositfiles.com/ru/files/8a6tif7hg
Connecting to depositfiles.com|78.140.171.124|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `output.html'

    [  <=>                                  ] 15,763      41.1K/s   in 0.4s

2010-10-01 15:36:39 (41.1 KB/s) - `output.html' saved [15763]

2)

Rumata пишет:

А надо писать POST. Проверьте. Насколько правильно работает POST - я не помню. Надо экспериментировать..

Да вы правы. Просто я экспериментировал с кучей разных параметров, уже и GET втыкал, и POST и как вы видите, уже кучу заголовков всяких перепробовал. Все равно не получается.

Нас невозможно сбить с пути, нам пофигу куда идти.

5

Re: JScript: Автоматическая закачка файла с сервиса depositfiles.com

The gray Cardinal пишет:

В тему: http://ru.savefrom.net/

Про этот сайт я знаю. Но хочется своими силами, без всяких там сервисов. Есть еще более простой способ, это расширение для Firefox. Заходишь на страницу, оно сразу же "POSTит", и выдает ссылку на файл. Но эти методы требуют что бы я заходил на страницу.
А мне нужно просто запустить скрипт, и все. Тем более у меня есть доступ командной строке моего домашнего компьютера. Вот из нее и хотелось бы качать сразу на удаленный компьютер. А так же в depositfiles есть ограничение на скачку. Скачал 1 файл, сиди, жди n-ное время.

Нас невозможно сбить с пути, нам пофигу куда идти.

6

Re: JScript: Автоматическая закачка файла с сервиса depositfiles.com

DnsIs пишет:

Но эти методы требуют что бы я заходил на страницу.

Говорю наугад: просто может, можно сделать скрипт, который будет каким-то образом использовать не непосредственно депозит, а мой урл (или как-то совмещать использование).

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

7

Re: JScript: Автоматическая закачка файла с сервиса depositfiles.com

Парился я парился, хотел было уж плюнуть. Но потом Гугл рассказал про утилиту cURL. Качнул, оказалось что она таки очень правильно и корректно передает POST-запросы. Вот собственно и родился скрипт для закачки файлов с depositfiles.com

Работает так:

get.js [OPTION]... [URLs]
где
OPTOIN
-i FILE, ссылки на закачку будут браться из файла FILE
-P PREFIX, Сохранять файлы в директорию PREFIX\...
URL, Ссылки на закачку
Примеры:
get.js -i list.txt http://depositfiles.com/ru/files/8a6tif7hg
get.js http://depositfiles.com/ru/files/8a6tif7hg -P c:\downloads
get.js http://depositfiles.com/ru/files/1236tif7hg http://depositfiles.com/ru/files/8a61557hg -P downloads

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

//Скрипт для автоматической скачки файлов с сервиса depositfiles.com
var WshShell = WScript.CreateObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");


sLogFile = "dload.log";
sPathTocURL = "c:\\Programs\\cURL\\curl.exe";

sDirPrefix = "";
sListInputFile = "";
aListInputFile = "";

sArg = WScript.Arguments;
if (sArg.length==0)
    {
        eh ("Использование:\r\nget.js [OPTION]... [URLs]...\r\n\r\nOPTIONS\r\n\r\n-i FILE,\r\n    Загрузить список ссылок из FILE\r\n-P PREFIX,\r\n    Сохранять файлы в директорию PREFIX/...\r\nURLs,\r\n    Ссылки на страницы depositfiles.com\r\n\r\n\r\n\v.0.5");
        WScript.Quit();
    }

dStartTime = new Date();
SaveToLog("Старт: " + GetToday(dStartTime) + " " + GetTimeNow(dStartTime));
e  = new Enumerator(WScript.Arguments);
for (e.moveFirst(); !e.atEnd(); e.moveNext())
//Разбор аргументов коммандной строки
    {
        if (e.item()=="-P")
            {
                e.moveNext();
                if (e.item().indexOf(":")==-1)
                    {
                        s = WScript.ScriptFullName.replace(WScript.ScriptName,"") + "\\" + e.item() + "\\";
                    }
                else
                    {
                        s = e.item() + "\\";
                    }
                sDirPrefix = s.replace("\\\\","\\").replace(/\//g,"\\");
            }
        if (e.item()=="-i")
            {
                e.moveNext();
                if (fso.FileExists(e.item())) 
                    {
                        TextStream = fso.GetFile(e.item()).OpenAsTextStream(1)
                        sListInputFile += TextStream.ReadAll()+ "\r\n";
                    }
            }
        if (e.item().match(/http:\/\/depositfiles.com.*/)) sListInputFile+=e.item()+ "\r\n"
    }
sListInputFile=sListInputFile.replace(/com\/files/g,"com/ru/files")
aListInputFile = sListInputFile.split("\r\n");

if (!sDirPrefix)
    {
        sLogFile = WScript.ScriptFullName.replace(WScript.ScriptName,"") + sLogFile;
    }
else
    {
        sLogFile = sDirPrefix + sLogFile;
    }
//Основной цикл
for (i=0;aListInputFile.length-1>i;i++)
    {
        if (aListInputFile[i].match(/.*depositfiles.com.*/))
            {
                SaveToLog("Ссылка: " + aListInputFile[i]);
                sPage = LoadPage (aListInputFile[i]);
//Почему то не дают ссылку паразиты
                if (sPage.match("приносим свои извинения"))
                    {
                        SaveToLog("#3 Не удалось получить ссылку блин, передых 10 сек.");
                        while (sPage.match("приносим свои извинения"))
                            {
                                WScript.Sleep(10000);                            
                                sPage = LoadPage (aListInputFile[i]);
                            }
                        SaveToLog("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
                    }
//Скачивание уже идет. Вот те раз, как так?
                if (sPage.match("уже идет скачивание"))
                    {
                        s = sPage.replace(/.*class=\"ctable1left\".*class=\"ip\".*?<strong>(.*?)<\/strong>.*/, "$1").replace("<br>"," ");
                        SaveToLog("#1 " + s + "\r\nПробуем с интервалом в 30 сек.");
                        while (sPage.match("уже идет скачивание"))
                            {
                                WScript.Sleep(30000);                            
                                sPage = LoadPage (aListInputFile[i]);
                            }
                        SaveToLog("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
                    }
//Ну вот, накачались. Придется пожождать                
                if (sPage.match("исчерпали лимит подключений"))
                    {
                        s = sPage.replace(/.*<strong>(ВНИМАНИЕ!.*?)<\/strong>.*/, "$1").replace("через", "через ");
                        sTime=s.match(/\d{1,2}/g);
                        if (sTime.length>1)
                            {
                                nHour = sTime[0];
                                nMin = sTime[1];
                            }
                        else
                            {
                                nHour = 0;
                                nMin = sTime[0]
                            }
                        nTimeSleep = ((parseInt(nHour)*60+parseInt(nMin))*60000)+5000;
                        SaveToLog("#2 " + s);
                        SaveToLog("Спим " + nTimeSleep/60000 + " минут");
                        WScript.Sleep(nTimeSleep);
                        i--;
                    }
//Нет уже такого файла. Странно.
                if (sPage.match("файла не существует"))
                    {
                        s = sPage.replace(/.*no_download_msg\">(.*)<span class=\"html_download_api-not_exists.*/, "$1");
                        SaveToLog("#4 " + s);
                        SaveToLog("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
                    }
//Наконец то повезло
                if (sPage.match("download_url"))
                    {
                        sSize = sPage.replace(/.*class=\"info\">.*?<b>(.*?)<\/b>.*/, "$1").replace("&nbsp;"," ");
                        sLink = sPage.replace(/.*<form action=\"([a-z0-9A-Z\/\.:_\-=]+)\" method=.get. on.ubmit=.download_started.*/, "$1");
                        sFileName = sLink.replace(/.*\/(.*)/, "$1");
                        s = "Файл: " + sFileName + "\r\nРазмер: " + sSize + "\r\nПрямая ссылка: " + sLink;
                        SaveToLog("#5 " + s);
                        if (!fso.FileExists(sDirPrefix + sFileName)) 
                            {
                                d = new Date();
                                SaveToLog("Начали: "+ GetTimeNow(d));
                                WshShell.Run(sPathTocURL  + ' "' + sLink + '" --create-dirs -o "' + sDirPrefix + sFileName + '"',1, true);
                                SaveToLog("Закончили: "+ GetTimeNow(d));
                                SaveToLog("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
                            }
                        else
                            {
                                SaveToLog("#6 " + "Уже скачан. Внезапно?");
                                SaveToLog("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
                            }
                    }
            }
    }
dEndTime = new Date();
SaveToLog("Финиш: " + GetToday(dEndTime) + " " + GetTimeNow(dEndTime));
dAllTime = dEndTime - dStartTime;
SaveToLog("НА все провсе ушло: " + " " + dAllTime/1000 + " секунд");
SaveToLog("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
eh ("Все что можно, закачано!");

function LoadPage (file)
    {
        WshShell.Run(sPathTocURL + ' -d "gateway_result=1" -o page.htm ' + file, 0, true);
        f = fso.OpenTextFile ("page.htm", 1);
        sPage = f.ReadAll();
        f.Close();
        fso.DeleteFile("page.htm", 1);
        return StrConv(sPage.replace(/[\n\r\t]/g,""), "Windows-1251","UTF-8");
    }

function SaveToLog (text)
    {
        LogFile = fso.OpenTextFile(sLogFile, 8, true);
        LogFile.WriteLine(text);
        LogFile.Close();
    }

function StrConv(Text, SourceCharset, DestCharset)
    {
        var Stream = new ActiveXObject ("ADODB.Stream");
        Stream.Type = 2;
        Stream.Mode = 3;
        Stream.Open;
        Stream.Charset = SourceCharset;
        Stream.WriteText (Text);
        Stream.Position = 0;
        Stream.Charset = DestCharset;
        sStrConv = Stream.ReadText;
        return sStrConv;
    }
function GetToday (d)
    {
        var Day = d.getDate();
        var Month = d.getMonth();
        var Year =  d.getFullYear();
        if (Day<10) Day = '0'+Day;
        if (Month<10) Month = '0'+Month;
        return Day + "." + Month + "." + Year;
    }

function GetTimeNow (d)
    {
        var Hour = d.getHours();
        var Min = d.getMinutes();
        var Sec =  d.getSeconds();
        if (Hour<10) Hour = '0'+Hour;
        if (Min<10) Min = '0'+Min;
        if (Sec<10) Sec = '0'+Sec;
        return Hour + ":" + Min + ":" + Sec;
    }

function eh (text)
    {
        WScript.Echo(text);
    }

Скриптописатель из меня еще тот, поэтому не РЖАТЬ и не ОБЗЫВАТЬСЯ!
Кому будет не лень все это дело запустить, тыкайте в глюки. С радостью поисправляю. Ибо на ошибках учатся.
PS Требуется cURL, у меня он тут c:\Programs\cURL\cURL.exe
PSS В планах так же добавить сюда же рапиду, и Ютуб.

Нас невозможно сбить с пути, нам пофигу куда идти.

8

Re: JScript: Автоматическая закачка файла с сервиса depositfiles.com

DnsIs пишет:
The gray Cardinal пишет:

В тему: http://ru.savefrom.net/

Про этот сайт я знаю. Но хочется своими силами, без всяких там сервисов. Есть еще более простой способ, это расширение для Firefox. Заходишь на страницу, оно сразу же "POSTит", и выдает ссылку на файл. Но эти методы требуют что бы я заходил на страницу.
А мне нужно просто запустить скрипт, и все. Тем более у меня есть доступ командной строке моего домашнего компьютера. Вот из нее и хотелось бы качать сразу на удаленный компьютер. А так же в depositfiles есть ограничение на скачку. Скачал 1 файл, сиди, жди n-ное время.

В продолжение темы, возможно ли сделать скрипт который бы проверял есть ли такой файл и возможно ли его скачать, без скачки вывести в лог-файл:

К примеру есть ссылки:

http://depositfiles.com/ru/files/8a6tif7hg
http://letitbit.net/download/94351.936ef968477a15ec576b15280f97/Gerardo_Frisina_2003_ape.part1.rar.html
http://hotfile.com/dl/74383334/82d261a/Gerardo_Frisina_2003_ape.part2.rar.html
http://depositfiles.com/files/naezxolb

которые мы помещаем в link.txt.

Запускаем скрипт, который проверит доступность файлов и создаст лог-файл с текстом:

OK  http://depositfiles.com/ru/files/8a6tif7hg
OK  http://letitbit.net/download/94351.936ef968477a15ec576b15280f97/Gerardo_Frisina_2003_ape.part1.rar.html
OK  http://hotfile.com/dl/74383334/82d261a/Gerardo_Frisina_2003_ape.part2.rar.html
ERR http://depositfiles.com/files/naezxolb

9

Re: JScript: Автоматическая закачка файла с сервиса depositfiles.com

OFF:

DnsIs пишет:

Скриптописатель из меня еще тот, поэтому не РЖАТЬ и не ОБЗЫВАТЬСЯ!

Тем не менее, нужно быть готовым и к этому. Прямые личные оскорбления администрация старается пресекать, а вот подшутить и тут могут и умеют .

Ivan_Kinomanov, используйте тэг «url» для оформления ссылок на форуме. В данном же случае, судя по смыслу, надо оформлять тэгом «code». Я исправил.

10

Re: JScript: Автоматическая закачка файла с сервиса depositfiles.com

Ivan_Kinomanov пишет:

В продолжение темы, возможно ли сделать скрипт который бы проверял есть ли такой файл и возможно ли его скачать, без скачки вывести в лог-файл

Вот накидал вечерком. Как то так.
Для правильной работы нужно ОБЯЗАТЕЛЬНО заполнить sFileWithLinks и sLogFile, как у меня в примере. НЕ стал сюда пихать разбор строки, ибо нашел глюки в своем варианте. Ну общий смысл думаю ясен. Еще бы посмотреть бы на несуществующие ссылки ресурсов hotfile и letitbit, что бы правильно задать регулярные выражения.

Файл testLinks.js

var WshShell = WScript.CreateObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");

//ЗАПОЛНИТЬ======

//Файл со ссылками
sFileWithLinks = "i:\\scripts\\list.txt";
//Куда писать лог
sLogFile = "c:\\dload.log";

//==============


sListInputFile = "";
aListInputFile = "";

if (fso.FileExists(sFileWithLinks)) 
    {
        TextStream = fso.GetFile(sFileWithLinks).OpenAsTextStream(1);
        sListInputFile = TextStream.ReadAll()+ "\r\n";
    }

sListInputFile = sListInputFile.replace(/depositfiles\.com\/files/g,"depositfiles.com/ru/files");
aListInputFile = sListInputFile.split("\r\n");

//Основной цикл
for (i=0;aListInputFile.length-1>i;i++)
    {
        sPage = dload_with_ActiveXObject(aListInputFile[i]);
        if (aListInputFile[i].match("depositfiles"))
            {if (sPage.match("Среднее время скачивания в")) {f=true} else {f=false};}
        if (aListInputFile[i].match("hotfile.com"))
            {if (sPage.match("download_file")) {f=true} else {f=false};}
        if (aListInputFile[i].match("letitbit"))
            {if (sPage.match("Файл::")) {f=true} else {f=false};}
        switch (f)
            {
                case true:
                    SaveToLog("OK  " + aListInputFile[i]);
                    break;
                case false:
                    SaveToLog("ERR " + aListInputFile[i]);
                    break;
            }
    }

function dload_with_ActiveXObject (URL)
    {
        var oXMLHTTP = new ActiveXObject('Msxml2.XMLHTTP');
        oXMLHTTP.Open ("GET", URL, false);
        oXMLHTTP.Send();
        return oXMLHTTP.responseText;
    }

function SaveToLog (text)
    {
        LogFile = fso.OpenTextFile(sLogFile, 8, true);
        LogFile.WriteLine(text);
        LogFile.Close();
    }
Нас невозможно сбить с пути, нам пофигу куда идти.