Прокси взять из списка, чекнуть, назначить, положить в конец списка. Готовый сниппет. Proxy С# v.2

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 453
Благодарностей
5 473
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

Тут родился сниппет =)
Тут первая версия.

Выражаю благодарность @nole @samsonnn @Dimionix за активное участие при создании v1
Так же выражаю благодарность @DmitryAk @Dmitrybyapple @Sergeevich68 за активное участие при создании v2

C#:
if (project.Variables["TurnProxy"].Value == "True" )
{
// проверяем включены-ли прокси или нет.
IZennoList proxyList = project.Lists["Proxy"]; //Получаем указатель на лист с проксями
int count = 100; // количество неудачных проверок подряд

string protocol = "";
if (project.Variables["Protocol"].Value == "") //(пустая переменная = http://)
project.Variables["Protocol"].Value = "http";

protocol = project.Variables["Protocol"].Value + "://"; // из переменной, в переменной значение socks5:// или http:// (пустая переменная = http://)

lock (SyncObjects.ListSyncer)
{
  for (int i = 0; i < count; i++)
  {
   if (proxyList.Count == 0)
   break;

   string proxy = proxyList[0];
   proxyList.RemoveAt(0);


   var content = ZennoPoster.HttpGet(project.Variables["CHECK_ADRESS"].Value, // CHECK_ADRESS - url для проверки
          protocol + proxy,
          "UTF-8",
          ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,
          5000);

   project.Variables["debug"].Value = content;
   if (!Regex.Match(content, "^$|blocked|заблокирован|407 Proxy").Success) // ""- если ответ пустой, && - или, содержит blocked в заголовках или ответе, то прокси не подходит
   {
      proxyList.Add(proxy); // записываем живую проксю в конец списка*
      instance.SetProxy(protocol + proxy); // назначаем прокси в проект
      project.Variables["proxy"].Value = protocol + proxy; // назначем прокси в переменную
      return proxy; // возвращаем в ответе снипета прокси
   }

   //  proxyList.Add(proxy); // записываем проксю в конец списка в любом случае (предыдущее за комментировать!)*

   project.SendWarningToLog(proxy+" Прокся плохая,чекаю ещё!");  // если прокся плохая пишем,что она плохая.
  }

  throw new Exception("Все прокси полное говнo!");//Если израсходовали все попытки подключения , то выходим из блока c# с таким сообщением.
}
}
Краткое описание сниппета.

Берет строку из списка проверяет на валид и бан на заданном сайте пока не найдет рабочую. Далее назначает прокси по умолчанию и в перменную. Далее записывает рабочую прокси в конец списка. Не рабочие выкидывает. Можно сделать, что бы не рабочие тоже записывал (подробнее смотрите строка 28 и 33). Приложил шаблон со входными настройками.


Подробное описание сниппета по строкам.


1. TurnProxy - Использовать ли прокси. Переменная для входных настроек (Boolean) Принимает значения True/False
4. Proxy - это название списка с прокси (регистрозависимо).
5. 100 - кол-во неудачных проверок подряд.
9. Protocol - Выбор протокола. Переменная для входных настроек (Select) {http|socks5}
18. Выход если список прокси пуст.


24-31. Ключевое изменение v2.
CHECK_ADRESS - переменная с URL сайта для проверки, задается в шаблоне.
C#:
if (!Regex.Match(content, "^$|blocked|заблокирован|407 Proxy").Success)
Проверка прокси на:

^$ - пустой ответ
blocked - на слово blocked в ответе
заблокирован - на слово заблокирован в ответе
407 Proxy Authenticaon - неверном логине и пароле прокси

Если прокси с пустым ответом (не рабочая) или содержит любое из заданых слов, то мы ее не используем и берем следующую. Я делал для сайта Авито, для своего сайта загоняйте прокси в бан и смотрите что пишет в ответе.
У меня "blocked" писало в заголовках, а "заблокирован" писало в ответе. При разных обстоятельствах.

Назначьте прокси в проекте.

Сделайте GET-запрос к главной странице сайта, сохраните код в отдельный файл.

Далее сделайте конструкцию GET-запрос далее пауза 0 сек и обратно запрос. Запустите на 10-20 сек. Остановите.
Если на сайте стоит защита, то она вас идентифицирует как бота и заблокирует доступ к сайту.

Далее скопируйте ответ запроса и внимательно посмотрите на текст. Поищите в заголовках слово Blocked или подобные, если нету ищите ниже.
Как найдете слово. Допуситим заблокирован. Скопируйте это слово и проверьте нет ли его в первом запросе, который мы сохранили в самом начале.

Если нет, то вы нашли идентификатор бана.


