Пытаюсь авторизироваться на mail.ru. Вот код: Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdServerIOHandler; type TForm1 = class(TForm) IdHTTP1: TIdHTTP; Button1: TButton; Memo1: TMemo; IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var params,responseres:tstringlist; begin params:=TStringList.Create; responseres:=TStringList.Create; params.Add('Login=бла'); params.Add('Domain=mail.ru'); params.Add('Password=бла'); memo1.Text:=idhttp1.Post('https://auth.mail.ru/cgi-bin/auth',params); if Pos('logout',memo1.Text)>0 then ShowMessage('ок!'); params.free; responseres.free; end; end. Не могу, выдаёт ошибку при подключении IdSSLIOHandlerSocketOpenSSL, а его как я понимаю надо подключать полюбому, раз httpS, у меня. Может есть у кого нить уже готовые примеры, или просто подскажите пожалуйста. Ошибка: iohandler value is not valid. как будто IdSSLIOHandlerSocketOpenSSL вообще нет. В чём проблема?
Не вижу у тебя связки компонента TidHTTP и IdSSLIOHandlerSocketOpenSSL. Code: IdHTTP1.IOHandler:=TIdSSLIOHandlerSocketOpenSSL.Create;
По идее должно работать, вот тут решении подобной проблемы: Code: http://programmersforum.ru/showthread.php?t=61587 Либо не хватает этих либ. libeay32.dll и ssleay32.dll
спасибо, после того как вы написали про библиотеки я до меня дошло, что надо было просто сохранить проект))Всё запрос не выдаёт ошибки. Но тут другая проблема образовалась в ответ на мой запрос выдаёт следующие: HTML: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head><title>@MAIL.RU: авторизация</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <script language="JavaScript"><!-- window.location.replace("http://e.mail.ru/cgi-bin/msglist?back=1"); // --></script> <meta http-equiv="refresh" content="0;url=http://e.mail.ru/cgi-bin/msglist?back=1"> </head> <body></body> </html> Вот полный код проги: Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdServerIOHandler, IdCookieManager; type TForm1 = class(TForm) IdHTTP1: TIdHTTP; Button1: TButton; Memo1: TMemo; IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; IdCookieManager1: TIdCookieManager; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var params,responseres:tstringlist; begin params:=TStringList.Create; responseres:=TStringList.Create; params.Add('Login=1233'); params.Add('Domain=mail.ru'); params.Add('Password=123321Login=1233); params.Add('Domain=mail.ru'); params.Add('Password=123321'); memo1.Text:=idhttp1.Post('https://auth.mail.ru/cgi-bin/auth',params); if Pos('logout',memo1.Text)>0 then ShowMessage('Авторизовались!'); params.free; responseres.free; end; end. Прикрутил куки, и поправил запрос, сделал всё так жу как в снифере. Но всё равно авторизироваться нормально не могу
HTTP.REQUEST.USERAGENT существующий попробуй указать. С Мэйл.ру не работал, но недавно проблема в этом была с другим сайтом
Исходя из твоего кода, возникает вопрос... Что это? Code: params.Add('Login=1233'); params.Add('Domain=mail.ru'); params.Add('Password=123321Login=1233); params.Add('Domain=mail.ru'); params.Add('Password=123321'); Вот данные которые должны передаваться: Code: Login=MyLogin&Domain=mail.ru&Password=MyPass Login=MyLogin Domain=mail.ru Password=MyPass У тебя же передается два раза Domain, и два раза Password, один из которых подвергся слитию с логином, а первым из паролей у тебя передается как раз неверный
Это я тупа со снифера снял запрос, я читал, то надо всего три значения передавать, но я подумал, что со снифа вернее будет. HTTP.REQUEST.USERAGENT Не помогло.
Решение. В общем пока курил, скачал дельфу, установил, скачал библиотеки, кинул в папку с прогой, вспомнил вообще куда тыкать что бы создать проект ... К чему я это... Code: [COLOR=Green][B]Server: nginx/0.7.62 Date: Sat, 19 Aug 2011 10:57:27 GMT Content-Type: text/html; charset=utf-8 Connection: close P3P: CP="NON CUR OUR IND UNI INT" Set-Cookie: t=obLD1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAABABAHxgAAAAAAAAAAAAAAAIAAAAAAAAAAcA; expires=Thu, 16 Feb 2012 10:57:27 GMT; path=/; domain=.mail.ru Set-Cookie: Mpop=1313870247:7f74717a7f785b6f6a51e494a415900481658565c5d1a2190502190f1d081b0307044454cd5e465e050401010b1e087405:MyLogin@mail.ru:; expires=Fri, 18 Nov 2011 10:57:27 GMT; path=/; domain=.mail.ru Set-Cookie: mid=7cac716b; expires=Thu, 16 Feb 2012 10:57:27 GMT; path=/; domain=.mail.ru Set-Cookie: mrcu=943E4E50EDCD0100011A7052007F; expires=Tue, 17 Aug 2021 10:57:27 GMT; path=/; domain=.mail.ru Cache-Control: no-cache,no-store,must-revalidate Pragma: no-cache Expires: Fri, 20 Aug 2010 10:57:27 GMT Last-Modified: Sat, 19 Aug 2011 10:57:27 GMT Content-Length: 430 X-Host: f97.mail.ru X-XSS-Protection: 0[/B][/COLOR] Это ответ сервера на удачный логин, я авторизовался. Вот код, который накидал я: Code: unit mail; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdTCPConnection, IdTCPClient, IdHTTP, IdCookieManager, IdBaseComponent, IdComponent, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL, StdCtrls; type TForm1 = class(TForm) Button1: TButton; IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket; IdCookieManager1: TIdCookieManager; IdHTTP1: TIdHTTP; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var http : TidHTTP; cook : TidCookieManager; SSL : TIdSSLIOHandlerSocket; send_data : TStringList; StrPage : string; begin try http := TIdHTTP.Create(Self); send_data := TStringList.Create; cook := TidCookieManager.Create(http); SSL := TIdSSLIOHandlerSocket.Create(http); http.AllowCookies := true; http.CookieManager := cook; http.HandleRedirects := true; http.IOHandler := SSL; SSL.SSLOptions.Method:= sslvTLSv1; Http.Request.Host:='auth.mail.ru'; Http.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10'; Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; Http.Request.AcceptLanguage:='ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'; Http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7'; Http.Request.Referer:='http://www.mail.ru/'; send_data.Add('Login=mylogin'); send_data.Add('Domain=mail.ru'); send_data.Add('Password=mypass'); StrPage:= http.Post('https://auth.mail.ru/cgi-bin/auth',send_data); //Теперь в стрпэйдж твой ответ, либо смотрим заголовки http.Response.RawHeaders.Text finally send_data.Free; cook.Free; http.Free; end; end; Я верю в тебя дружище, у тебя в любом случае должно получиться! удачи. ---- p.s. http://zalil.ru/31583061 - Это на случай если твой дельфи покарают динозавры, исходники, экзешник, порнография - в общем все самое необходимое, также библиотеки для работы ссл.
Я хз ка у тебя получилось, но у меня тот же результат. Я поправил несколько синтаксических ошибок и вот что вышло: Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdServerIOHandler, IdCookieManager; type TForm1 = class(TForm) IdHTTP1: TIdHTTP; Button1: TButton; Memo1: TMemo; IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; IdCookieManager1: TIdCookieManager; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var http : TidHTTP; cook : TidCookieManager; SSL : TIdSSLIOHandlerSocketOpenSSL; send_data : TStringList; StrPage : string; begin try http := TIdHTTP.Create(Self); send_data := TStringList.Create; cook := TidCookieManager.Create(http); SSL := TIdSSLIOHandlerSocketOpenSSL.Create(http); http.AllowCookies := true; http.CookieManager := cook; http.HandleRedirects := true; http.IOHandler := SSL; SSL.SSLOptions.Method:= sslvTLSv1; Http.Request.Host:='auth.mail.ru'; Http.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10'; Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; Http.Request.AcceptLanguage:='ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'; Http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7'; Http.Request.Referer:='http://www.mail.ru/'; send_data.Add('Login=123'); send_data.Add('Domain=mail.ru'); send_data.Add('Password=321'); StrPage:= http.Post('https://auth.mail.ru/cgi-bin/auth',send_data); memo1.Text:=strpage; if pos('logout',memo1.Text)>0 then begin memo1.Clear; memo1.Lines.Add('есть контакт!'); end; //Теперь в стрпэйдж твой ответ, либо смотрим заголовки http.Response.RawHeaders.Text finally send_data.Free; cook.Free; http.Free; end; end; end. Вот ответ: HTML: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head><title>@MAIL.RU: авторизация</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <script language="JavaScript"><!-- window.location.replace("http://e.mail.ru/cgi-bin/msglist?back=1"); // --></script> <meta http-equiv="refresh" content="0;url=http://e.mail.ru/cgi-bin/msglist?back=1"> </head> <body></body> </html> Если дабавляю вот эту строчку: Code: memo1.Text:= http.get('http://e.mail.ru/cgi-bin/msglist?back=1'); то в ответе страница, но заветного logout на ней нет! (немогу вставить ответ он больно большой, не позволяет) Вообщем, нифига нет результата, или я, что то упустил?
Ладно. Всё куда проще чем кажется. Не нужно никаких библиотек, https протоколв и прочий лабуды. Всё делается одной строчкой http.Get('http://e.mail.ru/cgi-bin/enableuser?login='+login+'&domain='+domain+'&Password='+pass);
Ну да http.Get('http://e.mail.ru/cgi-bin/enableuser?login='+login+'&domain='+domain+'&Password='+utf8encode(pass));
Сразу валишь на главную, гребешь кукисы, а потом уже лезишь авторизироваться... А и про реферер не забудь.
Код такой: Code: unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdTCPConnection, IdTCPClient, IdHTTP, IdComponent, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdBaseComponent, IdCookieManager, StdCtrls; type TForm2 = class(TForm) IdCookieManager1: TIdCookieManager; IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; IdHTTP1: TIdHTTP; Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); var http : TidHTTP; cook : TidCookieManager; SSL : TIdSSLIOHandlerSocketOpenSSL; send_data : TStringList; StrPage : string; begin try http := TIdHTTP.Create(Self); send_data := TStringList.Create; cook := TidCookieManager.Create(http); SSL := TIdSSLIOHandlerSocketOpenSSL.Create(http); http.AllowCookies := true; http.CookieManager := cook; http.HandleRedirects := true; http.IOHandler := SSL; SSL.SSLOptions.Method:= sslvTLSv1; Http.Request.Host:='auth.mail.ru'; Http.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10'; Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; Http.Request.AcceptLanguage:='ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'; Http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7'; Http.Request.Referer:='http://www.mail.ru/'; memo1.Text:= http.Get('http://e.mail.ru/cgi-bin/enableuser?login=123321111233&domain=mail.ru&Password=utf8encode(123321)');//не уверен в этой строке. Всё ли правильно? if pos('logout',memo1.Text)>0 then begin memo1.Clear; memo1.Lines.Add('ЕСТЬ!!!!'); end; finally end; end; end. Вот скрин ответа: http://i042.radikal.ru/1108/3d/1322aba7a4a9.png Что опять не так?
Я авторизуюсь так http://win.mail.ru/cgi-bin/auth?Login=" + login + "&Password=" + pass + "&Domain=" + domen + "&level=1