Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Авторизация с использованием Synapse


Автор: TechnoMag 5.11.2010, 17:34
Не могу авторизоваться на сайте используя synapse.

Код

      procedure TForm1.CreateHeader;
      begin
          http.Headers.Clear;
          http.Headers.Add('Content-Language: ru');
          http.Headers.Add('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
          http.Headers.Add('Accept-Language: ru,en-us;q=0.7,en;q=0.3');
          http.Headers.Add('Accept-CharSet: windows-1251,utf-8;q=0.7,*;q=0.7');
          http.Headers.Add('Accept-Encoding: windows-1251');
          http.Headers.Add('Referer: http://www.avito.ru/profile');
      end;
       
      function TForm1.Login:boolean;
      var
        Data:TStringStream;
        s:String;
      begin
          result:=false;
          HTTP.HTTPMethod('get', 'http://www.avito.ru/profile');
          HTTP.Clear;
          HTTP.Document.Clear;
          boundary := '----------------------------SynapseBoundary';
          HTTP.MimeType:='multipart/form-data; boundary='+boundary;
          HTTP.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)';
          CreateHeader;
       
          Data := TStringStream.Create('');
          S := boundary + CRLF;
          S := S +'Content-Disposition: form-data; name="login"' + CRLF + CRLF;
          S := S + 'login' + CRLF + boundary + CRLF;
          S := S +'Content-Disposition: form-data; name="password"' + CRLF + CRLF;
          S := S + 'password' + CRLF + boundary + CRLF;
          S := S +'Content-Disposition: form-data; name="submit"' + CRLF + CRLF;
          S := S + 'logon' + CRLF + boundary + '--' + CRLF;
       
       
          HTTP.Document.LoadFromStream(Data);}
          HTTP.Document.Write(PAnsiChar(S)^, Length(S));//записали строку
          if HTTP.HTTPMethod('post', 'http://www.avito.ru/profile') then
            begin
              Memo1.Lines.AddStrings(HTTP.Headers);
              Memo1.Lines.AddStrings(HTTP.Cookies);
              Memo1.Text:=Memo1.Text + HTTP.ResultString;
              HTTP.Document.SaveToStream(Data);
              Memo1.Text:=Data.DataString;
              if (pos('/profile/exit', Data.DataString)>0) then
              begin
                ShowMessage('Авторизовались!');
                Result:=true;
              end
              else
              begin
                ShowMessage('Логин или пароль введены неверно!');
                Result:=false;
              end;
            end;
         Data.Free;
      end;

Автор: knyshow 22.11.2010, 23:38
ничего не понял из написанного %)

попробуй по аналогии с вот этим кодом:

Код

    threadACTION.HTTP.MimeType:='application/x-www-form-urlencoded';

    post_fields:=TStringStream.Create('user=' + options.GR_username + '&pass=' + options.GR_password + '&entrance=Login');

    threadACTION.HTTP.Document.LoadFromStream(post_fields);

    res := threadACTION.HTTP.HTTPMethod('POST', options.GR_list[options.GR_id].url_auth);

    if res then begin
        if (threadACTION.HTTP.ResultCode = 302) then begin


всегда только так и авторизуюсь везде, где нужен POST, а в твоем примере все как-то заморочено.

Автор: TechnoMag 23.11.2010, 15:54
Цитата(knyshow @ 22.11.2010,  22:38)
ничего не понял из написанного %)

попробуй по аналогии с вот этим кодом:

Код

    threadACTION.HTTP.MimeType:='application/x-www-form-urlencoded';

    post_fields:=TStringStream.Create('user=' + options.GR_username + '&pass=' + options.GR_password + '&entrance=Login');

    threadACTION.HTTP.Document.LoadFromStream(post_fields);

    res := threadACTION.HTTP.HTTPMethod('POST', options.GR_list[options.GR_id].url_auth);

    if res then begin
        if (threadACTION.HTTP.ResultCode = 302) then begin


всегда только так и авторизуюсь везде, где нужен POST, а в твоем примере все как-то заморочено.

Ага, так у меня получалось.
Но ведь браузер отправляет multipart/form-data! Разницу чувствуешь?
После многих попыток отправить POST с типом multipart/form-data, напрашивается вывод, что synapse умеет отправлять POST только с типом application/x-www-form-urlencoded.
Но если нужно отправить например файл, то вариант с application/x-www-form-urlencoded не подходит.

Автор: Mifody 9.12.2010, 18:16
Цитата

synapse умеет отправлять POST только с типом application/x-www-form-urlencoded


хм, разве?
Дома погляну исходники, помница мне я довольно успешно отправлял файлы с помошью synapse.
Кстати, запросы снифили? Совпадают с браузером?

Автор: TechnoMag 12.12.2010, 01:34
Цитата(Mifody @ 9.12.2010,  17:16)
Цитата

synapse умеет отправлять POST только с типом application/x-www-form-urlencoded


хм, разве?
Дома погляну исходники, помница мне я довольно успешно отправлял файлы с помошью synapse.
Кстати, запросы снифили? Совпадают с браузером?

Снифил, совпадают полностью.

Автор: Ryhor 15.12.2010, 14:53
    boundary := '---------------------------xxxxxxxxxxxxxxx';

и  

    Data := TStringStream.Create('');
    S := '--'+boundary + CRLF;
    S := S +'Content-Disposition: form-data; name="login"' + CRLF + CRLF;
    S := S + 'xxx' + CRLF +'--'+boundary + CRLF;
    S := S +'Content-Disposition: form-data; name="password"' + CRLF + CRLF;
    S := S + 'xxx' + CRLF + '--'+boundary + CRLF;
    S := S +'Content-Disposition: form-data; name="submit"' + CRLF + CRLF;
    S := S + 'logon' + CRLF + '--'+boundary + '--' + CRLF;

Автор: TechnoMag 15.12.2010, 15:01
Цитата(Ryhor @ 15.12.2010,  13:53)
boundary := '---------------------------xxxxxxxxxxxxxxx';

и  

    Data := TStringStream.Create('');
    S := '--'+boundary + CRLF;
    S := S +'Content-Disposition: form-data; name="login"' + CRLF + CRLF;
    S := S + 'xxx' + CRLF +'--'+boundary + CRLF;
    S := S +'Content-Disposition: form-data; name="password"' + CRLF + CRLF;
    S := S + 'xxx' + CRLF + '--'+boundary + CRLF;
    S := S +'Content-Disposition: form-data; name="submit"' + CRLF + CRLF;
    S := S + 'logon' + CRLF + '--'+boundary + '--' + CRLF;

Спасибо. Заработало. Не думал, что разница в "--" окажется существенной.

Автор: Ryhor 15.12.2010, 15:06
Каждый байт играет роль! Помни это!

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