Показать сообщение отдельно
Старый 17.04.2017, 09:16   #1
ToRcH2565
Пользователь
Аватар для ToRcH2565
OFFLINE
Регистрация: 06.05.2016
Сообщений: 20
Благодарностей:
0 всего
Мнения: + 42
Репутация: 1

Для очень ленивых(авторизация)


Дальше будет немножко кода на делфи, описывать что куда и зачем - лень, кому надо тот поймет что и как происходит.

Порядок действий:

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;

За сим можно откланятся, но всёж напомню тем кто дочитал, этот код не годится для копипаста и использования в бою, был написан за одно утро на коленке, и мне лень с ним что то делать в данный момент.
 
Ответить с цитированием