Далее заменяйте слова по своему усмотрению, если 4 значения вам не нужно, можете убавить или прибавить.

C#:
if (!Regex.Match(content, "^$|blocked|заблокирован|407 Proxy").Success)
Например нам нужно убрать 407 Proxy
И слово заблокирован поменять на слово блокировка.
Получаем
C#:
if (!Regex.Match(content, "^$|blocked|блокировка").Success)
И не забудьте поменять CHECK_ADRESS на свой сайт.

Ничего сложного =)

Но если вдруг будет сложно пишите в теме)

30. debug - Назначаем ответ запроса в переменную "debug". (Таким образом вы сможете проверить работает ли поиск при изменении значений)

33. Если прокси прошли проверку, то записываем в конец списка. (остальные удаляются из списка)
34. Назначаем прокси по умолчанию в шаблон.
35. Назначаем прокси в переменную "proxy" для использования с запросами или по личному усмотрению.
36. Возвращаем прокси в ответе сниппета (на всякий случай =) )

39. Записываем прокси в конец если даже она не прошла проверку. (28 строку нужно закоментировать //)
40. Сообщение в лог, что прокси не прошла проверку.
44. Сообщение в лог, что список пуст или закончились попытки.
 

Вложения

Последнее редактирование:

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 374
Благодарностей
2 042
Баллы
113
&& - не может быть или
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 453
Благодарностей
5 473
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 651
Баллы
113
Тем не менее сниппет работает как надо.(по крайней мере мне так кажется)
Хочешь сказать нужно поставить || ?
не нужно. Просто описание идёт по обратной стороне логики.
Если прокси с пустым ответом (не рабочая) или содержит любое из заданых слов
Если ответ не пустой и не содержит любое из заданных слов

Как минимум описание с && надо исправить на И
 
  • Спасибо
Реакции: Mikhail B.

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 374
Благодарностей
2 042
Баллы
113
Тем не менее сниппет работает как надо.(по крайней мере мне так кажется)
Хочешь сказать нужно поставить || ?
да, в твоём случае должны все ошибки попасть под это сравнение сразу что бы зайти в этот if, а твк он просто пройдёт мимо

2018-03-02_105750.png
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 453
Благодарностей
5 473
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

Так смотрите. Я поменял логин и пароль на прокси. И получил ответ HTTP/1.0 407 Proxy, и он пропустил...

Так что:
1) Пустой ответ не дает гарантий невалида прокси.
2) Как мне сделать, что бы он проверял не все условия, а по отдельности? т.е. мне нужно "или". "И" мне не нужно.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 374
Благодарностей
2 042
Баллы
113
Так смотрите. Я поменял логин и пароль на прокси. И получил ответ HTTP/1.0 407 Proxy, и он пропустил...

Так что:
1) Пустой ответ не дает гарантий невалида прокси.
2) Как мне сделать, что бы он проверял не все условия, а по отдельности? т.е. мне нужно "или". "И" мне не нужно.
2018-03-02_110513.png
 
  • Спасибо
Реакции: udder

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 453
Благодарностей
5 473
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 374
Благодарностей
2 042
Баллы
113
я бы лучше так записал

C#:
 // ""- если ответ пустой, && - или, содержит blocked в заголовках или ответе, то прокси не подходит
if (content == "" || content.Contains(@"blocked") || content.Contains(@"заблокирован") || content.Contains(@"407\ Proxy"))
{
    proxyList.Add(proxy); // записываем проксю в конец списка в любом случае (предыдущее за комментировать!)*
    project.SendWarningToLog(proxy+" Прокся плохая,чекаю ещё!");  // если прокся плохая пишем,что она плохая.
}
else
{
    proxyList.Add(proxy); // записываем живую проксю в конец списка*
    instance.SetProxy(protocol + proxy); // назначаем прокси в проект
    project.Variables["proxy"].Value = protocol + proxy; // назначем прокси в переменную
    return proxy; // возвращаем в ответе снипета прокси
}
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 132
Баллы
113
Как мне сделать, что бы он проверял не все условия, а по отдельности? т.е. мне нужно "или". "И" мне не нужно.
Твой вариант верный!
C#:
if (content != "" && !content.Contains(@"blocked") && !content.Contains(@"заблокирован"))
только, как и сказал doc
Как минимум описание с && надо исправить на И
Можно ещё так:
C#:
if (!Regex.Match(content, "^$|blocked|заблокирован").Success)
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 453
Благодарностей
5 473
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

C#:
if (!Regex.Match(content, "^$|blocked|заблокирован").Success)
Вот этот вариант подошел.

