Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2010, 22:35   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Злость Скачать файл с lоstfilm

Сайт: lostfilm.tv
Цель: скачать файл
стоит Delphi2010

Авторизация удачно проходит, а вот скачивать не желает. Качает нулевого размера файл. Это в связи с изменениями на сайте, перестала работать закачка.
Реферер устанавливается, тот на странице которого находится закачиваемый файл. Кукис, который устанавливается браузером при клике мышью по ссылке, ставится.

Начальные условия:
Код:
const
 FHost = 'lostfilm.tv';
 FRefer = 'http://lostfilm.tv/';
//.............
 Http_.HTTPOptions := [hoInProcessAuth, hoForceEncodeParams];
 With Http_.Request do
 begin
   Host := FHost;
   Referer := FRefer;
   UserAgent := 'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.6.30 Version/10.63';
   Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
   AcceptLanguage := 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3';
   AcceptEncoding := 'gzip,deflate';
   AcceptCharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7';
   Connection := 'keep-alive';
 end;
Загрузка файла:
Код:
function LoadFile(Url, SavPath: string; Refer :string): Integer;
var
  Fs :TFileStream;
begin // загрузка файла
 // -2 = Server File Error; -1 = URL Empty; 0 = Local File Error;
 // 1 = OK;
  Result := -1;
 if (Trim(URL)='') then Exit;
  Result := 1; // OK
  try
     Try
 if FileExists(SavPath) then
   Fs := TFileStream.Create(SavPath, fmOpenWrite)
 else
   Fs := TFileStream.Create(SavPath, fmCreate);
     Except
      Result := 0; // ошибка создания/доступа к файлу
     End;
     Try
   // закачка
 if Trim(Refer) <> '' then
  FHttp.Request.Referer := Refer;
 FHttp.Get(FUri.URLEncode(Url), Fs);
     except
      Result := -2; // ошибка доступа к файлу на сервере
     end;
  finally
 FreeAndNil(Fs);
  end;
end;
Получение кукиса для скачиваемого файла(оно работает, значения нормально извлекает):
Код:
function ExtractCookieValue(Url, FileName: string): string;
var
  P :TParses_;
  InpText :string;
  Lst :TStrings;
  I,II :Integer;
  Buf :string;
  FileLink :string; // ссылка на файл
  CookieExtTxt :string; // не отформатированный текст кукиса
begin  // выдаёт значение кукиса файла
 Result := '';
 if (Url = '')or(FileName = '') then
  Exit;
 Lst := TStringList.Create;
 P := TParses_.Create;
  try
  // HTML текст целевой страницы
 InpText := HttpGet(Url);
  // Тег со всеми ссылками на серии | <div class="mid">
 InpText := P.FindTagTextParam(InpText,
                               FTagCookieMid[0],
                               FTagCookieMid[1],
                               False);
  // Тег скачивания серии | <td width="60" align="right">
 P.FindTagText(InpText,
               FTagCookieSeries[0],
               FTagCookieSeries[1],
               Lst,
               1,
               False);
 InpText := Lst.Text;
 Lst.Clear;
  // Тег с ссылкой серии | <a
 P.FindTagText(InpText,
               FTagCookieA[0],
               FTagCookieA[1],
               Lst,
               1,
               False);
  // ищем нужное
 II := Lst.Count;
 if II > 0 then
 begin
   for I := 0 to II - 1 do
   begin
    FileLink := '';
    CookieExtTxt := '';
    Buf := Lst.Strings[I];
     // ссылка с именем файла
    FileLink := P.FindTagTextParam(Buf,
                                   FTagCookieHref[0],
                                   FTagCookieHref[1],
                                   False);
     // текст извлекаемого кукиса
    CookieExtTxt := P.FindTagTextParam(Buf,
                                       FTagCookieText[0],
                                       FTagCookieText[1],
                                       False);
    CookieExtTxt := Trim(CookieExtTxt);
     //
    if MatchesMask(FileLink, '*' + FileName) then
    begin
     if Pos(FTagCookieQuote, CookieExtTxt) >= 1 then
     begin
       // "', '" -> "="
      CookieExtTxt := StringReplace(CookieExtTxt,
                                    FTagCookieQuote + ','+ FTagCookieQuote,
                                    '_2=',
                                    [rfReplaceAll]);
       // "'" -> ""
      CookieExtTxt := StringReplace(CookieExtTxt,
                                    FTagCookieQuote,
                                    '',
                                    [rfReplaceAll]);
     end;
     Result := Result + CookieExtTxt;
     Break;
    end;
   end;
 end;
  //
  finally
 Lst.Clear;
 FreeAndNil(Lst);
 FreeAndNil(P);
  end;
end;
...
Alter вне форума Ответить с цитированием
Старый 16.12.2010, 22:35   #2
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

...

Добавление извлеченного кукиса в заголовок idHttp Request(после вызова LoadFile из заголовка исчезает. Может так и надо):
Код:
const
 FCookieKey = 'Cookie:';
// ........
procedure AddHeadHttpCookie(NameValue: string);
var
  ReqHeadTxt :TStrings; // весь заголвок запроса
  Buf :string;
  CookieItemIndex :Integer; // стркоа заголовка, с кукисами
  A,B,L :Integer;
  I,II :Integer;
begin // Request Head | FCookieKey
 if not Assigned(FHttp) then
  Exit;
   //
 ReqHeadTxt := TStringList.Create;
  try
   // копируем исходный заголовок
 ReqHeadTxt.AddStrings(FHttp.Request.RawHeaders);
   // ищем строку с кукисом
 CookieItemIndex := -1;
 II := ReqHeadTxt.Count;
 if II > 0 then
 for I := 0 to II - 1 do
 if MatchesMask(ReqHeadTxt.Strings[I], FCookieKey + '*') then
 begin
   CookieItemIndex := I;
   Break;
 end;
   // берём исходную строку
 Buf := ReqHeadTxt.Strings[CookieItemIndex];
 Buf := Trim(Buf);
   // добавим разделитель
 if Buf[Length(Buf)] <> ';' then
  Buf := Buf + ';';
  // добавим текст кукиса
 Buf := Format('%s %s', [Buf, NameValue]);
  // назад в заголовок
 FHttp.Request.RawHeaders.Strings[CookieItemIndex] := Buf;
  finally
 ReqHeadTxt.Clear;
 FreeAndNil(ReqHeadTxt);
  end;
end;
Добавление кукиса в кукименеджер(в кукименеджере они нормально держаться):
Код:
procedure AddCookie(NameValue, Domain: string);
var
  Buf :string;
begin // Add Cookie
 if Assigned(FHttp) then
 if Assigned(FHttp.CookieManager) then
 begin
  Buf := AnsiLowerCase(Format('%s; path=/; domain=%s', [NameValue, Domain]));
  FHttp.CookieManager.CookieCollection.AddSrcCookie(Buf);
 end;
end;
В response headers у IdHttp нет phpbb2mysql_data и phpbb2mysql_sid.

Уже и не знаю что сделать. Нуждаюсь в помощи.
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скачать файл с интернета? Hichigo Общие вопросы C/C++ 1 25.04.2011 20:15
Скачать файл... Romix Работа с сетью в Delphi 1 28.07.2010 09:37
Как скачать файл?! $T@LKER Работа с сетью в Delphi 6 06.05.2010 10:23
Скачать файл из архива pesi Работа с сетью в Delphi 4 29.09.2009 21:28
Скачать файл по url .::EvGenius::. Общие вопросы C/C++ 1 11.04.2009 23:59