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

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

Подмена картинок на форуме


MVP ©   (2006-04-03 01:22:00) 

Вот смотрите, есть форум. На нем большое количество разнообразных картинок. Каков принцип написания клиента, который бы хранил форумовские картинки на стороне клиента. То есть картинки бы грузились со стороны клиента, а не загружались со стороны сервера, тем бы самым уменьшался траффик. Как это всё может реализовываться, каковы принципы, где можно про такое почитать?


Rouse_   (2006-04-07 17:54:00) [1]

какой из них? :)


Arazel   (2006-04-07 10:43:00) [2]

Rouse_ ©   (05.04.06 09:53) [12]
Чет код не компелируетсЯ на DELPHI6?


MVP   (2006-04-06 12:12:00) [3]

понял, спрошу ;) спасибо тебе большое, просветил неука ;)


Rouse_   (2006-04-06 11:30:00) [4]

В интернете :) Спроси у яндекса...


MVP   (2006-04-06 11:28:00) [5]

EmbeddedWB а где есть такое?


Rouse_   (2006-04-06 09:45:00) [6]


> И ещё вопрос по поводу TWebBrowser, насколько он хорош,
> есть ли какая-то лучшая ему альтернатива. И как с ним работать
> на примерах, сели можно ссылку )

Есть EmbeddedWB, он наиболее полно реализует интерфейс браузера.


> и ещё вопрос, при нажатии на ссылку в веббраузер, он её
> через ИЕ открывает, можно в WebBrowser сделать как-то закладки
> типа МайИЕ

Обрабатывай OnNewWindow2


MVP   (2006-04-06 02:54:00) [7]

и ещё вопрос, при нажатии на ссылку в веббраузер, он её через ИЕ открывает, можно в WebBrowser сделать как-то закладки типа МайИЕ


MVP   (2006-04-05 22:08:00) [8]

И ещё вопрос по поводу TWebBrowser, насколько он хорош, есть ли какая-то лучшая ему альтернатива. И как с ним работать на примерах, сели можно ссылку )


Rouse_   (2006-04-05 09:53:00) [9]

Работает очень просто - скрипту отправляется GET запрос и производишь разбор информации.
Так к примеру получаем список конференций данного форума:

