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 ( Чё то даже с одним прокси не работает ( который вписываю в ручную
Всё таки получаю: 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> Гугл запрещает работу с прокси ? А это просто такое прокси )
Вам не надоело еще с 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; ...
Чё то не могу придумать как проверить а затем менять прокси если необходимо: 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;
Вот так менять прокси 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 а чекер прокси в инете найдешь,там полно.
Ну не ужели никто не подскажет как прокси поменять при редиректе ? 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=', '&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;
Ничего не дало как вылетало с ошибкой при редиректе так и вылетает ( 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=', '&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;
У вас редирект куда на капчу или другой постоянный url? Просто ищем в html определенное предложение допустим (ваш ip заблокирован) и делаем условие на прокси. Code: if pos('ваш ip заблокирован',html)>0 then begin .... end;
Как вариант могу предложить это: скрыто открываем 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; {А здесь твой код} .....
По сути когда редирект тоже на это условие прыгает -) Code: if http.HTTPMethod('get',('http://www.google.ru')) and (HTTP.ResultCode=200)
Вообще говоря, редирект реализуется по-разному. Это может быть HTTP код 30X, с заголовком Location, ещё это может быть мета-тег Refresh. Что именно используется в вашем случае - проверять только вам. На вашем месте, я бы убрал из условия проверку кода ответа, и поместил бы её внутрь кода первого условия, чтобы там можно было осуществлять другие проверки, в частности на редирект.
В принципе не выполняется кусок кода : 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 не выполняется =(
В принципе, ага, не выполняется... Надо сперва четка представлять логику, которую должен выполнять код и иметь хотя бы какие-то понимания ооп, в данном случае, тогда не будет таких реализаций аля TForm1.Button10Click(Sender: TObject) с непонятной логикой и кучей утечек памяти, что несколькими постами выше.
Ну знаешь как подскажи что в себе то хранить ? И тебе подсказывали для этого и существуют разделы по программированию далеко не все профессионалами рождаются !
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; но я сомневаюсь, что тебе это чем-то поможет
Не могу сообразить... Вообщем получаю с сервера данные в виде 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; подскажите куда копать