Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > На сайт отправляет 41 байт вместо 40!


Автор: ЧеловекБорща 17.1.2011, 21:12
Всем привет!

Проблема:
Есть сайт(моего интернет провайдера). Пишу программу логина на этот сайт, воружился сниффером и delphi 7.
Браузер посылает на сайт 3 параметра:
  • __click=0 //Кликнуто ли по флеш-изображению(это спрятанная переменная)
  • FullName= //Логин(5 знаков)
  • Password= //Пароль(6 знаков)
Вот как посылаю:
Код

procedure TAltolanThread.Execute;
var
  Http: TIdHTTP;
  Request: TStringList;
  Answer: string;
begin
  Request := TStringList.Create;
  http := TIdHTTP.Create(nil);
  Http.HandleRedirects := True;
  //Requset data
  try
   Request.add('__Click=0');
    Request.add('FullName=12345');
    Request.add('Password=abcdef');
    Answer := Http.Post('http://altolan.com/www2/int-clients.nsf/userenter?OpenForm&Seq=1', Request);
    MainForm.sRichEdit1.Lines.Add(Utf8ToAnsi(Answer));
  finally
    Request.Free;
    Http.Free;
  end;
end;


сниферром смотрю что посылает браузер и программа:
Бразер отправлет POS-данные:
1. __click=0
2. FullName=12345
3. Password=abcdef

соответственно вот так:
__Click=0&FullName=12345&Password=abcdef

40 байт. Авторризация проходит нормально.

Те же данные посылаются и моей программой:
1. __click=0
2. FullName=12345
3. Password=abcdef
4.                             //пустое поле

А вот тут так:
__Click=0&FullName=12345&Password=abcdef&

Где & и есть 4 поле, из-за которого нет ни авторизации и ошибка: Internal Server Error
Длинна 41 байт.

Даннае посылаются одинаковые однако indy приписывает & в конец. 

Как и чем это лечится?  smile 

Автор: MetalFan 17.1.2011, 21:56
используй TIdMultipartFormData вместо StringListа, или проверь, что используется крайняя версия indy

Автор: ЧеловекБорща 17.1.2011, 22:36
Вот delphi 2010(поставил) :
Код

procedure TForm1.sButton1Click(Sender: TObject);
var
  Data:TIdMultiPartFormDataStream;
begin
  Data:=TIdMultiPartFormDataStream.Create;
  Data.AddFormField('__click','0');
  Data.AddFormField('FullName','12345');
  Data.AddFormField('Password','******');
  sMemo1.Lines.Add(Utf8ToAnsi(IdHTTP1.Post('http://altolan.com/www2/int-clients.nsf/userenter?OpenForm&Seq=1',Data)));
  Data.Free;
  end;

та же ошибка 504 internal server error

Автор: Mifody 18.1.2011, 01:02
Мнда, никогда не любил эти Инди, и уж точно никогда к ним не вернусь smile.
Итак:
1. в отладчике Request.Text = '__Click=0'#$D#$A'FullName=12345'#$D#$A'Password=abcdef'#$D#$A 
х/з, с какого перепуга Делфя поставила в конце пустую строку, причем обрезать не получается :(
2. Инди уперто воспринимает пустую строку как строку с данными.
3. TIdMultiPartFormDataStream - это случайно не для "multipart/form-data" ???? 

Вообщем помнится, я в свое время суток трое бился с такой проблемой, ничерта не получилось :(, в результате отказался вообще от индей.

UPD: Кстати, поставьте кукис менеджер и сделайте обработку редиректа (перекройте на метод 'GET'), а то у меня из-за не правильных (ведь логин/пароль от балды) в циклический редирект инди ушла. smile

Автор: ЧеловекБорща 18.1.2011, 01:46
Кукисы включены редирект тоже, но и эффект не меняется smile 

GET запрос сайт не воспринимает, только POST, кукисов сайт тоже не держит.

P.S. а что тогда использовать? Можете если не сложно пооветовать алтернативу? 

Автор: Keeper89 18.1.2011, 03:02
http://www.ararat.cz/synapse
Примеры:
http://www.webdelphi.ru/2010/05/synapse-avtorizaciya-v-wordpress-bloge/
http://www.webdelphi.ru/2009/12/avtorizaciya-na-sajte-posting-novostej-bloga/

Автор: Mifody 18.1.2011, 10:17
Еще говорят Overbyte ICS компоненты весьма не плохие, но не знаю, сам не юзал. Точнее мне как-то не понравилась их логика.
А вообще Keeper89 верно посоветовал, synapse очень даже не плохие. Конечно и у них нарыался уже на одну недоработку (даже и багом ее не назовеш), ну и не такие удобные как Indy. Но я еще не натыкался на ситуацию, когда синапс не мог работать с сайтом, все проблемы были из-за кривых рук при написаниии кода smile.
Единственное что может напрячь, перед каждым запросом заголовок надо заново формировать и документ очищать (если данные нет необходимости отправлять)

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