function DelHttp(URL: String): String;
begin
 if Pos('http://', URL) > 0 then Delete(Url, 1, 7);
 Result := Copy(Url, 1, Pos('/', Url) - 1);
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));

 // Инициализируем WinInet
 FSession := InternetOpen('DMFR', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
 if not Assigned(FSession) then
 begin
   ReportString := 'Unable to initialize Wininet';
   Synchronize(Error);
   Exit;
 end;
 try
   // Попытка соединения с сервером
   FConnect := InternetConnect(FSession, PChar(FHost), HTTP_PORT, nil,
                               'HTTP/1.0', INTERNET_SERVICE_HTTP, 0, 0);
   if not Assigned(FConnect) then
   begin
     ReportString := 'Unable to connect to server!';
     Synchronize(Error);
     Exit;
   end;
   try
     // Подготавливаем запрос страницы
     Ansi := 'text/*';
     FRequest := HttpOpenRequest(FConnect, 'GET', PChar(FScript), 'HTTP/1.0',
                                 '', @Ansi, INTERNET_FLAG_RELOAD, 0);
     if not Assigned(FConnect) then
     begin
       ReportString := 'Unable to request page!';
       Synchronize(Error);
       Exit;
     end;
     try
       // Добавляем заголовки
       if not (HttpAddRequestHeaders(FRequest, Header, Length(Header),
                                     HTTP_ADDREQ_FLAG_REPLACE or
                                     HTTP_ADDREQ_FLAG_ADD)) then
       begin
         ReportString := 'Unable add headers/form info.';
         Synchronize(Error);
         Exit;
       end;
       // Отправляем запрос
       if not (HttpSendRequest(FRequest, nil, 0, nil, 0)) then
       begin
         ReportString := 'Unable send reqest.';
         Synchronize(Error);
         Exit;
       end;
       // Получаем ответ от форума
       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;


Пример использования: ShowMessage(GetUrl(' http://www.delphimaster.ru/cgi-bin/client.pl?getforums=1'));

> Document: IHtmlDocument2;
Это интерфейс IHtmlDocument2 - смотри подробности в MSDN


MVP   (2006-04-05 00:48:00) [10]

Document: IHtmlDocument2;
а что это такое?


MVP   (2006-04-04 22:41:00) [11]

Ну а как работает такой клиент и сервер. Может есть где почитать. И есть ли смысл его использовать.


Rouse_   (2006-04-04 12:20:00) [12]

Ну вот смотри, вот если ты пойдешь по этой ссылке
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1144012942&n=4
то ты получишь то что сейчас видишь, со всеми картинками и т.п.
А если пойдешь по вот этой ссылке:
http://www.delphimaster.ru/cgi-bin/client.pl?getconf=1144012942&n=4&from=0&to=-1
то получишь обычное текстовое содержание ветки.

Информацию по второй ссылке тебе отдает специальный скрипт на нашем сервере, по аналогии сделаны и эти игры...


MVP   (2006-04-04 11:15:00) [13]

а, то есть на стороне сервера, есть сервер, писанный тоже на делфи, например, который передает какие-то команды. или скрипт пхп,. Можешь обхяснить мне механизм такого взаимодействия. Я грю про браузерные игры, можно их юзать через браузер, а можно скачать клиент.


Rouse_   (2006-04-03 13:58:00) [14]

брр... какие клиенты для игр? Игра сама и есть клиент, если ты про клиенты для форумов - то на стороне форума работет специальный скрипт который и отдает клиенту данные не примеряя HTML


Rouse_   (2006-04-03 13:55:00) [15]

жмут траффик к примеру через GZIP


MVP   (2006-04-03 13:00:00) [16]

а вообще есть способ как-то уйти от этого. Есть же клиенты для игр, которые снижают количество траффика. А как они построены?


Rouse_   (2006-04-03 12:53:00) [17]


> Мы получаем весь хтмл код страницы. Тем самым растет получаемый
> траффик из интеренета. Можно ли как-то этого избежать?

А как можно что-то делать не имея на руках данных? Естественно HTML придет целиком, иначе ты не сможешь его отобразить...


MVP   (2006-04-03 12:22:00) [18]

и если страница большая, её исходный текст большоя, то анализ будет долгим, и картинки не быстро подгрузятся.


MVP   (2006-04-03 12:13:00) [19]

Такой вопрос.

InHTML := IdHTTP1.Get(' http://www.yandex.ru');

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


Rouse_   (2006-04-03 09:52:00) [20]

Вот тебе пример. Загружает старницу с www.yandex.ru и удаляет из страницы все картинки которые грузятся с img.yandex.ru

Можешь, вместо удаления кода картинки изменить его ссылкой на локальное изображение

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, OleCtrls, SHDocVw, IdBaseComponent, IdComponent,
 IdTCPConnection, IdTCPClient, IdHTTP, mshtml, ActiveX;

type
 TForm1 = class(TForm)
   IdHTTP1: TIdHTTP;
   WebBrowser1: TWebBrowser;
   WebBrowser2: TWebBrowser;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
 StartImg = '<img src="';
 EndImg = '>';
 LengthStart = Length(StartImg);
 LengthEnd = Length(EndImg);
 LengthSum = LengthStart + LengthEnd;
var
 InHTML, OutHTML, ImageLink: String;
 Position: Cardinal;
 Document: IHtmlDocument2;
 V: Variant;
begin
 // Загружаем оригинальную страницу (для сравнения)
 WebBrowser1.Navigate(' http://www.yandex.ru');
 // Получаем код этой страницы руками
 InHTML := IdHTTP1.Get(' http://www.yandex.ru');
 // Начинаем парсить
 while Length(InHTML) > 0 do
 begin
   // Ищем начало рисунка
   Position := Pos(StartImg, InHTML);
   // Если нашли
   if Position > 0 then
   begin
     // Все что до него - помещаем в выходной буффер
     OutHTML := OutHTML + Copy(InHTML, 1, Position - 1);
     // Удаляем ненужное из входного буффера
     Delete(InHTML, 1, Position - 1);
     // Ищем конец картинки
     Position := Pos(EndImg, InHTML);
     // Запоминаем картинку
     ImageLink := Copy(InHTML, LengthStart, Position - LengthSum);
     // Если эта картинка грузится не с узла img.yandex.ru - добавялем ее в выходной буффер
     if Pos('img.yandex.ru', ImageLink) = 0 then
       OutHTML := OutHTML + Copy(InHTML, 1, Position + LengthEnd - 1);
     // Удаляем из входного
     Delete(InHTML, 1, Position + LengthEnd - 1);
   end
   else
   begin
     // Больше картинок нет - все что осталось перекидываем в выходной буффер
     OutHTML := OutHTML + InHTML;
     InHTML := '';
   end;
 end;
 // Закидываем пропарсенный текст в бразер
 WebBrowser2.Navigate('about:blank');
 while WebBrowser2.Document = nil do
   Application.ProcessMessages;
 Document := WebBrowser2.Document as IHtmlDocument2;
 V := VarArrayCreate([0, 0], varVariant);
 V[0] := OutHTML;
 Document.Writeln(PSafeArray(TVarData(v).VArray));
end;

end.


Наверх

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