Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.045 c
2-1154029431
Chort
2006-07-27 23:43
2006.08.27
Информация о файле


2-1154513346
o_serg
2006-08-02 14:09
2006.08.27
Tframe с TactionList проблема


15-1154541697
Venum
2006-08-02 22:01
2006.08.27
Наказание за использование Пиратского Софта ???


2-1154918244
kobik.
2006-08-07 06:37
2006.08.27
Stream - пустой / не пустой


15-1154262709
Alral
2006-07-30 16:31
2006.08.27
Коммандная строка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский