Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Не нужный знак % в TidHTTP: Post


Автор: Teran 25.1.2006, 13:37
Делаю так:
Код

procedure TForm1.Button2Click(Sender: TObject);
 var
   str:TStringList;
 begin
   str:=TStringList.Create;
     str.Add('username=test);
     str.Add('password=Test_');

     IdHTTP1.Post('http://..!!!!!!.ru/..!!./!.!!.php', str);

     str.Free;
end;


но в отправлаемом пакете вижу:

Код

POST http://..!!!!...!!!!m.ru:80/..!!./l..!!!.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 123
Pragma: no-cache
Proxy-Connection: keep-alive
Host: !!!!!!!!!!.ru
Accept: text/html, */*
Accept-Language: ru
User-Agent: Mozilla/3.0 (compatible; Indy Library)

username=test&password=Test%5F               ---- Вот Здесь и ВОПРОС  :qstn 


Почему я отправляю 'password=Test_'
а уходит на самом деле 'password=Test%5F'
и как нужно писать правильно smile

Автор: Snowy 25.1.2006, 14:23
В HTTPOptions Выключи hoForceEncodeParams

Автор: Teran 25.1.2006, 15:46
Спасибо Snowy

Не подскажеш еще как мне организовать что-то типа Автоматической авторизации
делаю так:
Код

procedure TForm1.Button6Click(Sender: TObject);
var
str:TStringList;
begin

     str:=TStringList.Create;
      str.Add('referer=');
     str.Add('UserName=Teran');
     str.Add('PassWord=!!!!!');
     str.Add('tst=');
     str.Add('CookieDate=1');

     Memo1.Lines.Text := IdHTTP1.Post('http://forum.vingrad.ru/index.php?act=Login&CODE=01', str);
 
     str.Free;
 

end;


а после нажатия на кнопку прога выдает : Выскакивает сообщение:"HTTP/1.1 302 Found" -> нажимаю "Ok"
и в Мемо ничего нету
smile

Автор: Teran 25.1.2006, 16:05
Хочу сделать программку которая конектилась бы к форуму и получала .... например колличество непрочитанных писем

такое возможно сделать ????????

Автор: Snowy 25.1.2006, 16:21
А печенюшки у тебя включены? А TIdCookieManager прикручен?
Без печенюшек не получится.
Код

var
  str:TStringList;
  ms: TMemoryStream;
begin
  str:=TStringList.Create;
  ms := TMemoryStream.Create;
  str.Add('referer=');
  str.Add('UserName=Teran');
  str.Add('PassWord=!!!!!');
  str.Add('tst=');
  str.Add('CookieDate=1');
  try
    IdHTTP1.Post('http://..../', str, ms);
    ms.Position := 0;
    Memo1.Lines.LoadFromStream(ms);
  finally
    ms.Free; str.Free;
  end;
end;

Автор: Teran 25.1.2006, 16:30
расскажи пожалуйста поподробней кто такие эти
Цитата(Snowy @ 25.1.2006, 16:21 Найти цитируемый пост)

печенюшки


Цитата(Snowy @ 25.1.2006, 16:21 Найти цитируемый пост)

А TIdCookieManager прикручен?

а куда его вставлять ???

Автор: Snowy 25.1.2006, 16:41
Кидаешь на форму, а у IdHTTP1 назначаешь его, как Intercept.
Цитата(Teran @ 25.1.2006, 16:30 Найти цитируемый пост)
расскажи пожалуйста поподробней кто такие эти

Cookies

Цитата(Teran @ 25.1.2006, 16:30 Найти цитируемый пост)
TIdCookieManager

Управляет печенюшками.
Он за тебя будет отдавать печенюшки сервену и сохранять новые.

Автор: Teran 25.1.2006, 16:58
Цитата(Snowy @ 25.1.2006, 16:41 Найти цитируемый пост)

Кидаешь на форму, а у IdHTTP1 назначаешь его, как Intercept.


закинул на форму IdCookieManager1 (Действительно похожа на печенюшку)
привязал IdHTTP1 с IdCookieManager1 свойством CookieManager


а к Intercept не хочет ничего вязатся??? smile

Автор: Snowy 25.1.2006, 18:08
Ну значит я напутал. Главное, что привязал.
А версия Indy у тебя какая?

Автор: Teran 25.1.2006, 18:21
которая в Delphi 7 находится

так что просто привязать и все?
больше никаких действий делать не надо???

Автор: Snowy 25.1.2006, 18:33
Нужно сделать его Active. И все.
Для этого он и нужен, чтобы руками больше ничего не делать.

Автор: Teran 25.1.2006, 19:13
интересная проблема
пытаюся залогинится на Vingrad (по твоему коду)

но когда делаю POST на http://forum.vingrad.ru/index.php?act=Login&CODE=01
и набираю пароль правильно выскакивает сообщение :"HTTP/1.1 302 Found" и глючит сам форум

а когда неправильно в мемо -> страница авторизации

Автор: Snowy 25.1.2006, 19:21
Попробуй переключить ProtocolVersion на pv1_0
Добавлено @ 19:28
Я по этому же коду получаю страницу ошибки.
И не удивительно - пароль не "!!!!!" smile
Добавлено @ 19:33
Все. Понял в чем проблема.
При корректном входе подгружается главная страница.
А в ней очень большой размер.
Выставь параметр MaxLineAction в maSplit.

Автор: Teran 25.1.2006, 19:39
Делаю по этому коду:
Код

var
  str:TStringList;
  ms: TMemoryStream;
begin
  str:=TStringList.Create;
  ms := TMemoryStream.Create;
  str.Add('referer=');
  str.Add('UserName=Teran');
  str.Add('PassWord=!!!!!');
  str.Add('tst=');
  str.Add('CookieDate=1');
  try
    IdHTTP1.Post('http://forum.vingrad.ru/index.php?act=Login&CODE=01', str, ms);
    ms.Position := 0;
    Memo1.Lines.LoadFromStream(ms);
  finally
    ms.Free; str.Free;
  end;


но логинится не хочет(Пароль пишу правильный)

а у тебя получилось????


Автор: Snowy 25.1.2006, 19:39
И HandleRedirect поставь в true
Добавлено @ 19:41
Цитата(Teran @ 25.1.2006, 19:39 Найти цитируемый пост)
а у тебя получилось????

Угу.

Автор: Teran 25.1.2006, 19:52
УРРРРРРРАААААА Заработало smile
Спасибо ограмное
ВОТ:
Код

var
  str:TStringList;
  ms: TMemoryStream;
begin
  str:=TStringList.Create;
  ms := TMemoryStream.Create;
  str.Add('referer=');
  str.Add('UserName=Teran');
  str.Add('PassWord=!!!!!');
  str.Add('tst=');
  str.Add('CookieDate=1');
  try
    IdHTTP1.Post('http://forum.vingrad.ru/index.php?act=Login&CODE=01', str, ms);
    ms.Position := 0;
    Memo1.Lines.LoadFromStream(ms);
  finally
    ms.Free; str.Free;
  end;
  Memo1.Lines.Text:=IdHTTP1.Get('http://forum.vingrad.ru/index.php?act=Msg&CODE=01')



сразу открывает страницу где содержаться мои писма

а можно ли както сделать чтоб не в мемо был этот HTML а в -> борауер и открывался в нормальном виде
я так думаю кудато нужно TwebBrowser прикрутить ???? smile

Автор: Snowy 25.1.2006, 20:07
Нет, нельзя.
В браузере нет печенюшек - они в Cookie менеджере.
Кроме того, вид все равно будет отличаться, т.к. стили хранятся в css, а его нужно отдельно скачивать. А одновременно подсунуть html и css можно только через файл.
Тогда нужно было изначально строить все на браузере.
И, даже, если ты все это отобразишь, будут испорчены относительные ссылки.
Браузер штука умная и тупая одновременно.

Автор: Teran 25.1.2006, 20:13
а если код HTML с мемо просто забросить в броузер ????

Там всетаки лучше смотреть чем на сам код

Автор: Teran 25.1.2006, 20:38
Я нашел для этого можно использовать компонент DHTMLEdit из ActiveX
Пишем:
Код

DHTMLEdit1.DocumentHTML:=Memo1.Lines.Text;


и он показывает нормальным языком

Автор: Snowy 25.1.2006, 22:05
Поазывает.
Только без стилей. И 99% ссылок не работает.
Но показывает, да.
В принципе и TWebBrowser будет показывать.
В FAQ есть пример загрузки html из TMemoryStream.

Автор: Teran 26.1.2006, 00:36
Ты можеш скинуть пожалуйста ссылочку на
Цитата(Snowy @ 25.1.2006, 22:05 Найти цитируемый пост)

В FAQ есть пример загрузки html из TMemoryStream.


А то у мня дома сильно глючит инет долго искать прийдется

Автор: Snowy 26.1.2006, 10:51
Код
uses ActiveX;

procedure LoadHtml(html: string);
var
  ms: TMemoryStream;
begin
  ms:=TMemoryStream.Create;
  ms.Write(html[1], Length(html));
  ms.Position:=0;
  with MainWindow do
  try
    TWebBrowser1.Navigate('about:blank');
    while TWebBrowser1.ReadyState < READYSTATE_INTERACTIVE do
      Application.HandleMessage;
    (TWebBrowser1.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
  finally
    ms.Free;
  end;
end;

Автор: Teran 26.1.2006, 15:38
Все Работает

Спасибо Snowy

Я буду выдирать из HTML кода название и количество личных сообщений и вставлять себе в список на форме.

Автор: Teran 26.1.2006, 18:24
Ой smile

Если ковырятся в Html коде такая белеберда пролучается.

А нет ли какого нибудь другого общения с форумом,
чтоб по запросу допустим форум сам мне передавал личные сообщения(письма: название, тема, от кого, и .....)

smile

Както это в других программах реализовано

smile

Автор: Snowy 26.1.2006, 18:38
Нет. Другого способа нет.
Придется мучаться с html.
В принципе вполне реально.

Автор: Teran 26.1.2006, 18:48
Цитата(Snowy @ 26.1.2006, 18:38 Найти цитируемый пост)

В принципе вполне реально.


это верно но для одного форума, а если их много??? smile

Автор: Snowy 26.1.2006, 18:49
Но другого не дано. Так что только так.
Универсального решения нет.

Автор: Teran 26.1.2006, 19:04
а всякие HTML парсеры ??? или они не для этого предназначены???7 smile

Автор: Teran 26.1.2006, 19:56
Хочу перевести свой код на Buolder C++ ?

а там такого компонента нету:TIdCookieManager

а как тут быть??

делаю:
Код


  TStrings *Source=new TStringList();
  TStream *stream=new TMemoryStream();
     Source->Add("username=Teran");
     Source->Add("password=!!!"");
                                                                                                                                                                         
    Source->Add("autologin=on");
     Source->Add("login=");
 char buffer[1024];
 int readChars=1024;
 AnsiString strDisp;
     Source->Text;
  IdHTTP1->Post("http://myphpbb.com.ru/go/login.php?redirect=privmsg.php&folder=inbox",Source,stream);
Memo1->Lines->Clear();
        stream->Position = 0;
        readChars = 1024;
        while(readChars >= 1024)
          { readChars = stream->Read(buffer,1024);
            strDisp = AnsiString(buffer);
            Memo1->Lines->Add(strDisp);
           }

delete Source; delete stream;



но ничего не получилось

Автор: _hunter 26.1.2006, 20:10
версию индейцев по-новее поставить...

Автор: Teran 27.1.2006, 09:32
а где её раздабыть ??

ссылочку дай пожалуйста
(правда я не знаю какая у меня версия Indy)

Автор: Teran 27.1.2006, 09:51
Спасибо уже ненадо
вроди бы нашел: http://www.indyproject.org/Sockets/Download/Files/Indy10.en.html

Автор: Teran 27.1.2006, 10:25
Вот блин опять проблема тут нету именно для Builder C++

есть какието сорсы но они *.pas

а *.cpp не могу найти smile

Автор: _hunter 27.1.2006, 11:51
там инструкция есть:
http://www.indyproject.org/Sockets/Docs/Indy10Install.en.html

Автор: Snowy 27.1.2006, 12:30
А там и нет cpp сорсов. Оно все на дельфи писано.
Просто инсталь, как пакаджик.

Автор: Teran 27.1.2006, 12:38
как .....?
Извини не понял??

расскажи чуть подробней smile

Автор: Snowy 27.1.2006, 13:28
Подробней, чем написано, только показать.
Цитата

Indy10Install

All packages are followed by X0 (Where X is your Delphi verison).
Download source from the Development Snapshot.

Delphi / BCB Installation
Open and compile in the following order:
* IndySystem (in Lib\System)
* IndyCore (in Lib\Core)
* IndyProtocols (in Lib\Protocols)
* IndySuperCore (in Lib\SuperCore)
Now open and click install in the following order
* dclIndyCore (in Lib\Core)
* dclIndyProtocols (in Lib\Protocols)
* dclSuperCore (in Lib\SuperCore)


Автор: Teran 27.1.2006, 13:47
Цитата(Snowy @ 27.1.2006, 13:28 Найти цитируемый пост)

Open and compile in the following order:
* IndySystem (in Lib\System)
.....

т.е. нужно по очереди откомпилить и то что создастся скопить в Lib\System?

а Lib\System - его самому создавать где угодно или system сщздавать в
C:\Program Files\Borland\CBuilder6\Lib
smile

Автор: _hunter 27.1.2006, 14:21
в смысле по-очереди?
там только один .dpk
и папкаи в архиве уже есть. зачем их создавать?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)