Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2012, 20:39   #1
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
Вопрос Наболевший Post-запрос и https (поиск юзал!)

Всем привет.

Начну с того, что искал, но внятного ответа/рецепта не нашел, даже в гугле

Нужно авторизоваться на твиттер.ком, как известно, там https. Спросив у гугла, попробовал сделать так:

1. На форме у меня:
TIdHTTP, TIdCookieManager, TIdSSLIOHandlerSocketOpenSSL.
В свойствах TIdHTTP установлено: IOHandler=IdSSLIOHandlerSocketOpenS SL1.

2. Обработчик нажатия кнопки:

Цитата:
procedure TForm1.Button1Click(Sender: TObject);
var
data: tstringlist;
StrPage, UserID, UserName : String;
i : integer;
begin

try
Data := TStringList.Create;
idHttp1.AllowCookies := true;
idHttp1.CookieManager := IdCookieManager1;
idHttp1.HandleRedirects := true;

idHttp1.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7';
Data.Add('session[username_or_email]=MyLogin');
Data.Add('session[password]=MyPassword');

StrPage := idHttp1.Post('https://twitter.com/#!/login', Data);
memo1.Text:=idHttp1.Response.RawHea ders.GetText;;

finally
end;

end;
3. При таком запросе idHttp1.Response.RawHeaders.GetText выдает:

Цитата:
Date: Thu, 26 Jan 2012 16:36:49 GMT
Status: 200 OK
X-Transaction: 6481ae5ce78a7465
ETag: "22d2acc05cdf86430ed2c25ac93788 fe"
X-Frame-Options: SAMEORIGIN
Last-Modified: Thu, 26 Jan 2012 16:36:49 GMT
X-Runtime: 0.08316
Content-Type: text/html; charset=utf-8
Content-Length: 41335
Pragma: no-cache
X-Revision: DEV
Expires: Tue, 31 Mar 1981 05:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
X-MID: bb6970369b03a180241c6c64c8256df98c2 77b09
Set-Cookie: k=10.35.64.136.1327595809430950; path=/; expires=Thu, 02-Feb-12 16:36:49 GMT; domain=.twitter.com
Set-Cookie: guest_id=v1%3A132759580943476511; domain=.twitter.com; path=/; expires=Sun, 26-Jan-2014 04:36:49 GMT
Set-Cookie: _twitter_sess=BAh7CjoVaW5fbmV3X3VzZ XJfZmxvdzA6D2NyZWF0ZWRfYXRsKwibauAa NQE6%250ADGNzcmZfaWQiJWViOGQxMmJkOW NlNTBkYThiYTYwZGUyODExNjZkZTU2Ogdp% 250AZCIlNjJjOWE0MjM5OWZlNGQ2N2VmOGZ jYTA1M2Q3ODNiODQiCmZsYXNoSUM6%250AJ 0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpG bGFzaEhhc2h7AAY6CkB1c2Vk%250AewA%25 3D--71091fe3260310266ff582d970e96a3be57 ffd37; domain=.twitter.com; path=/; HttpOnly
X-XSS-Protection: 1; mode=block
Vary: Accept-Encoding
Server: tfe
Connection: Keep-Alive
Вопросы:

1. Что, все-таки, делаю неправильно/недостаточно правильно?
2. Сниффером посмотреть данные POST-запроса не получается - при логине из браузера в сниффере вообще не появляется POST-запроса. Подозреваю, что это из-за https/
3. Если Indy и https - это утопия, пните в нужном направлении
trafbite вне форума Ответить с цитированием
Старый 26.01.2012, 20:46   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну получаете вы ответ от сервера, в чем проблема то?
сам текст ответа(данные) в StrPage.

2)https мало какие снифферы могут смотреть.(даж не знаю какие могут)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.01.2012, 21:07   #3
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Ну да, может быть зря то привел.

В ответе просто код странички https://twitter.com/#!/login, значит POST-запрос не прошел... (привести код не могу - на форуме ограничение в 5к символов, а там около 41к). Вот начало:

