[ Delphi / Pascal ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by begin_end, 28 Apr 2015.

  1. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Code:
    begin
    HTTP:=THTTPSend.Create;
    ip:=Copy(proxys[CurProxy],1,Pos(':', proxys[CurProxy])-1);
    port:=Copy(proxys[CurProxy], Pos(':', proxys[CurProxy])+1, Length(proxys[CurProxy]));
    http.ProxyHost:=ip;
    http.ProxyPort:=port;
    with THTTPSend.Create do
    begin
    if HTTPMethod('GET','http://www.ya.ru') then begin
    делаем всё как и при работе без прокси ...
    end;
    end
    else
    begin
    CurProxy:= CurProxy + 1;
    if CurProxy >= proxys.count -1 then CurProxy:=0;
    end;
    end;
    end;
    
    Ошибка Access violation adress (
    Чё то даже с одним прокси не работает ( который вписываю в ручную
     
    #161 triblekill, 27 Nov 2015
    Last edited: 27 Nov 2015
  2. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Всё таки получаю:
    Code:
    HTTP:=THTTPSend.Create;
    http.ProxyHost:='120.195.192.196';
    http.ProxyPort:='80';
    if http.HTTPMethod('GET','http://www.ya.ru') then begin
    Showmessage('Accept');
    
    Результат: сообщение Accept, а значит дело ещё в чём то !

    Вон оно чё =)

    Code:
    <HTML>
        <HEAD>
            <TITLE>Access Denied</TITLE>
            <META http-equiv=Content-Type content="text-html; charset=UTF-8">
        </HEAD>
        <BODY>
            <H1>Access Denied</H1>
            Your request has been denied by remote server.
            <P>Reference #0.4f7e059c.78c3c0c4.1448620684</P>
        </BODY>
    </HTML>
    
    Гугл запрещает работу с прокси ?
    А это просто такое прокси )
     
    #162 triblekill, 27 Nov 2015
    Last edited: 27 Nov 2015
  3. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Вам не надоело еще с copy/length маяться, когда все уже давно есть в классе TStrings?
    Code:
    var
      proxys: TStrings;
      curproxy:integer;
    begin
      ...
      proxys.LoadFromFile(opendialog1.FileName); try
    
        proxys.NameValueSeparator:= ':';
      
        for curproxy:= 0 to proxys.Count - 1 do begin
    
          ip:= proxys.Names[curproxy];
          port:= proxys.ValueFromIndex[curproxy];
        end;
    
      finally
        proxys.Free;
      end;
      ...
    
     
    binarymaster and triblekill like this.
  4. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Здорово ! Спасибо
     
  5. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Чё то не могу придумать как проверить а затем менять прокси если необходимо:

    Code:
    begin
    HTTP:=THTTPSend.Create;
    if http.HTTPMethod('get','http://www.google.ru') and (HTTP.ResultCode=200) then
    begin
    for :=0  do begin
    for :=0  do begin
    //Здесь самый основной кусок кода который никому нельзя показывать=)
    end;
    end;
    end
    else
    begin
    Здесь переключить на следующий рабочий прокси 
    и продолжить работу
    if http.HTTPMethod('get','http://www.google.ru') and (HTTP.ResultCode=200)
    пока опять не попадём сюда и так пока что то не кончится например прокси или строки в списке
    end;
     end;
    
     
  6. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    Вот так менять прокси
    Code:
    begin
       HTTP:= THTTPSend.Create();
    if Form2.RadioButton1.Checked = True then //(если активна то...)
    begin
       HTTP.ProxyHost:=ProxyHost;//хост
       HTTP.ProxyPort:=ProxyPort;//порт
    end;
    {Если нет то без прокси}
       HTTP.UserAgent:='Opera 9.0';
       http.Headers.Insert(0,'Referer: ');
       http.MimeType:='application/x-www-form-urlencoded';
      //HTTP.KeepAliveTimeout:= 10;
    if HTTP.HTTPMethod('GET',host) then
    begin
    а чекер прокси в инете найдешь,там полно.
     
  7. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Не с одним прокси а со списком ) которые переключаться будут )
     
  8. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Ну не ужели никто не подскажет как прокси поменять при редиректе ?

    Code:
    procedure TForm1.Button10Click(Sender: TObject);
    var
    url,k,rez:integer;
    http:thttpsend;
    str:string;
    begin
    HTTP:=THTTPSend.Create;
    
    if http.HTTPMethod('get',('http://www.google.ru')) and (HTTP.ResultCode=200) then
    begin
    for url:=0 to strtoint(sedit1.text) do begin
    for k:=0 to memo7.Lines.Count-1 do begin
    
    HTTP:=THTTPSend.Create;
    form1.Caption:=http.ProxyHost+';'+http.ProxyPort;
    str:=('&start='+inttostr(url)+'0');
    memo7.lines[k]:=StringReplace(memo7.lines[k], ' ', '%20',[rfReplaceAll]);
    http.HTTPMethod('get',('http://www.google.ru/search?q='+memo7.lines[k]+str));
    Memo6.lines.addstrings(Parse('<p><a href="/url?q=', '&amp;sa',StreamToString(http.document)));
    end;
    end;
    end
    else
    begin
    if http.HTTPMethod('get',('http://ipv4.google.com/')) then
    Edit2.Text:=('next proxy');
    for rez:=0 to Memo8.Lines.Count-1 do begin
    http.Protocol:='1.1';
    http.Timeout:=600;
    http.ProxyHost:=copy(memo8.Lines[rez],1,pos(':',memo8.Lines[rez])-1);
    http.ProxyPort:=copy(memo8.Lines[rez],pos(':',memo8.Lines[rez])+1,5);
    Application.ProcessMessages;
    end;
    end;
      end;
    
     
  9. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    if HTTP.ResultCode=302
    then begin
    http.ProxyHost
    http.ProxyPort
    end;

    А куда это впихнуть сам думай.
     
  10. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Ничего не дало как вылетало с ошибкой при редиректе так и вылетает (


    Code:
    procedure TForm1.Button10Click(Sender: TObject);
    var
    url,k,prox:integer;
    http:thttpsend;
    str,ip,port:string;
    begin
    HTTP:=THTTPSend.Create;
    if http.HTTPMethod('get',('http://www.google.ru')) and (HTTP.ResultCode=200) then
    begin
    for url:=0 to strtoint(sedit1.text) do begin
    for k:=0 to memo7.Lines.Count-1 do begin
    
    HTTP:=THTTPSend.Create;
    str:=('&start='+inttostr(url)+'0');
    memo7.lines[k]:=StringReplace(memo7.lines[k], ' ', '%20',[rfReplaceAll]);
    http.HTTPMethod('get',('http://www.google.ru/search?q='+memo7.lines[k]+str));
    Memo6.lines.addstrings(Parse('<p><a href="/url?q=', '&amp;sa',StreamToString(http.document)));
    
    if http.HTTPMethod('get',('http://www.google.ru')) and (HTTP.ResultCode=302) then begin
         IP:=Copy(memo8.lines[prox], 1, Pos(':',memo8.lines[prox])-1);
         PORT:=Copy(memo8.lines[prox], Pos(':', memo8.lines[prox])+1, Length(memo8.lines[prox]));
         http.ProxyHost:=IP;
         http.ProxyPort:=PORT;
         form1.Caption:=http.ProxyHost+';'+http.ProxyPort;
    
        end;
    end;
    end;
    end;
    end;
    
     
  11. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    У вас редирект куда на капчу или другой постоянный url?
    Просто ищем в html определенное предложение допустим (ваш ip заблокирован)
    и делаем условие на прокси.
    Code:
    if pos('ваш ip заблокирован',html)>0 then
    begin
    ....
    end;
     
    #171 vasykas, 1 Dec 2015
    Last edited: 1 Dec 2015
  12. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Редирект на :

    https://ipv4.google.com/sorry/Index...sYg_b1sgUiGQDxp4NL7WOXXpSM-axJqnrNAo_RUUcVLeY
     
  13. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    Как вариант могу предложить это:
    скрыто открываем webbrowser
    проверяем наличие капчи..
    procedure TForm1.Button1Click(Sender: TObject);
    var
    web:Tstringlist;
    r:widestring;
    uri, host :string;
    begin
    WebBrowser1.Hide;
    uri:='anyurl:index.php'; //что мы ищем
    host:='https://www.google.ru/search?q='+uri+'&newwindow=1&hl=en&start='; //если https то нужно добавить в Uses ssl модуль
    web:=Tstringlist.Create();
    WebBrowser1.HandleNeeded;
    WebBrowser1.Navigate(host);
    while WebBrowser1.ReadyState<>READYSTATE_COMPLETE do Application.ProcessMessages();//ждем загрузки страницы
    WB_GetHTMLCode(WebBrowser1,web);
    r:=web.text;
    if Pos('/sorry/image', r)>0 then // проверяем если капча то....
    begin
    http.ProxyHost:=IP;
    http.ProxyPort:=PORT;
    end;
    r:='';
    uri:='';
    end;
    {А здесь твой код}
    .....
     
  14. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    По сути когда редирект тоже на это условие прыгает -)
    Code:
    if http.HTTPMethod('get',('http://www.google.ru')) and (HTTP.ResultCode=200)
    
     
  15. binarymaster

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

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Вообще говоря, редирект реализуется по-разному.

    Это может быть HTTP код 30X, с заголовком Location, ещё это может быть мета-тег Refresh. Что именно используется в вашем случае - проверять только вам.

    На вашем месте, я бы убрал из условия проверку кода ответа, и поместил бы её внутрь кода первого условия, чтобы там можно было осуществлять другие проверки, в частности на редирект.
     
  16. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    В принципе не выполняется кусок кода :

    Code:
    end
    else begin
         Showmessage(inttostr(http.resultcode));
         for prox:=0 to memo8.Lines.Count-1 do begin
         IP:=Copy(memo8.lines[prox], 1, Pos(':',memo8.lines[prox])-1);
         PORT:=Copy(memo8.lines[prox], Pos(':', memo8.lines[prox])+1, Length(memo8.lines[prox]));
         http.ProxyHost:=IP;
         http.ProxyPort:=PORT;
         form1.Caption:=http.ProxyHost+';'+http.ProxyPort;
    
    Потому как Showmessage не выполняется =(
     
  17. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    В принципе, ага, не выполняется... :)
    Надо сперва четка представлять логику, которую должен выполнять код и иметь хотя бы какие-то понимания ооп, в данном случае, тогда не будет таких реализаций аля TForm1.Button10Click(Sender: TObject) с непонятной логикой и кучей утечек памяти, что несколькими постами выше.
     
    binarymaster likes this.
  18. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Ну знаешь как подскажи что в себе то хранить ? И тебе подсказывали для этого и существуют разделы по программированию далеко не все профессионалами рождаются !
     
  19. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    triblekill, а что подсказывать то, тебе уже дали ответ и не раз, ну вот мой вариант, за синтаксис и пунктуацию не ручаюсь - многое уже подзабыл, а synapse и вовсе не юзал, но та белеберда, что в Button10Click выше выглядела бы примерно так:
    Code:
    procedure setProxy(http: THTTPSend; proxy: String);
    begin
      ....
       http.ProxyHost:= getHost(proxy);
       http.ProxyPort:= getPort(proxy);
    end;
    
    procedure sendQuery(const query: String; start: Integer);
    var
       http: THTTPSend;
       sUrl: String;
    begin
       http:= THTTPSend.Create; try
      
         sUrl:= Format('http://www.google.ru/search?q=%s&start=%d', [ URLEncode(query), start ]);
      
         while True do begin
        
           if http.HTTPMethod('get', sUrl) then begin
          
             case http.ResultCode of
            
               200: begin
                 // все ОК парсим данные
                 parserHandler(http.document);
                 break;
               end;
               301..302: begin
                 // редирект, меняем прокси или делаем что-то еще...
                 setProxy(http, getNextProxyString);
               end;
               // Обрабатываем другие коды
               ....
               // На все остальное реагируем выходом
               else Break;
             end;
    
           end; // if  
          
         end; // while
      
       finally
         http.Free;
       end;
    end;
    
    procedure TForm1.Button10Click(Sender: TObject);
    begin
       ...
      
       for i:= 0 to memoQuerysString.Lines.Count - 1 do
         sendQuery(memoQuerysString.Lines[i], start);
       ...
    end;
    но я сомневаюсь, что тебе это чем-то поможет
     
    triblekill and binarymaster like this.
  20. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    Не могу сообразить...
    Вообщем получаю с сервера данные в виде
    Code:
    Result := Result + SR.Name + '#' + Inttostr(SR.Size) + '#' + Type_files + '#' + DateTimeToStr(GetFileDateTime(Path + SR.Name)) + '|';
    приходят в таком виде:(В строку)
    Code:
    AMD<Папка>|Autoexec.bat#24#12.10.2009#Пакетный файл|
    мне их надо разделить и добавить в ListView на 4 столбца
    знак | озночает конец строки.
    код обработки данных с сервера
    Code:
    var strDataParse:TStringList;
    ......
    for i := 0 to strDataParse.Count - 1 do
                begin
                      item:= Form2.ListView1.Items.Add;
                      item.Caption := Copy(strDataParse[i],2,Length(strDataParse[i]) - 1);
                     // item.SubItems.Add('');
                       // item.SubItems.Add('');
                       // item.SubItems.Add('');
                    end;
                end;
    я пробовал так , даже в item.Caption не добавляет (уже мозг кипит)
    Code:
      for i := 0 to strDataParse.Count -1 do
                begin
              if strDataParse[i]='#' then
                   begin
                      item := Form2.ListView1.Items.Add;
                      item.Caption := copy(strDataParse[0],1,i);
                   end;
                 end;
    
    подскажите куда копать
     
    #180 vasykas, 8 Dec 2015
    Last edited: 8 Dec 2015