Помощь - Поиск - Пользователи - Календарь
Полная версия: Вопрос работа с http
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Unconnected
Привет всем. Возникла такая задача - нужно научить прогу скачивать файл с файлообменника. И всё бы хорошо, делать это я умею (да и гугл знает), если есть конкретная ссылка на файл, а на нужном файлообменнике (depositfiles.com, да он и не один такой) сначала нужно подождать 60 сек, а потом уже дадут ссылку. И я вот не знаю, как вообще этот механизм работает и как с ним взаимодействовать. Так понял, там скрипт крутит счетчик, и в нужный момент запрашивает ссылку, что ли, и отображает.. как это дело парсить (или что с ним делать вообще wacko.gif )?
volvo
Un, ты меня удивляешь smile.gif У тебя браузер какой? FF? Тогда берешь расширение HttpFox, и смотришь, что и как браузер посылает сайту при переходе к скачиванию файла, и что получает назад при окончании ожидания.

Вот как-то так оно выглядит:
Unconnected
Да сниффил поначалу, сторонней прогой, но потом решил, что спросить будет надежней)
Так.. ну, по чему ориентироваться, понятно, передаётся код кнопки:
Цитата

<form action="http://fileshare289.depositfiles.com/auth-129934243402395ccd7ecf0e1b2b482b-**********-6211454469-79545849-guest/FS289-3/______________________________________________.txt" method="get" onSubmit="download_started();


, но - как дать скрипту понять, что его исполнения "кто-то ждёт", смотрит на таймер, то есть это типа в браузере всё происходит.. или достаточно просто из делфей послать запрос "нажатие на кнопку "бесплатно" и ждать минуту, и нужный пакет всё равно придёт?

Или, быть может, имелось в виду то, что можно сразу серверу послать, что таймер отработал, и он ссылку без боя отдаст?)
volvo
Без боя не отдаст. Там вся игра должна происходить с TIdMultiPartFormDataStream (оно в модуле IdMultipartFormData, не забудь подключить). То есть, если ты делаешь так:
      IdHTTP1.Request.ContentType :='multipart/form-data';
IdHTTP1.HandleRedirects := True;
// Тут может понадобиться еще установить поля IdHTTP1.Request по аналогии с теми, которые шлет браузер

mpFormDS := TIdMultiPartFormDataStream.Create;
mpFormDS.AddFormField ('submit', 'Бесплатно'); // Имитация нажатия на кнопку "Халява" : )
, а потом посылаешь
      IdHTTP1.Post(myURL, mpFormDS); // шлем запрос по адресу с параметрами
, то он будет означать не только открыть страницу, а еще и нажать на кнопку, означенную в mpFormDS. Ну, а дальше - подождать редиректа и выдернуть адрес - это дело техники. Вот только проверить я это не могу, у меня 2009, а там, блин, с кодировками в Инди все не просто плохо, а очень плохо. Отошлётся какая-то белиберда, и кнопка не нажмётся... Эх, почему она по-русски названа? Было бы латинскими буквами - проблем бы не было. Может, ранние версии и сработают, семерка, например.

Ссылка в тему: тут
Unconnected
Короче сделал всё по инструкции (кстати, вот интересный блог, где программист Маша рассказывает про http и как с ним работать), пока в тестовой проге:

procedure TForm1.Button1Click(Sender: TObject);
var mpFormDS:TIdMultiPartFormDataStream;
begin
with idhttp1 do begin
HandleRedirects:=true;
IdHTTP1.Request.ContentType :='multipart/form-data';
request.UserAgent:=usag[random(u-1)+1];//тут куча юзер-агентов
end;
mpFormDS := TIdMultiPartFormDataStream.Create;
mpFormDS.AddFormField('submit','Бесплатно');
IdHTTP1.Post('http://depositfiles.com/ru/files/yu3qmo80r', mpFormDS);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.text:=idHttp1.Response.RawHeaders.GetText;
end;


Обновил, кстати, Indy до 10й версии - думал, начнёт работать в паре с KOL-ом, ан нет, не шмогла, AV был непобедим.. dry.gif ((
На событие OnRedirect поставил окошко Showmessage, но через минуту оно не выпрыгивает. Верно делаю? Запрос вроде нормальный уходит:

Нажмите для просмотра прикрепленного файла
volvo
Цитата
На событие OnRedirect поставил окошко Showmessage, но через минуту оно не выпрыгивает.
Попробуй чуть по-другому: ты в результате посылки своего POST-запроса получаешь страничку от сервера со временем = 60 сек? Если все в порядке - должен получать, я проверил на англоязычной версии Депозита (запихал ответ в html-файл, и открыл в браузере). В ней смотри, там должна быть строка такого вида:

$('#download_container').load('/get_file.php?fid=7fa2e25276abcbf6ebb746300c90cc0e');

Вот то, что выделено - тебе нужно. Добавляешь перед этим еще и хост (hТТp://depositfiles.com/ru), и высылаешь серверу еще одним POST-запросом. Угадай, что получишь в ответ? smile.gif
Unconnected
Да, получаю страницу со временем, вытаскиваю ID, шлю так:

var s:string;
d:TStringList;
...
s:=copy(memo1.text,pos('/get_file.php?fid',memo1.text),50);
d:=tstringlist.Create;
d.Add(s);
memo1.text:=idhttp1.Post('http://depositfiles.com/ru',d);



, и даже происходит редирект (событие срабатывает), но приходит код главной страницы) Или, может, в нем спрятана как раз нужная ссылка? fileid вытаскивается норм, проверял, длина 32 символа(с приставкой - 50)..

added: сейчас заметил, что "get_file" встречается в странице с таймером дважды, но там одно и то же, да и нужная идет раньше, pos её возьмет..
volvo
Не, не так. Смотри:

function Get_Address (s : string) : string;
var
P_Start, P_Finish : Integer;
begin
P_Start := Pos('/get_file.php?fid=', s);
P_Finish := PosEx('''', s, P_Start);

result := 'http://depositfiles.com/ru' + Copy(s, P_Start, P_Finish - P_Start);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
mpFormDS : TIdMultiPartFormDataStream;
My_URL, st:string;
first_Ans : String;
begin
try
IdHTTP1.Request.ContentType := 'multipart/form-data';
IdHTTP1.HandleRedirects := true;
mpFormDS := TIdMultiPartFormDataStream.Create;
mpFormDS.AddFormField('submit', 'FREE downloading'); // Имитация нажатия на кнопку "Халява" : )

MyURL := Edit1.Text;
First_Ans := IdHTTP1.Post(MyURL, mpFormDS); // Первый ответ, его будем парсить для "fid="
Sleep(1000); // Чуть-чуть подождать
Memo1.Text := First_Ans; // Показать, что взяли

// Теперь ждем минимум 60 сек. Я сделал по-наглому:
Sleep(65000);
// Можешь просто повесить на таймер, можешь другим потоком ждать

// Ага, прошли 60 сек. Что дальше? А вот что:
st := IdHTTP1.get(Get_Address(first_Ans)); // Получаем ответ сервера на GET-запрос (не POST)
memo1.Lines.Add('GET:');
memo1.Lines.Add(st);

mpFormDS.Free;
except
// Сообщаем об ошибке
Form1.Caption := 'Error';
end;
end;


Вот чего я наблюдаю в Мемо:
Цитата
GET:
<form action="http://fileshare177.depositfiles.com/auth-12994305304167710eedc23c832841b4-109.66.201.115-624149232-34756774-guest/FS177-9/cs16full.exe" method="get" onSubmit="download_started();show_begin_popup(0);">
<input class="download" value="Скачать файл" type="submit"/>
</form>

Ну, что с этим делать - разберешься, я думаю... Кракозябры - из-за кодировки, я предупреждал.
Unconnected
Ураа, заработало smile.gif) Я сначала и Get-ом тоже пробовал, без ожидания правда - вываливалась ошибка. Спасибо! good.gif
Unconnected
Ааа блин, щас с ума сойду wacko.gif На второй день охоты поймал невероятный баг: если вставить в тестовую прогу ссылку руками (например, эту: http://depositfiles.com/files/yu3qmo80r) - качает! А если получить ссылку с сервера, раскодировать base64 и расшифровать - не качает! После этих манипуляций линк вполне нормальный, ни лишних пробелов, ничего, вот, копирую: http://depositfiles.com/files/x3eh8al4e, и при вставке в адресную строку замечательно качает..
volvo
Не понял... Что куда ты вставляешь? Вот я сейчас взял твою вторую ссылку, программа (из сообщения №8) вытянула из неё прямую ссылку на файл: _http://fileshare272.depositfiles.com/auth-1300129354687f4cb6f23c23f505a8ea-109.66.201.115-655468324-80478446-guest/FS272-2/Konstantion_-_Inspiration_broning_remix.mp3 Что дальше делать с этим? Как убедиться, что "не качает!"? Ибо беру, вставляю в адресную строку - все замечательно скачивается. Так что надо сделать?
Unconnected
А, чёрт... вот же, совсем забыл про ограничения на подключения. Сейчас залез - а мой ip там ждёт 21 минуту. А то я уж не знал, что делать, не приходил этот fid, и всё тут. И так совпадало, что на ручные ссылки лимит был, а на получаемые - кончался) Ну ничего, сейчас включю впн-клиент..
Unconnected
И ещё - просто может пригодится кому-нибудь - частично проблема заключалась в том, что в последней ссылке не было заветного RU(на чём завязано всё): http://depositfiles.com/RU/files/x3eh8al5e
Unconnected
Принимается, как видно в правом окне, два печенья.. Кинул на форму CookiesManager, связал его с TIdHttp, Allowcookies:=true, и теперь надо в дальнейшем в одном запросе подставлять одно печенье, а в другом - другое. Короче, оба использовать. Как их устанавливать так, сначала одно, потом другое? И да, почему-то в поле collections только одно наблюдается..

В принципе, можно в текстовом виде оба печенья вытащить из CommaText и потом подставлять, да? Можно наверное менеджер и не использовать, хост я и так знаю, да ещё там вроде проблемы всякие бывают..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.