В аттаче файл с ответом:
Response.txt

Есть мысли?

Последний раз редактировалось trafbite; 26.01.2012 в 21:12.
trafbite вне форума Ответить с цитированием
Старый 26.01.2012, 21:24   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)посылаете вы не туда запрос.
2)все что после # обрабатывается в основном клиентом а не сервером.

можно попробовать посмотреть в Мозилле, там есть плагин к самой Мозилле для просмотра запросов, думаю он может http посмотреть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.01.2012, 21:34   #5
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Попробую поискать плагин и посмотреть.
trafbite вне форума Ответить с цитированием
Старый 27.01.2012, 08:27   #6
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Посмотрел запрос в chrome.
Вот так передаю запрос:
Цитата:
idHttp1.Request.Host:='twitter.com' ;
idHttp1.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7';
idHttp1.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
idHttp1.Request.AcceptLanguage:='ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4';
idHttp1.Request.AcceptCharSet:='win dows-1251,utf-8;q=0.7,*;q=0.3';
idHttp1.Request.Referer:='http://twitter.com/';
idHttp1.Request.ContentType:='appli cation/x-www-form-urlencoded';
idHttp1.HandleRedirects:=true;
Data.Add('session[username_or_email]=MyLogin');
Data.Add('session[password]=MyPassword');


StrPage := idHttp1.Post('https://twitter.com/sessions?phx=1', Data);
memo1.Text:=StrPage;
Это приходит в ответ:
Цитата:
<script type="text/javascript">
//<![CDATA[

window.location.replace("https://" + window.location.hostname +
window.location.pathname + window.location.search + window.location.hash)

//]]>
</script>
Скрипт какой-то. Что это значит?

Затем попробовал отключить IdCookieManager1 и выпарсить cookies вручную, сделал так:

Цитата:
StrPage := idHttp1.Get('https://twitter.com'); //.Post('https://twitter.com/sessions?phx=1', Data);
for i:=0 to memo1.Lines.Count-1 do begin
if pos('Set-Cookie: ',memo1.Lines[i])<>0 then cookiesdata.Add(memo1.Lines[i]);
end;
cookiesdata.Text:=ansireplacestr(co okiesdata.Text,'','Set-Cookie: ');


idHttp1.Request.Host:='twitter.com' ;
idHttp1.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7';
idHttp1.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
idHttp1.Request.AcceptLanguage:='ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4';
idHttp1.Request.AcceptCharSet:='win dows-1251,utf-8;q=0.7,*;q=0.3';
idHttp1.Request.Referer:='http://twitter.com/';
idHttp1.Request.ContentType:='appli cation/x-www-form-urlencoded';
idHttp1.Request.CustomHeaders.Add(c ookiesdata.Text);
idHttp1.HandleRedirects:=true;
Data.Add('session[username_or_email]=dimsyn');
Data.Add('session[password]=187DimaS295');

StrPage := idHttp1.Post('https://twitter.com/sessions?phx=1', Data);
memo1.Text:=strpage;

Но в таком случае в ответ опять приходит просто главная страничка

Последний раз редактировалось trafbite; 27.01.2012 в 08:48.
trafbite вне форума Ответить с цитированием
Старый 27.01.2012, 11:51   #7
Mifody
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 215
По умолчанию

Цитата:
Сниффером посмотреть данные POST-запроса не получается
HTTPAnalyzer'ом смотрите? если да, то данные не уходят, он https отлично ловит

Код:
https://twitter.com/sessions?phx=1
ну, в принципе, "ближе к телу", в смысле сам адрес, а вот в самом запросе не хватает параметров