В прошлом варианте когда ставил HeaderAndBody, то content.Contains не корректно проверял. Уж не знаю почему.
 

Vass

Client
Регистрация
03.02.2014
Сообщения
79
Благодарностей
10
Баллы
8
Не много поколдовал с вашим скриптом, что бы из него сделать прокси чекер.

PHP:
IZennoList Good = project.Lists["Posle"]; //Список куда будет сохраняется хорошие прокси
IZennoList proxyList = project.Lists["Proxy"]; //Список с проксями
string protocol = "";
if (project.Variables["Protocol"].Value == "") //(пустая переменная = http://)
project.Variables["Protocol"].Value = "http";
protocol = project.Variables["Protocol"].Value + "://"; // из переменной, в переменной значение socks5:// или http:// (пустая переменная = http://)
lock (SyncObjects.ListSyncer)
{
   System.Threading.Tasks.Parallel.For(0, proxyList.Count, x => {
   
  string proxy = proxyList[0];
  proxyList.RemoveAt(0);
  var content = ZennoPoster.HttpGet(project.Variables["CHECK_ADRESS"].Value, // CHECK_ADRESS - url для проверки
  protocol + proxy,
  "UTF-8",
  ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,
  Convert.ToInt32(project.Variables["Timedow"].Value));
  project.Variables["debug"].Value = content;
  if (!Regex.Match(content, "^$|blocked|заблокирован|407 Proxy").Success) // ""- если ответ пустой, && - или, содержит blocked в заголовках или ответе, то прокси не подходит
  {
  Good.Add(proxy); // записываем живую проксю в конец списка*
   project.SendInfoToLog("", proxy+" Удачная прокси, идем дальше", true);
  }
  });
   
project.SendWarningToLog("", "Все готово",true);
}

Как в логе избавиться от надписи, если возможно.
Ошибка при выполнении запроса Превышен таймаут ResourceDownloader.GetResult.
По скорости отлично получается.
Пока не могу допереть как в список Posle писать прокси в формате socks5://proxy если в настройках она выбрана.

ЗЫ Как вставить Код (CSharp):
 
Последнее редактирование:

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 453
Благодарностей
5 473
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

Как в логе избавиться от надписи, если возможно.
Ошибка при выполнении запроса Превышен таймаут ResourceDownloader.GetResult.
Мне в ZennoPoster приходит только одно оповещение, о том что прокси закончились.
Сам таймаут можно увеличить при желании (17 строка). 5000 значит 5 сек.
 

Vass

Client
Регистрация
03.02.2014
Сообщения
79
Благодарностей
10
Баллы
8
Просто делал откладку в ПМ, и виде куча сообщения, подумал что в ЗП тоже самое будет.

Про 5 сек спасибо, обычно ставлю сек 5-10, просто если больше то ждать дальше и не факт что потом прокси под нагрузку будут нормально работать, хотя тут еще зависит какой у вас инет.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 453
Благодарностей
5 473
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

Просто делал откладку в ПМ, и виде куча сообщения, подумал что в ЗП тоже самое будет.
Там можно как-то включать или отключать эти оповещения в ZP, я не придал этому значения.
 

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
187
Баллы
43
Там можно как-то включать или отключать эти оповещения в ZP, я не придал этому значения.
вместо
Код:
project.SendWarningToLog(proxy+" Прокся плохая,чекаю ещё!");  // если прокся плохая пишем,что она плохая.
написать
Код:
project.SendWarningToLog(proxy+" Прокся плохая,чекаю ещё!", true);  // если прокся плохая пишем,что она плохая.
и тогда будет оповещение в лог ЗП
 
  • Спасибо
Реакции: Mikhail B.

Vass

Client
Регистрация
03.02.2014
Сообщения
79
Благодарностей
10
Баллы
8
и тогда будет оповещение в лог ЗП
Спасибо помогло, поправил верхний кубик, все работает, но подскажите кто знает как сделать что бы если был выбран протокол socks5:// то в итоговом списке она писалось с этим протокол, а если не выбрана то без него.
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 132
Баллы
113
подскажите кто знает как сделать что бы если был выбран протокол socks5:// то в итоговом списке она писалось с этим протокол, а если не выбрана то без него.
Строку Good.Add(proxy); замени на
Код:
if (protocol == "socks5://") Good.Add(protocol + proxy);
else Good.Add(proxy);
 
  • Спасибо
Реакции: Vass

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 453
Благодарностей
5 473
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

