Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 25.08.2012, 11:53
pireved pireved вне форума
Прохожий
 
Регистрация: 20.08.2012
Сообщения: 15
Репутация: 10
По умолчанию

пока были такие 400,404,301,504 наверняка и другие будут если продолжать так не правильно делать
всплывают на idhttp.get я думаю изза того что idhttp пытается скачать несколько файлов одновременно - саму страницу + подключенные скрипты+ картинки может быть, а сам может скачивать только один файл за один подход. настроил создание экземпляров но видимо тоже криво и программа все равно заставляет myhttp скачать все сразу, отсюда и всевозможные ошибки http
Ответить с цитированием
  #17  
Старый 25.08.2012, 21:20
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Не-не-не, idHTTP делает только то, что ему говорят Это браузер может делать параллельные запросы, да.

Вообще, proxy-сервер на Indy - это неправильно (ИМХО). Ну, и так как ты делаешь - тоже не совсем правильно. Например, использование строк в этом случае - неверный подход, ибо она будет обрезана до первого нулевого байта. Ну и получение результата на прокси с последующей его отдачей - тоже нехорошо, ибо если юзер захочет скачать 100-мегабайтный файл, то он будет висеть в памяти пока не скачается полностью, что не круто.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение:
pireved (25.08.2012)
  #18  
Старый 25.08.2012, 23:02
pireved pireved вне форума
Прохожий
 
Регистрация: 20.08.2012
Сообщения: 15
Репутация: 10
По умолчанию

попробую более прозрачно объяснить вопрос. цель - добится того чтобы
при посещении пользователем любых страничек в интернете
(с редиректами с ajax с javascript c CSS и тп)
получал в браузер (внешний или встроеный, желательно во внешний) уже отредактированую страницу, без javascript блоков рекламы, счетчиков и тп но с картинками естественно. не важно каким способом этого добится, фильтровать через прокси или перехватывать в twebbrowser'е или каким то другиим способом, главное - на делфи 7 ну и если нужно то с использованием php. "фильтрация" и правка контента - только если есть необходимость, если не нужна то пользователь получает страницу в нетронутом виде.
для скачиваний файлов тем более больших есть много других удобных средств, через эту прогу скачивать видео или архивы и тп никто не будет по замыслу.
например как реализовано здесь http://anonymouse.org/cgi-bin/anon-w...www.yandex.ru/
встроен рекламный блок + еще некоторые коректировки страницы. только у них на perl видимо а мне нужно на делфи...
Ответить с цитированием
  #19  
