Дальше будет немножко кода на делфи, описывать что куда и зачем - лень, кому надо тот поймет что и как происходит.
Порядок действий:
User.OAuth();
User.GetToken();
User.MrPage2();
User.Auth();
User.AutoLogin();
User.RunClient(); // <= Сей пункт по желанию, и реализовывать самим =)
Ну а теперь слегка побольше кода, а именно тела всех вышеперечисленных функций, проверку на ошибки и прочее подобное оставляю на вашей совести, у меня такого не будет(по крайней мере в этот раз) =)
OAuth:
Код:
Function TUser.OAuth:boolean;
Var
ls : TStringList;
begin
ls:=TStringList.Create;
ls.Clear;
ls.Add('client_id=gamecenter.mail.ru');
ls.Add('grant_type=password');
ls.Add('username='+Login);
ls.Add('password='+Password);
_last_str:=IdHTTP1.Post('https://o2.mail.ru/token',ls);
Result:=IdHTTP1.ResponseCode=200;
ls.Free;
end;
GetToken:
Код:
Function TUser.GetToken;
Var
FJSONObject : TJSONObject;
i:Integer;
begin
FJSONObject:=TJSONObject.ParseJSONValue(_last_str) as TJSONObject;
if Assigned(FJSONObject) then
Begin
for I := 0 to FJSONObject.Size-1 do
with FJSONObject.Get(i) do
Begin
if JsonString.Value='expires_in' then expires_in := JsonValue.Value;
if JsonString.Value='refresh_token' then refresh_token := JsonValue.Value;
if JsonString.Value='access_token' then access_token := JsonValue.Value;
if JsonString.Value='error' then
End;
Result:=True;
End;
end;
MrPage2:
Код:
Function TUser.MrPage2;
Var
ls : TStringList;
xml : TXMLDocument;
resp : string;
begin
ls:=TStringList.Create;
ls.Clear;
ls.Add('<?xml version="1.0" encoding="UTF-8"?><MrPage2 SessionKey="'+access_token+'" Page="http://dl.mail.ru/robots.txt"/>');
IdHTTP1.HTTPOptions:=[hoKeepOrigProtocol];
IdHTTP1.Request.UserAgent:= 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Downloader/12430 MailRuGameCenter/1243 Safari/537.36';
IdHTTP1.Request.Accept := '*/*';
IdHTTP1.Request.AcceptEncoding:='';
resp:=IdHTTP1.Post('https://authdl.mail.ru/ec.php?hint=MrPage2',ls);
ls.Free;
Result:=IdHTTP1.ResponseCode=200;
xml := TXMLDocument.Create(Self);
xml.LoadFromXML(resp);
xml.Active:=True;
_last_str:=xml.ChildNodes.Get(1).Attributes['Location'];
xml.Free;
end;
Auth:
Код:
Function TUser.Auth;
Var
ls : TStringList;
xml : TXMLDocument;
resp : string;
begin
ls:=TStringList.Create;
ls.Clear;
IdHTTP1.AllowCookies:=True;
IdHTTP1.Get(_last_str); //Готовтесь ловить исключение, оно тут будет и это норма.
Result:=IdHTTP1.ResponseCode=302;
Mpop:=IdHTTP1.CookieManager.CookieCollection[IdHTTP1.CookieManager.CookieCollection.GetCookieIndex('MPop')].Value;
IdHTTP1.AllowCookies:=false;
IdHTTP1.CookieManager.CookieCollection.Clear;
IdHTTP1.HTTPOptions:=[hoKeepOrigProtocol];
ls.Text:='<?xml version="1.0" encoding="UTF-8"?><Auth Soft="1" Cookie="'+Mpop+'" AppId="" ChannelId="27"/>';
resp:=IdHTTP1.Post('https://authdl.mail.ru/ec.php?hint=Auth',ls);
xml := TXMLDocument.Create(Self);
xml.Active:=True;
xml.LoadFromXML(resp);
SessionKey :=xml.ChildNodes.Get(1).Attributes['SessionKey'];
Uid :=xml.ChildNodes.Get(1).Attributes['Uid'];
RefreshToken :=xml.ChildNodes.Get(1).Attributes['RefreshToken'];
AppKey :=xml.ChildNodes.Get(1).Attributes['AppKey'];
xml.Free;
ls.free;
end;
AutoLogin:
Код:
Function TUser.AutoLogin;
Var
ls : TStringList;
xml : TXMLDocument;
resp : string;
begin
ls:=TStringList.Create;
ls.Clear;
IdHTTP1.HTTPOptions:=[hoKeepOrigProtocol];
ls.Text:='<?xml version="1.0" encoding="UTF-8"?><AutoLogin ProjectId="1000146" SubProjectId="0" ShardId="1" Mpop="'+Mpop+'"/>';
resp:=IdHTTP1.Post('https://authdl.mail.ru/sz.php?hint=AutoLogin',ls);
Result:=IdHTTP1.ResponseCode=200;
xml := TXMLDocument.Create(Self);
xml.Active:=True;
xml.LoadFromXML(resp);
PersId :=xml.ChildNodes.Get(1).Attributes['PersId'];
Key :=xml.ChildNodes.Get(1).Attributes['Key'];
xml.Free;
ls.Free;
end;
За сим можно откланятся, но всёж напомню тем кто дочитал, этот код не годится для копипаста и использования в бою, был написан за одно утро на коленке, и мне лень с ним что то делать в данный момент.