Ребят я нашел критический недочет в сниппете. Если проксей меньше чем потоков. То потоки просто берут одну и ту же прокси! Это просто недопустимо! Что делать? Разделить снипет на две части?
 

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
187
Баллы
43
Может, как вариант, сделать запись взятого в работу прокси в отдельный файл. Если поток берет прокси, а он уже есть в файле, то прерывает работу (или точнее, пробует взять другой прокси, а через n попыток прерывает, т.к. нет свободных прокси).
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 453
Благодарностей
5 473
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

Может, как вариант, сделать запись взятого в работу прокси в отдельный файл. Если поток берет прокси, а он уже есть в файле, то прерывает работу (или точнее, пробует взять другой прокси, а через n попыток прерывает, т.к. нет свободных прокси).
Да, отличное решение.
0) Первый поток чистит список два(TEMP-PROXY). (или все потоки в конце работы)
1) Берем прокси (result) из списка один.
2) Проверяем на наличие в списке два(TEMP-PROXY).
3) При отсутствии записываем и начинаем работу. При наличии возвращаемся к 1 пункту.

UPD. Вот тут нашел сниппет для проверки на наличие строки в тексте C#
Залочил на всякий случай.

C#:
lock (SyncObjects.ListSyncer)
{
IZennoList Names = project.Lists["TEMP-PROXY"]; //привязываемся к списку
string Element = project.Variables["result"].Value;
return Names.Contains(Element); // True/False
}
 
Последнее редактирование:

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
187
Баллы
43

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 453
Благодарностей
5 473
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

только как реализовать этот момент? чтобы именно однократно чистился список?
Есть снипет, который разделяет потоки. Но есть один минус в нем. Если по ошибке завершить или принудительно, то глобалку надо обнулять.
Суть такова. Поток 0 идет налево, все остальные на право.
 

jkarsak37428

Client
Регистрация
20.12.2015
Сообщения
137
Благодарностей
11
Баллы
18
А кто подскажет если список прокси пуст то как можно прекрутить чтобы было ожидание пополнения списка?
 

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
187
Баллы
43
А кто подскажет если список прокси пуст то как можно прекрутить чтобы было ожидание пополнения списка?
добавить паузу на ожидание и в цикл поместить. Только цикл с ограничением делать, чтобы не завис шаблон в бесконечном цикле.
 

GreenWay

Client
Регистрация
11.05.2012
Сообщения
433
Благодарностей
139
Баллы
43
В последних версиях zenno хреново работают С# post-get запросы. При работе этого сниппета теряются прокси и шаб выполняется очень долго (это если шаб весь на post-get). Поэтому переписал под проверку через кубики. Вроде отпустило. Но тем не менее разработчики работают над этой проблемой. Давно пора сделать отдельный кубик с проверкой и вставкой прокси в шаблон.
 

xxownerxx

Новичок
Регистрация
19.08.2018
Сообщения
7
Благодарностей
1
Баллы
1
В последних версиях zenno хреново работают С# post-get запросы. При работе этого сниппета теряются прокси и шаб выполняется очень долго (это если шаб весь на post-get). Поэтому переписал под проверку через кубики. Вроде отпустило. Но тем не менее разработчики работают над этой проблемой. Давно пора сделать отдельный кубик с проверкой и вставкой прокси в шаблон.
Просьба по-возможности поделиться своим шаблоном проверки на кубиках .
Спасибо.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 453
Благодарностей
5 473
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

В последних версиях zenno хреново работают С# post-get запросы. При работе этого сниппета теряются прокси и шаб выполняется очень долго (это если шаб весь на post-get). Поэтому переписал под проверку через кубики. Вроде отпустило. Но тем не менее разработчики работают над этой проблемой. Давно пора сделать отдельный кубик с проверкой и вставкой прокси в шаблон.
GET валится как в шарпе, так и в кубах. Довольно часто у меня бывает в т.ч. на версии 16.2, пишет плохие прокси. Просто приходит пустой ответ. Видимо надо допиливать сниппет на действие при пустом ответе..
 

kagorec

Client
Регистрация
24.08.2013
Сообщения
1 038
Благодарностей
560
Баллы
113
Подскажите как изменить код снипета, чтобы хорошие прокси записывало в начало списка, всего в списке лимит на 500 строк, при добавлении прокси в начало то удаляется последняя:-)
И как в шаблоне вывести настройку где можно указать "Время отклика страницы"?
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 374
Благодарностей
2 042
Баллы
113
Подскажите как изменить код снипета, чтобы хорошие прокси записывало в начало списка, всего в списке лимит на 500 строк, при добавлении прокси в начало то удаляется последняя:-)
И как в шаблоне вывести настройку где можно указать "Время отклика страницы"?
как понять удаляется последняя, это с чего она удаляется ?
незнаю как ты добавляешь, но мой пример такой
Код:
proxyList.Insert(0, proxy);
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)