Смена прокси



  • Посоветуйте плиз, как лучше реализовать смену прокси. Ситуация такая: беру

    1. лист.тхт с проксями.
    2. Ставлю в начале цикла брать прокси - вывожу когда взяли.
    3. в Лог выводится такая картина:
      0_1496650212954_proxy log.png
      Но прокси почему-то не применяется (видимо не пашет или какая может быть причина ?!)

    Вопрос, если не применяется (как на картинке) - как сделать так, чтобы он автоматом брал следующий - и пока не будет рабочего прокси, дальше цикл идти не будет?

    (До этого прокси лист тестил на чекерах, вроде все валидные)



  • @ogurchiki
    Делаю такое через создание и вызов рекурсивной функции такого вида.
    0_1496650878801_Screenshot_1.png
    Иногда сайт блочит IP, но всё равно отдает 200. В этом случае, добавляю проверку содержимого тега title через XPATH

    Можно через цикл делать, хоть это и менее изящно. Примерно так:
    0_1496651324128_Screenshot_1.png

    Сайт, к которому отправляем запрос, разумеется, подставляем свой =)



  • @xclsv попытался сделать через вызов функции, выдает такую ошибку (в логе):

    //[14:22:19] Поток №1 : ReferenceError: Can't find variable: change_proxy Номер строки:3 Во время выполнения скрипта { _call(change_proxy,null,function(){ _next_or_section(1,function(){ })})} 
    

    Я все правильно делаю? Эту функцию надо в начале скрипта писать? или как-то вызывать?
    1.Создал новую функцию (OnApplicationStart)

    1. 0_1496654903086_dds.png

    Функция change_proxy это уже готовая функция? или её нужно самому создать?
    Какая структура получается?

    Http клиент берет прокси;
    Отправляет get-Запрос на яндекс;
    Сохраняет статус ответа;
    Потом если статус ответа 200, то сохраняет в переменную WAS_EROR ( это что за переменная**?**) (непонятно)
    И вызывает функцию change_proxy ? (непонятно)
    А если нормально все(статус ответа не 200) - то он должен продолжать дальше цикл?

    Сорри за глупые вопросы)



  • @ogurchiki В BAS'e нет готовых функций, все функции создаёшь, называешь и вызываешь сам.
    В мануале всё есть:

    Вы можете прочитать переменную WAS_ERROR чтобы проверить, были ли ошибки во время последнего блока «Игнорировать Ошибки».

    В переменной LAST_ERROR содержится текст ошибки.

    Вот и вот статусы ответа сервера.



  • @ogurchiki said in Смена прокси:

    @xclsv попытался сделать через вызов функции, выдает такую ошибку (в логе):

    //[14:22:19] Поток №1 : ReferenceError: Can't find variable: change_proxy Номер строки:3 Во время выполнения скрипта { _call(change_proxy,null,function(){ _next_or_section(1,function(){ })})} 
    

    Я все правильно делаю? Эту функцию надо в начале скрипта писать? или как-то вызывать?

    Как верно написал выше Fox, все функции, кроме OnApplicationStart пишутся вручную. Ошибка в логе как раз и говорит о том, что функцию change_proxy в программе никто не объявлял и не описывал. Чтобы все заработало, необходимо создать функцию с таким названием, вставить в нее блоки вроде тех, что в моем первом ответе в топике и вызвать в том месте программы, где необходимо определить или сменить прокси. Крайне рекомендую почитать о том, что такое рекурсия. Это решит ещё 100500 проблем в будущем.

    1.Создал новую функцию (OnApplicationStart)

    1. 0_1496654903086_dds.png

    Функция change_proxy это уже готовая функция? или её нужно самому создать?

    Да, в каких-то случаях такое можно использовать в OnApplicationStart. Но что тогда делать, если прокси слетит во время работы скрипта или нужно будет использовать прокси в многопотоке? В общем, от использования OnApplicationStart рекомендую отказаться и сделать как я описал Выше.
    Ошибка на твоем скриншоте также в том, что ты дважды на одной итерации запрещаешь повторно использовать строку ресурса. Тоесть у тебя программа использует первый прокси, выведет в лог уже второй. А если прокси окажется плохим, то использует третий, а второй просто выведет в лог и пропустит. Не следует запрещать использовать строку ресурса повторно в блоке Http клиент прокси

    Какая структура получается?

    Http клиент берет прокси;
    Отправляет get-Запрос на яндекс;
    Сохраняет статус ответа;
    Потом если статус ответа 200, то сохраняет в переменную WAS_EROR ( это что за переменная**?**) (непонятно)
    И вызывает функцию change_proxy ? (непонятно)
    А если нормально все(статус ответа не 200) - то он должен продолжать дальше цикл?

    Сорри за глупые вопросы)

    WAS_ERROR - это переменная, которая автоматически объявляется при использовании в скрипте блока Игнорировать ошибки. Если этот блок не использовать, то в твоем случае, если прокси окажется мертвым, программа вылетит с ошибкой. А при его использовании работа будет продолжаться. Сразу после отработки этого блока в переменную WAS_ERROR запишется 1, если ошибка была или 0, если ошибки не было.

    Структура примерно такая:

    1. В нужном месте программы вызывается вышеописанная функция смены прокси.
    2. Из ресурса берется и устанавливается прокси.
    3. Отправляется get-Запрос. Лучше не на Яндекс, а сразу на Ваш сайт. Ведь в Яндексе прокси может быть заблочен, а на Вашем сайте нет.
    4. Сохраняем статус ответа сервера (или, лучше, сохраняем сам ответ сервера и читаем содержимое тега title на нужном нам сайте).
    5. Если ответ сервера не 200 или была ошибка во время использования блока Игнорировать ошибки, то эта функция снова вызывается (да, функция вызывает сама себя. Так можно =)) и все вышеописанное повторяется снова, но уже со следующим прокси. Так будет до тех пор, пока ответ сервера будет 200 и не будет ошибок во время запросов к нужному сайту.


  • Пара моментов, прокси из ресурса лучше брать в переменную, чтобы её потом выводить в лог или применять. В WAS_ERROR содержится булево, то есть "true" (да, была ошибка) или "false" (ошибки не было).



  • @xclsv @Fox огромное вам спасибо, что все разжевали. Все получилось - всё понял, всё применил.



  • Работало, работало.. а потом бац - ошибка:

    [19:49:34] Поток №1 : ReferenceError: Can't find variable: VAR_SAVED_STATUS Номер строки:2 Во время выполнения скрипта  { 
    _if((VAR_SAVED_STATUS!=200)||(VAR_WAS_ERROR),function(){
    section_insert()
    section_start("test", 911045989,function(){
    })},function(){
    section_start("test", 33363679,function(){ })})} 
    

    =\



  • @ogurchiki said in Смена прокси:

    Работало, работало.. а потом бац - ошибка:

    [19:49:34] Поток №1 : ReferenceError: Can't find variable: VAR_SAVED_STATUS Номер строки:2 Во время выполнения скрипта  { 
    _if((VAR_SAVED_STATUS!=200)||(VAR_WAS_ERROR),function(){
    section_insert()
    section_start("test", 911045989,function(){
    })},function(){
    section_start("test", 33363679,function(){ })})} 
    

    =\

    Ошибка указывает на то, что переменная SAVED_STATUS не объявлена на момент ее использования.
    Кинь скрин кода.



  • @xclsv Не могу воспроизвести, сейчас снова все работает без ошибок. Как только повторится, я напишу в этом топике. По моим наблюдениям была, когда статус запроса был не 200.



  • @xclsv Протестил, если код ответа не 200, то ошибка:

    Code: 
    //{
      CYCLE_INDEX: 0,
      LAST_ERROR: "Could not resolve host: sdffsdfsdfs.fdsfsd.ru",
      NEW_VARIABLE: "85.15.69.131:8081",
      SAVED_STATUS: "undefined",
      SAVED_TEXT: "undefined",
      WAS_ERROR: true
    }
    

    Скрин:0_1496685838637_скрин123.png



  • @ogurchiki смотри, у тебя ошибка возникает при гет запросе, и метка выполнения выходит из блока игнорирования ошибок минуя получение статуса. В логе же ты выводишь переменную статуса ответа, которой нету. Нужно менять логику так, что бы либо не использовать статус ответа, либо прлучать его только если запрос был без ошибок



  • @ogurchiki said in Смена прокси:

    @xclsv Протестил, если код ответа не 200, то ошибка:

    Code: 
    //{
      CYCLE_INDEX: 0,
      LAST_ERROR: "Could not resolve host: sdffsdfsdfs.fdsfsd.ru",
      NEW_VARIABLE: "85.15.69.131:8081",
      SAVED_STATUS: "undefined",
      SAVED_TEXT: "undefined",
      WAS_ERROR: true
    }
    

    Скрин:0_1496685838637_скрин123.png

    Да, @DrPrime правильно пишет.

    1. Ситуация может сложиться так, что get-запрос не отправится, т.к. прокси окажется мертвым. А значит и ответ сервера ты никак не получишь. По мне так это всё равно должно удовлетворять условию SAVED_STATUS!=200, но, видимо, в программировании это не так. Можно вставить костыль и в самом начале записать в переменную SAVED_STATUS ноль. Ну или просто попробуй убрать логгирование ответа сервера. Тебе ведь нужно знать не код ответа, а рабочий прокси или нет. То, что bas справится с проверкой 200 или не 200, можешь не сомневаться =)
    2. Во-вторых, сам get-запрос нужно делать под прокси. У тебя же прокси перед get-запросом не устанавливается и запрос происходит под ip твоей компьютерной сети.


  • @xclsv Вроде все сделал, все-равно ошибка... 0_1496752557705_ну.png

    Если не сложно, покажите (скрином) как в итоге должно получиться, например с костылем
    "Можно вставить костыль и в самом начале записать в переменную SAVED_STATUS ноль."
    Никак не получается



  • @ogurchiki said in Смена прокси:

    @xclsv Вроде все сделал, все-равно ошибка... 0_1496752557705_ну.png

    Если не сложно, покажите (скрином) как в итоге должно получиться, например с костылем
    "Можно вставить костыль и в самом начале записать в переменную SAVED_STATUS ноль."
    Никак не получается

    Перед http-клиент прокси вставляем блок Установить переменную. Параметры блока такие:
    0_1496753739233_Screenshot_3.png



  • @xclsv спасибо!



  • @ogurchiki said in Смена прокси:

    @xclsv спасибо!

    Помогло не? )



  • @xclsv да, теперь все пашет (меняются прокси без ошибок), даже когда сайт не але и прокси не але (тьфу тьфу). Утром попробовал добавить переменную 0 в SAVED_STATUS - не получалось, видимо из-за типа значения. по дефолту тип значения не int. В этих вещях начинающий, разницы не увидел. Еще раз биг сенк)

    0_1496754871771_122.png



  • @ogurchiki said in Смена прокси:

    @xclsv да, теперь все пашет (меняются прокси без ошибок), даже когда сайт не але и прокси не але (тьфу тьфу). Утром попробовал добавить переменную 0 в SAVED_STATUS - не получалось, видимо из-за типа значения. по дефолту тип значения не int. В этих вещях начинающий, разницы не увидел. Еще раз биг сенк)

    0_1496754871771_122.png

    Да, именно из-за этого =)



  • Тоже возникла проблемка при смене прокси. Сделал так, как здесь описано, правда я работаю через браузер, но думаю это не особо важно - принцип такой же.
    Создал ресурс, где прокси берутся по ссылке, нужно проверять что это РУ прокси, если нет - ошибка и снова вызов функции. Так вот, если указываю для прокси параметр notreuse, то скрипт отрабатывает ошибку (если прокси не подходит), переходит к установке прокси и все, зависает.
    Если же notreuse не указан, то скрипт берет все время один и тот же прокси.
    Где косяк? Помогите )



  • @Inwnew всмысле зависает на стадии когда взяли прокси и применили ?


Log in to reply
 

Looks like your connection to Bablosoft was lost, please wait while we try to reconnect.