[Delphi 2009] Проблема с Indy

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by crazyserega1994, 8 May 2010.

  1. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    Добрый вечер! При попытке GET запроса на любую страницу, вместо Русских символом вижу:
    Code:
     'Áûñòðîå ðåäàêòèðîâàíèå'
    Из-за этого не возможно спарсить страницу, только английский норм показывает >_>
     
  2. TrueBit

    TrueBit Member

    Joined:
    21 Nov 2009
    Messages:
    71
    Likes Received:
    19
    Reputations:
    4
    Utf8toAnsi
     
  3. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    Есть еще 1 проблема, если в потоке делаю Post запрос, то все команды которые находятся после этого Post'a, не выполняются! В чем может быть проблема?
     
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Скинь часть кода, в которой выполняешь POST запрос.
     
  5. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    HTML:
    procedure Thread.SendSMS;
    var data:tstringlist;
        page:string;
        Stream:tmemorystream;
        param:TidMultiPartFormDataStream;
        i:integer;
        temp:string;
        hid:string;
        now:TDateTime;
        code1:string;
        number1:string;
        HTTP:tidhttp;
        HTTP2:tidhttp;
    begin
    if GetNumber = true then
    begin
    code1:=code;
    number1:=number;
    form1.sMemo2.Lines.Add(code1);
    form1.sMemo2.Lines.Add(number1);
    now:=time;
    HTTP:=tidhttp.Create(nil);
    HTTP2:=tidhttp.Create(nil);
    HTTP2.AllowCookies:=true;
    http2.HandleRedirects:=true;
    param:=TidMultiPartFormDataStream.Create;
    Stream:=tmemorystream.Create;
    data:=tstringlist.Create;
    HTTP.AllowCookies:=true;
    http.HandleRedirects:=false;
    try
    page:=http.Get('http://www.mts.com.ua/ukr/sendsms.php');
    delete(page,1,pos('captcha.php',page)+11);
    page:=copy(page,1,pos('"',page)-1);
    hid:=page;
    now:=time;
    form1.sMemo2.Lines.Add('['+Timetostr(now)+']: Получаем капчу...');
    http.Get('http://www.mts.com.ua/back/modules/golden/captcha.php?'+page,stream);
    now:=time;
    form1.sMemo2.Lines.Add('['+Timetostr(now)+']: Капча полученна, отправляем капчу...');
    stream.Position:=0;
    stream.SaveToFile(ExtractFilePath( Application.ExeName )+hid+'.jpeg');
    param.AddFormField('method','post');
    param.AddFormField('key',form1.sEdit1.Text);
    param.AddFile('file',ExtractFilePath( Application.ExeName )+hid+'.jpeg','image/jpeg');
    page:=http2.Post('http://antigate.com/in.php',param);
    delete(page,1,3);
    for i:=1 to 100 do
    begin
      sleep(1000);
      temp:=http2.Get('http://antigate.com/res.php?key='+form1.sEdit1.Text+'&action=get&id='+page);
      if pos('OK|',temp) > 0 then
      begin
        delete(temp,1,3);
        break;
      end;
      if pos('ERROR',temp) > 0 then begin
      now:=time;
      form1.sMemo2.Lines.Add('['+Timetostr(now)+']: Произошла ошибка на сервие AntiCaptcha: '+ temp);
      Exit;
      end;
    end;
    now:=time;
    form1.sMemo2.Lines.Add('['+Timetostr(now)+']: Капча разгаданна, SMS отправленно!');
    data.Add('script=/ukr/sendsms.php');
    data.Add('sms_tag_id=3');
    data.Add('network1=38'+code1);
    data.Add('phone1='+number1);
    data.Add('message='+form1.sMemo1.Text);
    data.Add('lang=lat');
    data.Add('captcha='+temp);
    http.Post('http://www.mts.com.ua/back/modules/sms/db_sms.php',data);
    form1.smemo2.Lines.Add('LOL');
    finally
      data.Free;
      http.Free;
      stream.Free;
      param.Free;
      http2.Free;
      DeleteFile(ExtractFilePath( Application.ExeName )+hid+'.jpeg');
    end;
    end;
    end;
    После строчки http.Post('http://www.mts.com.ua/back/modules/sms/db_sms.php',data); уже ничего не работает, хотя пост запрос выполняется(смс приходит)
     
  6. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Все очень просто.
    Когда ты делаешь последний запрос (на http://www.mts.com.ua/back/modules/sms/db_sms.php), сервак отвечает тебе кодом 302, благодаря чему Indy генерит исключение, и программа сразу же переходит к блоку finally.

    Решения:
    1) Попробуй заменить строчку
    Code:
    http.HandleRedirects:=false;
    на
    Code:
    HTTP.HandleRedirects := True;
    2) Если предыдущий вариант не поможет, то попробуй убрать блок
    Code:
    try
    ..
    finally
    ..
    end;
     
  7. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Это тоже не поможет, т.к. исключение не обрабатывается.
    Надо обернуть запрос в try except end;
     
  8. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    Когда появилась ошибка, я начал эксперементировать с Handleredirects, и результат был нулевой, просто забыл поставить на true, но я решил эту проблему, обьявив 3 tidhttp, создал кукимененджер, и соедил кукименеджер с http и http3, пост отправляю с http3, и все работает, хотя и быдло код :3
     
  9. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    Не помогло
     
  10. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Так попробуй
    var
    stream : TStringStream; s : string;
    begin
    stream := TStringStream.Create('', TEncoding.Utf8);
    IdHttp1.Get(URL, stream);
    s := stream.DataString;
    stream.Free;
    end;
     
  11. crazyserega1994

    crazyserega1994 Elder - Старейшина

    Joined:
    25 Dec 2007
    Messages:
    27
    Likes Received:
    3
    Reputations:
    0
    Так не работает, попробовал TEncoding.Default и заработало, может можно еще как-то сделать? А то слишком муторно :\
     
  12. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Заверни этот код в отдельную функцию и будет не муторно