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

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Тут родился сниппет =)
Тут первая версия.

Выражаю благодарность @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 379
Благодарностей
2 039
Баллы
113
&& - не может быть или
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

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

doc

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

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

ssXXXss

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

2018-03-02_105750.png
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Так смотрите. Я поменял логин и пароль на прокси. И получил ответ HTTP/1.0 407 Proxy, и он пропустил...

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

ssXXXss

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

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

Mikhail B.

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

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
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 100
Баллы
113
Как мне сделать, что бы он проверял не все условия, а по отдельности? т.е. мне нужно "или". "И" мне не нужно.
Твой вариант верный!
C#:
if (content != "" && !content.Contains(@"blocked") && !content.Contains(@"заблокирован"))
только, как и сказал doc
Как минимум описание с && надо исправить на И
Можно ещё так:
C#:
if (!Regex.Match(content, "^$|blocked|заблокирован").Success)
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
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.

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

Vass

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

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

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Просто делал откладку в ПМ, и виде куча сообщения, подумал что в ЗП тоже самое будет.
Там можно как-то включать или отключать эти оповещения в ZP, я не придал этому значения.
 

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
185
Баллы
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 100
Баллы
113
подскажите кто знает как сделать что бы если был выбран протокол socks5:// то в итоговом списке она писалось с этим протокол, а если не выбрана то без него.
Строку Good.Add(proxy); замени на
Код:
if (protocol == "socks5://") Good.Add(protocol + proxy);
else Good.Add(proxy);
 
  • Спасибо
Реакции: Vass

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Ребят я нашел критический недочет в сниппете. Если проксей меньше чем потоков. То потоки просто берут одну и ту же прокси! Это просто недопустимо! Что делать? Разделить снипет на две части?
 

kapelan28

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

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Может, как вариант, сделать запись взятого в работу прокси в отдельный файл. Если поток берет прокси, а он уже есть в файле, то прерывает работу (или точнее, пробует взять другой прокси, а через 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
Благодарностей
185
Баллы
43

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
только как реализовать этот момент? чтобы именно однократно чистился список?
Есть снипет, который разделяет потоки. Но есть один минус в нем. Если по ошибке завершить или принудительно, то глобалку надо обнулять.
Суть такова. Поток 0 идет налево, все остальные на право.
 

jkarsak37428

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

kapelan28

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

GreenWay

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

xxownerxx

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

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
В последних версиях zenno хреново работают С# post-get запросы. При работе этого сниппета теряются прокси и шаб выполняется очень долго (это если шаб весь на post-get). Поэтому переписал под проверку через кубики. Вроде отпустило. Но тем не менее разработчики работают над этой проблемой. Давно пора сделать отдельный кубик с проверкой и вставкой прокси в шаблон.
GET валится как в шарпе, так и в кубах. Довольно часто у меня бывает в т.ч. на версии 16.2, пишет плохие прокси. Просто приходит пустой ответ. Видимо надо допиливать сниппет на действие при пустом ответе..
 

kagorec

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

ssXXXss

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

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