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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2011, 23:24   #1
N0iD
Пользователь
 
Аватар для N0iD
 
Регистрация: 05.05.2010
Сообщений: 50
Хорошо

Доброго времени суток, уже два дня бьюсь с пост запросами и толку мало, все что в сниффере при запросе передаю, а один фиг не авторизируется.
Вообщем, возник вопрос, от чего влияет вот эта строка?
Сниффер при логине показывает:
(Request-Line) POST / HTTP/1.1
ввожу все те же самые данные, но мой вариант посылает
(Request-Line) POST / HTTP/1.0

Последний раз редактировалось mihali4; 16.11.2011 в 02:57.
N0iD вне форума Ответить с цитированием
Старый 15.11.2011, 01:35   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

параметр HTTPVersion помоему.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.11.2011, 02:14   #3
N0iD
Пользователь
 
Аватар для N0iD
 
Регистрация: 05.05.2010
Сообщений: 50
По умолчанию



Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  Http  : TidHttp;
  CM    : TidCookieManager;
  Data  : TStringList;
  StrPage :  String;
begin
  try
    Http := TIdHTTP.Create(Self);
    Data := TStringList.Create;
    CM := TidCookieManager.Create(Http);
    Http.AllowCookies := true;
    Http.CookieManager := CM;
    Http.HandleRedirects := true;
    Http.Request.Host:='www.free-lance.ru';
    Http.Request.Connection:='keep-alive';
    Http.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2';
    Http.Request.ContentType:='application/x-www-form-urlencoded';
    Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
    Http.Request.Referer:='www.free-lance.ru';
    Http.Request.AcceptEncoding:='gzip,deflate,sdch';
    Http.Request.AcceptLanguage:='ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4';
    Http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.3';
    Http.AllowCookies:=True;
    Http.HandleRedirects := True;
    Data.Add('action=login');
    Data.Add('login='+Edit3.Text);
    Data.Add('passwd='+Edit4.Text);
    StrPage := Http.Post('www.free-lance.ru', Data);
  finally
    Data.Free;
    CM.Free;

  end;
   Memo1.Lines.Text:=StrPage;
UPD.1
После этого всего текст в мемо:
И получается что не получается ни чего,чего можно было бы спарсить, на предмет авторизации.

UPD.2
Если значению Http.HandleRedirects присвоить false то, данный код по показаниям сниффера посылает и посылает POST. Программа подвисает. И в полученном контенте, видно что авторизация прошла успешно, тогда в чем дело? подскажите.
UPD.3 И куки получюся разными с браузера одни с программы другие.

Последний раз редактировалось N0iD; 15.11.2011 в 03:14. Причина: Добавление скрина сниффера и текста из мемо.
N0iD вне форума Ответить с цитированием
Старый 15.11.2011, 09:47   #4
Mifody
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 215
По умолчанию

1. запросо отправить на 'http://www.free-lance.ru'
2. Referer: http://www.free-lance.ru/
3. вместо 'gzip,deflate,sdch' - поставить '*/*' или 'hext/html', если очень хочется юзать запакованные данные, то разбираться с gzip, я для синапса Delphi + Synapse, получаем данные в GZIP, правда совсем чуть.
4. Host - нафига указывать?
5. с редиректом - тут по осторожнее, советую снифер поставить. У меня индя редирект делала тем же методом что и предидущий шаг (если был POST по и редерект обраватывался POST запросом), ловил кажись в событии OnRedirect, там тип запроса можно сменить
Помог с вопросом - тыркаем в весы, Вам не сложно, а мне приятно
Mifody вне форума Ответить с цитированием
Старый 15.11.2011, 16:54   #5
N0iD
Пользователь
 
Аватар для N0iD
 
Регистрация: 05.05.2010
Сообщений: 50
По умолчанию

Все равно не в куриваю, что именно нужно дописать.Сорри.
N0iD вне форума Ответить с цитированием
Старый 15.11.2011, 17:23   #6
Mifody
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 215
По умолчанию

Код:
Http.Request.Referer:='http://www.free-lance.ru';
Http.Request.AcceptEncoding:='text/html';
.....
StrPage := Http.Post('http://www.free-lance.ru', Data);
з.ы. посыпется спам на фрилансе - убью
Помог с вопросом - тыркаем в весы, Вам не сложно, а мне приятно
Mifody вне форума Ответить с цитированием
Старый 15.11.2011, 21:16   #7
N0iD
Пользователь
 
Аватар для N0iD
 
Регистрация: 05.05.2010
Сообщений: 50
По умолчанию

Mifody Не стоит беспокоиться, я являюсь иллюстратором и мне что бы мониторить ЛС на нескольких ресурсах по фрилансу, приходится тратить достаточно времени каждый день. Хочу просто сделать уведомление и не более, хотя в идеале еще хочу сделать о уведомлениее новых проектах.

К сожалению введенные изменения не принесли ожидаемого результата, снифер все же показывает что программа делает POST за POSTом.
Такая же проблема и с http://www.weblancer.net/, а вот с http://www.free-lancers.net/, нет такой проблемы, там авторизация проходит успешно и есть с чего парсить.

Вот малость другой способ, но результат тот же.
Код:
var
   LoginData:TStringlist;
   STRone: TStringlist;
begin
        IdHTTP1.HandleRedirects:=True;
        LoginData := TStringList.Create;
        STRone := TStringList.Create;
        LoginData.Add('action=login');
        LoginData.Add('login='+Edit1.Text);
        LoginData.Add('passwd='+Edit2.Text);
        STRone.text := idhttp1.post('http://www.free-lance.ru/',LoginData) ;

  if pos('Выйти',STRone.Text)<>0 then ShowMessage('Авторизировались!')
else
ShowMessage('Авторизация не удалась!');

LoginData.Free;
STRone.Free;
end;
Включил я в TRUE - IdHTTP1.HandleRedirects и редирект опять идет на туже страницу на которую делаeтся POST, без редиректа ошибка 302.

Последний раз редактировалось mihali4; 16.11.2011 в 02:38.
N0iD вне форума Ответить с цитированием
Старый 16.11.2011, 02:48   #8
N0iD
Пользователь
 
Аватар для N0iD
 
Регистрация: 05.05.2010
Сообщений: 50
По умолчанию

Вообщем гуглил я и вот что у меня получилось
Код:
uses httpsend;
....
function GetHTTPStr(http: THTTPSend): string;
var
  BodyStream: TStringStream;
  BodyS: TStringList;
begin
  try
    BodyS := TStringList.Create;
    BodyStream := TStringStream.Create(result);
    begin
      BodyS.LoadFromStream(http.Document);
      result := BodyS.Text;
    end;
  finally
    BodyStream.Free;
    BodyS.Free;
  end;
  http.Document.Seek(0, soFromBeginning);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  http: THTTPSend;
  params: string;
begin
  http := THTTPSend.Create;
  http.Document.Clear;
  http.Cookies.Clear;
  http.Headers.Clear;
  http.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2';
  http.Headers.Add('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
  http.Headers.Add('Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4');
  http.Headers.Add('Accept-Encoding: text/html');
  http.Headers.Add('Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3');
  http.Headers.Add('Keep-Alive: 115');
  http.Headers.Add('Proxy-Connection: keep-alive');
  http.Headers.Add('Referer: http://www.free-lance.ru/');
  HTTP.MimeType := 'application/x-www-form-urlencoded';
  params := 'action=login&login=ВАШ-ЛОГИН&passwd=ВАШ-ПАРОЛЬ';
  HTTP.Document.Write(Pointer(Params)^, Length(Params));
  http.HTTPMethod('POST', 'http://www.free-lance.ru/');
  Memo1.Lines.Text:=GetHTTPStr(http);
end;
end.
Вообщем работает, как я и хотел, теперь осталось это протестировать, на остальных сайтах.
С weblancer.net это не прокатило. Выход принудительно делать редирект после POST.
Код:
var
  HTTP    : THTTPSend;
  Res     : boolean;
  params  : string;
begin
  HTTP := THTTPSend.Create;
  http.Document.Clear;
  http.Cookies.Clear;
  http.Headers.Clear;
  http.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2';
  http.Headers.Add('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
  http.Headers.Add('Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4');
  http.Headers.Add('Accept-Encoding: text/html');
  http.Headers.Add('Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3');
  http.Headers.Add('Keep-Alive: 500');
  http.Headers.Add('Proxy-Connection: keep-alive');
  http.Headers.Add('Referer: http://www.weblancer.net/');
  HTTP.MimeType := 'application/x-www-form-urlencoded';
  params := 'action=login&return_url=%2F&login=ВАШ-ЛОГИН&password=ВАШ-ПАРОЛЬ&x=7&y=7';
  HTTP.Document.Write(Pointer(Params)^, Length(Params));
  Res:=http.HTTPMethod('POST', 'http://www.weblancer.net/account/login/');
  if Res then
   begin
    HTTP.Headers.Clear;
    HTTP.HTTPMethod('GET','http://www.weblancer.net/');
    Memo1.Lines.Text:=GetHTTPStr(http);
   end;
  end;
или же отслеживать код ответа 301, 302, 307 и искать ссылку на редирект.
Код:
function FoundLocationStrNum(Headers: TStringlist): integer;
var
  FoundStrPos, i   : integer;
begin
  Result:= -1;
  for i := 0 to Headers.Count do
  begin
    FoundStrPos := Pos('Location: ', Headers.Strings[i]);
    if FoundStrPos > 0 then
    begin
      Result:= i;
      exit;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  HTTP    : THTTPSend;
  Res     : boolean;
  n       : integer;
  f: TStringStream;
  params, NewURL  : string;
begin
  HTTP := THTTPSend.Create;
  http.Document.Clear;
  http.Cookies.Clear;
  http.Headers.Clear;
  http.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2';
  http.Headers.Add('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
  http.Headers.Add('Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4');
  http.Headers.Add('Accept-Encoding: text/html');
  http.Headers.Add('Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3');
  http.Headers.Add('Keep-Alive: 500');
  http.Headers.Add('Proxy-Connection: keep-alive');
  http.Headers.Add('Referer: http://www.weblancer.net/');
  HTTP.MimeType := 'application/x-www-form-urlencoded';
  params := 'action=login&return_url=%2F&login=ВАШ-ЛОГИН&password=ВАШ-ПАРОЛЬ&x=7&y=7';
  HTTP.Document.Write(Pointer(Params)^, Length(Params));
  Res:=http.HTTPMethod('POST', 'http://www.weblancer.net/account/login/');
  if Res then
   case HTTP.Resultcode of 301, 302, 307:
   begin
   n := FoundLocationStrNum(HTTP.Headers);
   if (n >= 0) and (n <= HTTP.Headers.count) then
    begin
   NewURL := StringReplace(HTTP.Headers.Strings[n],'Location: ','',[]);
   HTTP.Headers.Clear;
   HTTP.HTTPMethod('GET',NewURL);
   Memo1.Lines.Text:=GetHTTPStr(http);
   end;
   end;
   end;
   end;
Надеюсь это кому ни будь пригодится, главное не для спама.

Последний раз редактировалось mihali4; 16.11.2011 в 23:40.
N0iD вне форума Ответить с цитированием
Старый 16.11.2011, 10:55   #9
Mifody
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 215
По умолчанию

Оффтоп: ну наконец мой код хоть где-то пригодился
Помог с вопросом - тыркаем в весы, Вам не сложно, а мне приятно
Mifody вне форума Ответить с цитированием
Старый 20.11.2011, 02:50   #10
Megido
Новичок
Джуниор
 
Регистрация: 20.11.2011
Сообщений: 3
По умолчанию

Код:
<?php
$user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.13) ' . 
             'Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729)';

$cookie = '';

$login = xxxx';
$password = 'xxxx';

$ch = curl_init();


curl_setopt($ch,CURLOPT_HTTPHEADER,array('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4','Accept-Encoding: text/html','Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3','Keep-Alive: 115','Proxy-Connection: keep-alive','Referer: http://www.free-lance.ru/'));
// true т.к. мы будем отправлять post запрос:
curl_setopt($ch, CURLOPT_POST, true);  

// чтобы сайт думал, что мы - браузер:
curl_setopt($ch, CURLOPT_REFERER, 'http://www.free-lance.ru/login.php'); 
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); 
// ответ сервера будем записывать в переменную
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt($ch, CURLOPT_TIMEOUT, 10);

// по редиректам будем переходить автоматически.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

curl_setopt($ch, CURLOPT_URL, 'http://www.free-lance.ru/login.php');

$post = array( 
         'action' => 'login',
             'login' => $login,
             'passwd' => $password
         );



curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));


$answer = curl_exec($ch);




echo $answer; 

curl_close($ch);



?>
Megido вне форума Ответить с цитированием
Ответ


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