Старый 26.08.2012, 03:05
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Ну тогда в любом случае нужно следующее (назовём клиента браузером):
1. Изначально используются потоки. Строки используем только после того, как проверили, что формат (content-type), пришедший с сервера, является текстовым (text/*, application/javascript, application/xml*).
2. Заголовки (от браузера к серверу и обратно) тоже надо бы передавать, в том числе Cookies.
3. В случае ошибки (3хх, 4хх, 5хх) - обрабатывать это (гугли "delphi try except") и отдавать соответствующий код браузеру (грамотно сделанный п. 2 решает и эту проблему).
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 03.09.2012 в 03:57.
Ответить с цитированием
  #20  
Старый 02.09.2012, 14:22
pireved pireved вне форума
Прохожий
 
Регистрация: 20.08.2012
Сообщения: 15
Репутация: 10
По умолчанию

получилось отдавать браузеру то что он запрашивает, пока что без ошибок сокета и без ошибок хтмл. теперь новая беда - браузер не хочет отображать рисунки (хотя idhttp их загружает и возвращает браузеру), не применяются и стили которые в css файлах, а сценарии javascript во внешних файлах подгружаются и выполнятся нормально. плюс в браузере вместо русских букв вопросительные знаки. это изза заголовков.
не могли бы Вы приветси пару строк примера как передавать эти самые заголовки и куки туда и обратно?
куки, насколько я понял, приходят в
Код:
ARequestInfo.RawHeaders

в строке в начале которой есть Cookie:
например Cookie: uid=7384;mid=32432;fid=37483247;
всю остальную строку (кроме слова Cookie нужно разбить по строкам по разделителю ";" и передать браузеру например так
Код:
AResponseInfo.Cookies.Add(uid=03232);
пробую, но эффекта нету.
ни куки ни стили ни картинки, которые возвращает прокси - браузер не видит либо не может определить что ему возвращают
Ответить с цитированием
  #21  
Старый 03.09.2012, 03:59
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Сниффер + дебагер в зубы, и смотрим, что и где повреждается.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #22  
Старый 04.09.2012, 14:16
pireved pireved вне форума
Прохожий
 
Регистрация: 20.08.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
Сниффер + дебагер в зубы, и смотрим, что и где повреждается.
даже если я установлю сниффер и начну отлаживать то все равно не знаю что именно искать и как. в заголовках я не шарю. прошу сильно не пинать за это
если бы знал как это делается и как устроено то не обратился за помощью сюда, а сделал бы все сам молча, но все знать не возможно.
кое что получается уже:
-запускается локальный прокси
-прокси получает запросы от браузеров
-прокси через idhttp скачивает запрошеные страницы и возвращает их содержимое браузеру в девственном виде.
-ошибок и вылетов нет пока.
-сессии сохраняются.
но браузеры не могут определить что за документы им возвращаются от прокся. служебную информацию. как ему подсказать я не знаю. пробую вручную определить тип по расширению и подсказать браузеру mime, но не получается он не слыши меня. вероятно нужно спросить это у idhttp и синхронно передать ответ браузеру, но и этого я не знаю как сделать (через какие поля или свойства idhttp)
главная задача в следующем : есть сайт забитый javascript функциями, и стилями (типа гугла только хуже), мне нужно найти в этом javascript коде например буквально такое :
myval=true;
и заменить на
myval=false;
каждый раз при открытии страницы, причем чтобы сохранились и сессия и куки, что бы в бравзере выполнялись все javascript'ы, ну и чтобы картинки отображались. вобщем нужно программно сделать маленькую подмену "на лету" не заметно для браузера, подмену в коде страницы, остальное должно быть не тронуто.
еще пример - vksaver, он как то нечто очень похожее делает - вставляет на определенные страницы в определенные места свой небольшой код, в любом бровзере, сохраняя и куки и сессии и все прочее. наверняка он так же через прокси пропускает все адреса и обрабатывает только нужные места.
но моя программа (если получится сделать) будет работать только на моем компе, прога лично и сугубо для меня.
Ответить с цитированием
  #23  
Старый 04.09.2012, 18:36
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

IdHTTP.Response.БлаБлаБла
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #24  
Старый 04.09.2012, 18:55
pireved pireved вне форума
Прохожий
 
Регистрация: 20.08.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
IdHTTP.Response.БлаБлаБла
Код:
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
  var
  doc:string;
  typ,mime:string;
  body:tstringstream;
begin
 
 body:=tstringstream.Create('');
      try
      myhttp := TIdHTTP.Create(nil);
      myhttp.HandleRedirects := true;
      myhttp.AllowCookies:=true;
      myhttp.CookieManager:=cm;
      doc:='http://'+ARequestInfo.Host+ARequestInfo.Document;
      typ:=get_type(doc);
      mime:=get_mime(typ);
      myhttp.Request.RawHeaders.Text:=ARequestInfo.RawHeaders.Text;
      AResponseInfo.ContentType:=mime;
      AResponseInfo.CustomHeaders:=ARequestInfo.RawHeaders;
      body.WriteString(myhttp.Get(doc));
      AResponseInfo.RawHeaders.Text:=myhttp.Response.RawHeaders.Text;
      AResponseInfo.ResponseText:=myhttp.ResponseText;
     AResponseInfo.ContentText:=body.DataString;
body.Free;
      except
//
      end;
end;
вот что получилось..
напоминает узелковую письменность))
но вариантов перепробовал сотни уже всяких. так работает более менее без ошибок и вылетов.
или это тупик или я вообще не туда пошел
get_mime и get_type функции определяющие mime type по расширению скачиваемого документа, если его нету - значит тип =text/html

Последний раз редактировалось pireved, 04.09.2012 в 18:59.
Ответить с цитированием
  #25  
Старый 04.09.2012, 18:58
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Код:
AResponseInfo.ContentStream:=TMemoryStream.Create;
myhttp.Get(doc,AResponseInfo.ContentStream);
AResponseInfo.ContentType:=myhttp.Response.ContentType;
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 04.09.2012 в 19:00.
Ответить с цитированием
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение:
pireved (06.09.2012)
  #26  
Старый 06.09.2012, 13:48
pireved pireved вне форума
Прохожий
 
Регистрация: 20.08.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
Код:
AResponseInfo.ContentStream:=TMemoryStream.Create;
myhttp.Get(doc,AResponseInfo.ContentStream);
AResponseInfo.ContentType:=myhttp.Response.ContentType;
большое человеческое СПАСИБО! испытал по полной - код работает так как надо! только кодировки не правильные на некоторых сайтах но это мелочи.
теперь вторая часть задачи - убрать или заменить лишнее на загруженных страничках. к примеру, у меня есть кустарная функция my_page_filter(doc_body,src,dest:string):string;
где src-искомая подстрока, dest - чем ее заменить, если найдено src.
как мне ее применить для потока? конвертировать в строку потом обратно?или как то можно фильтровать поток сразу, но как использовать строковые функции для поиска и замены подстроки в строке для потока?
Ответить с цитированием
  #27  
Старый 06.09.2012, 14:12
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

StringReplace
<a href заменить на <!-- a href
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #28  
Старый 06.09.2012, 14:30
pireved pireved вне форума
Прохожий
 
Регистрация: 20.08.2012
Сообщения: 15
Репутация: 10
По умолчанию

нет нет..

Код:
function filter_doc(body:tmemorystream;before,after:string):tmemorystream;
var
ms:tmemorystream;
begin
ms:=tmemorystream.create;
//здесь нужно отфильтровать body, а именно - найти подстроку, заменить ее, если она найдена и вернуть результат в ms.
result:=ms;
end;

StringReplace - применима только для строковых переменных ведь. как ее использовать для потока в памяти я не знаю. надеюсь без assembler'a и указателей есть какой то способ попроще.
Ответить с цитированием
  #29  
Старый 06.09.2012, 14:41
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Смех

вариантов как обычно много...
можно в Memo загрузить из MemoryStream и работать с Memo. пример есть в файле справки.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #30  
Старый 06.09.2012, 14:46
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от NumLock
вариантов как обычно много...
можно в Memo загрузить из MemoryStream и работать с Memo. пример есть в файле справки.
Ну тогда уже лучше в TStringList.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter