Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужен код интернет-страницы задавая ссылку этой страницы


Muhan ©   (2004-12-14 02:00:00) 

Помогите написать функцию чтобы, по данной ссылке прога выдавала код данной страницы.
Я нашел функцию(ниже) на страницах инета, так вот проблема в том, что когда скачивается файл с кодом страницы, вместо кода выдает
"ссылка устарела", хотя на самом деле это не правда...
Мне сказали что этот фрагмент скачивает страничку как файл просто, и не правильно качает потому что скрипт переадресует на другую страрницу. Посоветовали получить код через прямое общение с сервером...не знаю как, помогите плиз :) очень надо стараюсь на благо многих людей :)
Спасибо заранее..

uses Wininet;

function GetInetFile(const fileURL, FileName: String): boolean;
const BufferSize = 1024;
var hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
sAppName: string;
begin
 Result:=False;
 sAppName := ExtractFileName(Application.ExeName);
 hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
       nil, nil, 0);
 try
    hURL := InternetOpenURL(hSession,
    PChar(fileURL),nil,0,0,0);
    try
       AssignFile(f, FileName);
       Rewrite(f,1);
       repeat
          InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
          BlockWrite(f, Buffer, BufferLen)
       until BufferLen = 0;
       CloseFile(f);
       Result:=True;
    finally
    InternetCloseHandle(hURL)
    end
 finally
 InternetCloseHandle(hSession)
 end
end;


Seeker   (2004-12-21 10:23:00) [1]


> Muhan ©

Я тут открыл(несколько раз) ссылку которую ты мне присылал с помощью привеленного мной кода(см выше),так все открывается нормально,ни каких тебе проблем с устаревшей ссылкой.
на всякий случай, попробуй взять HTTP-клиента отсюда:
http://www.badfan.com/delphi/TIE_http_https_build_044.zip
Описание можно почитать сдесь:
http://www.badfan.com/delphi/tie_http_https.html
C помощью него я тоже открывал без проблем.


> Cam73 ©
Вчем проблемма, в приведенном коде замени
function GetUrl(const URL: String): String;
на procedure GetUrl(const URL: String);
обьяви глобальную переменную типа string или TStringList и подставь ее вместо result в процедуре GetUrl, кинь на форму таймер и в обработчике OnTimer анализируй эту переменную.


Cam73   (2004-12-20 04:59:00) [2]

а у меня другая проблема:
я качаю хтмл с помощью
nmhttp1.body:='1.html';
nmhttp1.InputFileMode:=true;
nmhttp1.get('www.server.ru/example.html');

Всё бы работало, НО... example.html - большого размера файл.
А мне его содержимое надо получить уже в процессе его скачивания.
Как быть? Пишите плиз на мыло. Спасибо :)


Muhan   (2004-12-18 18:21:00) [3]

я прошу помощи с Хттп клиентом...и мне не нужен Вининет...


Seeker   (2004-12-18 11:29:00) [4]

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


Muhan   (2004-12-17 20:52:00) [5]

ну так и что делать?


DiamondShark   (2004-12-16 14:57:00) [6]

Ну правильно. Устарела ссылка.
Сервер возвращает ответ-редирект и краткий описательный контент.
В http-заголовке Location сервер указывает новый адрес.


Muhan   (2004-12-16 04:08:00) [7]

не работает..ссылка устарела :(


seeker   (2004-12-15 10:01:00) [8]


if not (HttpAddRequestHeaders(FRequest, PChar(Ansi), Length(Header),
                                    HTTP_ADDREQ_FLAG_REPLACE or
                                    HTTP_ADDREQ_FLAG_ADD)) then Exit;

Во первых тут ошибочка.Нужно заменить Header на Ansi(исправлял глюки и пропустил).
Во вторых,тяжело читать мыси.Еслиб я знал где происходит дело,возможно я смог бы помочь.Наверное тебе нужно поэксперементировать с флагами.


Muhan   (2004-12-15 09:51:00) [9]

Как обойти этот скрипт? Помогите!


Muhan   (2004-12-15 09:47:00) [10]

Нет, вру :(
Опять таже фигня :( что же ты будешь делать :(
ссылка устарела!!!
переадресует на другую страницу :( где заведомо написано ссылка устарела!


Muhan   (2004-12-15 09:42:00) [11]

Спасибо большое все работает:))


Muhan   (2004-12-15 09:25:00) [12]

Да я имею ввиду хтмл код!!

какие библиотеки надо использовать??
в данном примере?


seeker   (2004-12-14 09:30:00) [13]

Не пойму что значит код страницы,наверно HTML код,попробуй следующий код:

function DelHttp(URL: String): String;
var
Index:integer;
begin
 Index:=Pos('://', URL);
 if Index > 0 then Delete(Url, 1, Index+2);
 Result := Copy(Url, 1, Pos('/', Url) - 1);
 if Result = '' then Result := URL;
end;

function GetUrl(const URL: String): String;
var
 FSession, FConnect, FRequest: HINTERNET;
 FHost, FScript: String;
 Ansi: PAnsiChar;
 Buff: array [0..1023] of Char;
 BytesRead: Cardinal;
begin
 Result := '';
  FHost := DelHttp(Url);
 FScript := Url;
 Delete(FScript, 1, Pos(FHost, FScript) + Length(FHost));
 FSession := InternetOpen('DMFR', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
 if not Assigned(FSession) then Exit;
 try
     FConnect := InternetConnect(FSession, PChar(FHost), HTTP_PORT, nil,
                               'HTTP/1.0', INTERNET_SERVICE_HTTP, 0, 0);
   if not Assigned(FConnect) then Exit;
   try
     FillChar(Ansi, SizeOf(''), 0);
     FRequest := HttpOpenRequest(FConnect, 'GET', PChar(FScript), 'HTTP/1.0',
                                 '', @Ansi, INTERNET_FLAG_RELOAD, 0);
     if not Assigned(FConnect) then Exit;
     try
       Ansi := 'Accept: text/*'+#13#10+Header;
       if not (HttpAddRequestHeaders(FRequest, PChar(Ansi), Length(Header),
                                     HTTP_ADDREQ_FLAG_REPLACE or
                                     HTTP_ADDREQ_FLAG_ADD)) then Exit;
       if not (HttpSendRequest(FRequest, nil, 0, nil, 0)) then Exit;
       FillChar(Buff, SizeOf(Buff), 0);
       repeat
         Result := Result + Buff;
         FillChar(Buff, SizeOf(Buff), 0);
         InternetReadFile(FRequest, @Buff, SizeOf(Buff), BytesRead);
       until BytesRead = 0;
     finally
       InternetCloseHandle(FRequest);
     end;
   finally
     InternetCloseHandle(FConnect);
   end;
 finally
   InternetCloseHandle(FSession);
 end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо