![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подмена картинок на форуме
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.