Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > IdHTTP переадресация. Как получить ссылку?


Автор: upload 22.5.2009, 19:14
Есть ссылка: http://www.site.com/watch/325587/good_flv_rolik/

На странице есть кнопка download.
При нажатии идет запрос:
Код

http://download.site.com/download/330760/flv/327464_good_flv_rolik.flv?download=1&ll=1&t=dd


При помощи снифа выяснил что затем идет переадресация на:
Код

http://server434.files.site.com/e4/flv/327464_good_flv_rolik.flv?e=1245598957&h=c8f2600853b46d6c9141fcfad4468bd8

И начинается загрузка ролика (в браузере)

Вопрос: как получить эту самую ссылку после переадресации? Сам ролик скачивать не надо. Только ссылку.

1. Что только не перепробовал. Пока не выходит.

Код

IdHTTP.get('http://download.site.com/download/330760/flv/327464_good_flv_rolik.flv?download=1&ll=1&t=dd');
link:=Idhttp.Response.Location;


Проблема в том, что начинается загрузка ролика и пока она не закончится Idhttp.Response.Location не сработает.

2. У IdHTTP есть событие OnRedirect. Если там написать:
Код

memo1.Text:= IdHTTP.Response.Location;

То в memo1 появляется ссылка на которую переадресовывает, но ЗАГРУЗКА ПРОДОЛЖАЕТСЯ.
Мне нужна только ссылка. 

Пробовал
Код

IdHTTP.Disconnect;
// и
IdHTTP.DisconnectSocket;
// и
IdHTTP.Destroying;

Безполезно. ЗАГРУЗКА так и идет (снифом смотрю). Как быть?

Добавлено через 8 минут и 18 секунд
Код

  IdHTTP.HandleRedirects:=false;
  IdHTTP.get(DownloadUrl);
  Link:= IdHTTP.Response.Location;
  memo1.Text:=Link;


Ошибка на Link:= IdHTTP.Response.Location;

Автор: SneG0K 22.5.2009, 19:51
Тебе надо определить, как идет переадресация. Возможно она идет через скрипт, тогда найди скрипт и пропарсь адресс

Автор: MetalFan 22.5.2009, 20:31
Цитата(upload @  22.5.2009,  19:14 Найти цитируемый пост)
Ошибка на Link:= IdHTTP.Response.Location; 

и какая же ошибка?

по идее, при HandleRedirects = false Get или Post должны выкидывать исключение, которое нужно поймать и обработать.
как то так:
Код

 try
...
    AResponse := FIdHTTP.Post( AURL, AData );
  except
...
   on E: EIdHTTPProtocolException do
     if (E.ErrorCode = 302) or
        (E.ErrorCode = 301) then
     begin
       lRedirectUrl := FIdHTTP.Response.Location;
     end
...

в ином случае скорее всего происходит то, что предположил SneG0K

Автор: upload 22.5.2009, 20:41
Цитата(SneG0K @ 22.5.2009,  19:51)
Тебе надо определить, как идет переадресация. Возможно она идет через скрипт, тогда найди скрипт и пропарсь адресс

Нет, не через скрипт. Напрямую.

user posted image

Добавлено через 12 минут и 53 секунды
Я смысл понял. Только вот не пойму почему

user posted image

Автор: MetalFan 22.5.2009, 20:57
этот код не помню под какую версию... то ли 9ка то ли 10ка.
посмотри поля класса EIdHTTPProtocolException... может там по-другому называется это поле.

Автор: upload 22.5.2009, 20:59
Может unit какой добавить? Попробовал ScktComp - не помогло.

Добавлено через 13 минут и 29 секунд
Так заработало:

Код

IdHTTP.HandleRedirects:=false;
    try
      IdHTTP.get(DownloadUrl);
    except
    on E: EIdHTTPProtocolException do
     begin
     {if (E.ErrorCode = 302) or
        (E.ErrorCode = 301) then
     begin }
     Link:= IdHTTP.Response.Location;
     memo1.Text:=Link;
     //end;
     end;
     end;
 end;
end;


Ладно, оставлю так. Но всё равно странно. Почему ErrorCode он не знает.

Автор: MetalFan 22.5.2009, 21:30
Ctrl+Click может глянешь?  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)