Цитата:
можно попробовать посмотреть в Мозилле, там есть плагин к самой Мозилле для просмотра запросов, думаю он может http посмотреть.
Уважаемый Пепел Феникса, не в обиду, но этот совет не совсем спасет ситуацию. Если серьезно заниматься авторизациями и отправкой сообщений - планит 100% не спасет ситуацию. А уж с отправкой сообщений на твиттер - это точно. Вариант только один - ставить снифер в виде программы. Я всегда рекомендую HTTPAnalyzer, меня он еще никогда не подводил, точнее был один случай - но там скорее всего проблема в моей заинтересованности к реалзации проекта.
Помог с вопросом - тыркаем в весы, Вам не сложно, а мне приятно
Mifody вне форума Ответить с цитированием
Старый 27.01.2012, 12:30   #8
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Цитата:
ну, в принципе, "ближе к телу", в смысле сам адрес, а вот в самом запросе не хватает параметров
хм... я тут попробовал добавить
Цитата:
idHttp1.HandleRedirects:=false;
Теперь в ответ приходит 302 - это, я так понимаю, есть гуд!

Теперь задача перейти в свой аккаунт не потеряв кукисы. Не поможете?
trafbite вне форума Ответить с цитированием
Старый 27.01.2012, 13:10   #9
Mifody
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 215
По умолчанию

ну, если кукисменеджер подключен, то не должны потерять. Хотя х/з я с индей давно уже на работал.
Помог с вопросом - тыркаем в весы, Вам не сложно, а мне приятно
Mifody вне форума Ответить с цитированием
Старый 27.01.2012, 13:22   #10
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

В общем решил сделать обработку исключения вот так:
Цитата:
idHttp1.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
idHttp1.Request.AcceptCharSet:='win dows-1251,utf-8;q=0.7,*;q=0.3';
idHttp1.Request.AcceptLanguage:='ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4';
idHttp1.Request.Connection:='keep-alive';
idHttp1.Request.ContentType:='appli cation/x-www-form-urlencoded';
idHttp1.Request.Host:='twitter.com' ;
idHttp1.Request.Referer:='https://twitter.com/';
idHttp1.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7';
idHttp1.HandleRedirects:=false;

Data.Add('session[username_or_email]=login');
Data.Add('session[password]=password');

idHttp1.post('https://twitter.com/sessions?phx=1', data);


except on e : EIDHttpProtocolException do begin
if e.ErrorCode = 302 then
begin
try
//вот после post-запроса пробую перейти на главную - туда редиректит после авторизации в браузере - там и должен быть мой аккаунт.
Memo1.text:=idhttp1.Get('http://twitter.com');
except on e:Exception do
// предусматриваем, что исключение может возникнуть и тут
ShowMessage('Ошибка при получении нового адреса.'+e.Message);
end;
end
else
//http 404, 501 и так далее
ShowMessage('Ошибка другого вида, не 302:'+e.Message);
end;

on e:Exception do
ShowMessage('Ошибка: ' + e.Message);
end;
Но, блин, в Memo1 получаю просто код главной страницы, т.е. я не авторизовался.

HTTP Analyzer-ом проверил - приложение post-запрос отправляет, получает какой-то ответ.
Вот какие параметры нужно сверить проверить, что бы понять что именно я неправильно делаю?

p.s.: плохо что на форуме нет синтаксиса Delphi.
И вообще, в дальнейшем планирую довольно плотно работать с сетью. Многие советуют переходить на C#, есть ли смысл? Или же все-таки продолжать с Delphi?

Последний раз редактировалось trafbite; 27.01.2012 в 13:58.
trafbite вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
https авторизация, обычный POST запрос не получается нужна какая дополнительная деталь temkas C# (си шарп) 1 06.12.2011 08:26
Https и GET запрос xakkkkker Работа с сетью в Delphi 1 30.10.2011 10:05
POST запрос на HTTPS Arsenx777 Работа с сетью в Delphi 3 12.10.2011 09:36
Передача данных Post на HTTPS talero Работа с сетью в Delphi 11 16.12.2009 03:06
HTTPS и POST Alex_C Работа с сетью в Delphi 4 25.10.2007 21:04