Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

Подмена картинок на форуме   Найти похожие ветки 

 
MVP   (2006-04-03 01:22) [0]

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


 
Rouse_ ©   (2006-04-03 09:52) [1]

Вот тебе пример. Загружает старницу с 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.


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

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

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

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


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

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


 
Rouse_ ©   (2006-04-03 12:53) [4]


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

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


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

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


 
Rouse_ ©   (2006-04-03 13:55) [6]

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


 
Rouse_ ©   (2006-04-03 13:58) [7]

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


 
MVP   (2006-04-04 11:15) [8]

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


 
Rouse_ ©   (2006-04-04 12:20) [9]

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

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


 
MVP   (2006-04-04 22:41) [10]

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


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

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


 
Rouse_ ©   (2006-04-05 09:53) [12]

Работает очень просто - скрипту отправляется 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 22:08) [13]

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


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

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


 
Rouse_ ©   (2006-04-06 09:45) [15]


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

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


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

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


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

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


 
Rouse_ ©   (2006-04-06 11:30) [17]

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


 
MVP   (2006-04-06 12:12) [18]

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


 
Arazel ©   (2006-04-07 10:43) [19]

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


 
Rouse_ ©   (2006-04-07 17:54) [20]

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



Страницы: 1 вся ветка

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.056 c
15-1154431998
cyborg
2006-08-01 15:33
2006.08.27
Библиотека звуков


15-1154593000
ALEXD31
2006-08-03 12:16
2006.08.27
Мультизагрузочный диск


3-1150808801
boojum
2006-06-20 17:06
2006.08.27
Глюки со шрифтом в RaveReports


15-1154484791
Dust
2006-08-02 06:13
2006.08.27
Устал.. думаю это знакомо многим


2-1154882574
Adios
2006-08-06 20:42
2006.08.27
treeview