Взять с начала списка и положить в конец списка

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Делаю первые шаги C#
Понял как взять, но не понял как добавить строку из переменной

Код:
lock(SyncObjects.ListSyncer)
{
var proxy = project.Lists["Proxy"];
project.Variables["Proxy"].Value = proxy[0];
proxy.RemoveAt(0);
proxy.Add(???? надо взять перемененную проекта Proxy и добавить в конец списка);
  
}
Суть: Беру 1 строку, назначаю переменную Proxy, удаляю строку, беру значение с переменной Proxy, добавляю в конец списка.

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

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Разобрался, если можете упростить снипет с радостью посмотрю другой вариант.
Код:
var proxy = project.Lists["Proxy"];
project.Variables["Proxy"].Value = proxy[0];
proxy.RemoveAt(0);
var proxyback = project.Variables["Proxy"].Value;
proxy.Add(Convert.ToString(proxyback));
return proxyback;
 
  • Спасибо
Реакции: kagorec

nole

Client
Регистрация
19.11.2010
Сообщения
368
Благодарностей
214
Баллы
43
Код:
var proxy = project.Lists["Proxy"];
lock(SyncObjects.ListSyncer) {
project.Variables["Proxy"].Value = proxy[0];
proxy.RemoveAt(0);
proxy.Add(project.Variables["Proxy"].Value);
}
return project.Variables["Proxy"].Value;
Разве так не работает? должно
Хотя зачем последняя строка, если мы получаем значение через переменную Proxy
 
  • Спасибо
Реакции: ks1989

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Код:
var proxy = project.Lists["Proxy"];
lock(SyncObjects.ListSyncer) {
project.Variables["Proxy"].Value = proxy[0];
proxy.RemoveAt(0);
proxy.Add(project.Variables["Proxy"].Value);
}
return project.Variables["Proxy"].Value;
Разве так не работает? должно
Хотя зачем последняя строка, если мы получаем значение через переменную Proxy
Последняя строка возвращает значение, что бы проверить ее работу.
У меня 1 вариант не заработал, мож глюк был, но я так понял, что лучше назначать переменные внутри кода и уже оперировать с ними.
 
  • Спасибо
Реакции: ks1989

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 650
Благодарностей
1 318
Баллы
113
Разобрался, если можете упростить снипет с радостью посмотрю другой вариант.

У меня такой вариант
C#:
var ProxyList = project.Lists["Список 1"];
lock(SyncObjects.ListSyncer)
{
var proxy = ProxyList[0];
ProxyList.RemoveAt(0);
ProxyList.Add(proxy);
project.Variables["proxy"].Value = proxy.ToString();
}
 
Последнее редактирование:

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
У меня такой вариант
C#:
var ProxyList = project.Lists["Список 1"];
var proxy = ProxyList[0];
lock(SyncObjects.ListSyncer)
{
ProxyList.RemoveAt(0);
ProxyList.Add(proxy);
project.Variables["proxy"].Value = proxy.ToString();
}
Благодарю, пока 50% делаю интуитивно =)
 

nole

Client
Регистрация
19.11.2010
Сообщения
368
Благодарностей
214
Баллы
43
У меня такой вариант
C#:
var ProxyList = project.Lists["Список 1"];
var proxy = ProxyList[0];
lock(SyncObjects.ListSyncer)
{
ProxyList.RemoveAt(0);
ProxyList.Add(proxy);
project.Variables["proxy"].Value = proxy.ToString();
}
строку var proxy = ProxyList[0]; надо переместить в lock, иначе в многопоточном режиме возможен вариант, когда 2 потока возьмут одну и ту же первую строку, а удалят 1 и 2
 
  • Спасибо
Реакции: Mikhail B. и samsonnn

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 650
Благодарностей
1 318
Баллы
113
строку var proxy = ProxyList[0]; надо переместить в lock, иначе в многопоточном режиме возможен вариант, когда 2 потока возьмут одну и ту же первую строку, а удалят 1 и 2
Спасибо поправил
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 650
Благодарностей
1 318
Баллы
113
Вот с проверкой на пустоту, если переменная proxy будет пустая, тогда берется новая строка, до тех пор пока не будет переменная с проксей, за тем устанавливает проксю, в место стандартного кубика

C#:
var ProxyList = project.Lists["Список 1"];
while(true)
{
   lock(SyncObjects.ListSyncer)
   {
   var proxy = ProxyList[0];
   ProxyList.RemoveAt(0);
     if (proxy != "")
     {
     ProxyList.Add(proxy);
     instance.SetProxy(proxy);
     return "Ok";
     }
   }
}
Отредактирован!
 
Последнее редактирование:
  • Спасибо
Реакции: Mikhail B.

nole

Client
Регистрация
19.11.2010
Сообщения
368
Благодарностей
214
Баллы
43
зачем пустую строку добавлять в конец, тогда уж вот так
Код:
var ProxyList = project.Lists["Список 1"];
while(true) {
    lock(SyncObjects.ListSyncer) {
        var proxy = ProxyList[0];
        ProxyList.RemoveAt(0);      
        if (proxy != "") {
            ProxyList.Add(proxy);
            instance.SetProxy(proxy);
            return "Ok";
        }
    }
}
 
  • Спасибо
Реакции: samsonnn

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 650
Благодарностей
1 318
Баллы
113
зачем пустую строку добавлять в конец, тогда уж вот так
Код:
var ProxyList = project.Lists["Список 1"];
while(true) {
    lock(SyncObjects.ListSyncer) {
        var proxy = ProxyList[0];
        ProxyList.RemoveAt(0);    
        if (proxy != "") {
            ProxyList.Add(proxy);
            instance.SetProxy(proxy);
            return "Ok";
        }
    }
}
понял вашу логику, умно=) спасибо сейчас подредактирую
 
Последнее редактирование:

Gerero

Client
Регистрация
20.12.2010
Сообщения
86
Благодарностей
83
Баллы
18
А если несколько изменить условия:

брать случайную строку (с проверкой на пустоту) с удалением из списка (обратно в список класть не надо),
положить ее в переменную var ?
 
  • Спасибо
Реакции: ks1989

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 650
Благодарностей
1 318
Баллы
113
А если несколько изменить условия:

брать случайную строку (с проверкой на пустоту) с удалением из списка (обратно в список класть не надо),
положить ее в переменную var ?

Берется случайная строка прокси из списка с удалением, и проверкой на пустоту, без добавления в список, устанавливает проксю в место стандартного кубика

C#:
var ProxyList = project.Lists["Список 1"];
while(true)
{
   lock(SyncObjects.ListSyncer)
   {
   var rnd = new Random().Next(0, ProxyList.Count);
   var proxy = ProxyList[rnd];
   ProxyList.RemoveAt(rnd);
     if (proxy != "")
     {
     instance.SetProxy(proxy);
     return "Ok";
     }
   }
}
 
Последнее редактирование:
  • Спасибо
Реакции: ks1989, lybimiy86 и Gerero

Gerero

Client
Регистрация
20.12.2010
Сообщения
86
Благодарностей
83
Баллы
18
samsonnn, благодарю! Эти маленькие примеры очень сильно помогают.

Эх, я несколько неправильно сформулировал)

Отойти от прокси.
Есть список, из него взять случайную строку с проверкой на пустоту с удалением из списка и положить ее в переменную var.
 
  • Спасибо
Реакции: ks1989

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 650
Благодарностей
1 318
Баллы
113
samsonnn, благодарю! Эти маленькие примеры очень сильно помогают.

Эх, я несколько неправильно сформулировал)

Отойти от прокси.
Есть список, из него взять случайную строку с проверкой на пустоту с удалением из списка и положить ее в переменную var.

Берется случайная строка из списка с удалением, и проверкой на пустоту, без добавления в список, результат ложиться в переменную которую сами назовете

C#:
var List = project.Lists["Список 1"];
while(true)
{
   lock(SyncObjects.ListSyncer)
   {
   var RandLine = new Random().Next(0, List.Count);
   var line = List[RandLine];
   List.RemoveAt(RandLine);
     if (line != "")
     {
     project.Variables["переменная"].Value = line;
     return "Ok";
     }
   }
}
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Усложним задачу!
Есть снипет модифицированный под сокс5
C#:
// Прокси
var ProxyList = project.Lists["Proxy"];
while(true)
{
   lock(SyncObjects.ListSyncer)
   {
   var proxy = ProxyList[0];
    var socks5 = "socks5://";
   ProxyList.RemoveAt(0);
     if (proxy != "")
     {
     ProxyList.Add(proxy);
     instance.SetProxy(socks5+proxy);
     return "Ok";
     }
   }
}
Есть снипет который переходит на яндекс и ищет элемент текст (можете сделать пост запрос и проверку на 200 ОК, если хотите)
C#:
// Проверка прокси
Tab tab = instance.ActiveTab;
tab.NavigateTimeout = 20;
if ((tab.IsVoid) || (tab.IsNull)) return -1;
tab.Navigate("http://ya.ru/", "");
if (tab.IsBusy) tab.WaitDownloading();
// Конструктор действий, тип Get
HtmlElement he = instance.ActiveTab.FindElementById("text");
if (he.IsVoid) return -1;
Так вот нужно, что бы он проверил на наличие елемента на странице, если его нету, значит прокси не валид, берем следующие но не более 5-10 раз. (не могу понять логики, ведь проверка происходит после назначения прокси, а ему нужно вернуться в начало снипета если прокси невалид. Или не нужно?)

И не совсем понятно, что делать с return -1
 
Последнее редактирование:
  • Спасибо
Реакции: ks1989

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Усложним задачу!
Есть снипет модифицированный под сокс5
C#:
// Прокси
var ProxyList = project.Lists["Proxy"];
while(true)
{
   lock(SyncObjects.ListSyncer)
   {
   var proxy = ProxyList[0];
    var socks5 = "socks5://";
   ProxyList.RemoveAt(0);
     if (proxy != "")
     {
     ProxyList.Add(proxy);
     instance.SetProxy(socks5+proxy);
     return "Ok";
     }
   }
}
Есть снипет который переходит на яндекс и ищет элемент текст (можете сделать пост запрос и проверку на 200 ОК, если хотите)
C#:
// Проверка прокси
Tab tab = instance.ActiveTab;
tab.NavigateTimeout = 20;
if ((tab.IsVoid) || (tab.IsNull)) return -1;
tab.Navigate("http://ya.ru/", "");
if (tab.IsBusy) tab.WaitDownloading();
// Конструктор действий, тип Get
HtmlElement he = instance.ActiveTab.FindElementById("text");
if (he.IsVoid) return -1;
Так вот нужно, что бы он проверил на наличие елемента на странице, если его нету, значит прокси не валид, берем следующие но не более 5-10 раз. (не могу понять логики, ведь проверка происходит после назначения прокси, а ему нужно вернуться в начало снипета если прокси невалид. Или не нужно?)

И не совсем понятно, что делать с return -1
хочешь вернуться в начало - сделай цикл. вместо ретурна break
 
  • Спасибо
Реакции: ks1989

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 650
Благодарностей
1 318
Баллы
113
Усложним задачу!
Есть снипет модифицированный под сокс5
C#:
// Прокси
var ProxyList = project.Lists["Proxy"];
while(true)
{
   lock(SyncObjects.ListSyncer)
   {
   var proxy = ProxyList[0];
    var socks5 = "socks5://";
   ProxyList.RemoveAt(0);
     if (proxy != "")
     {
     ProxyList.Add(proxy);
     instance.SetProxy(socks5+proxy);
     return "Ok";
     }
   }
}
Есть снипет который переходит на яндекс и ищет элемент текст (можете сделать пост запрос и проверку на 200 ОК, если хотите)
C#:
// Проверка прокси
Tab tab = instance.ActiveTab;
tab.NavigateTimeout = 20;
if ((tab.IsVoid) || (tab.IsNull)) return -1;
tab.Navigate("http://ya.ru/", "");
if (tab.IsBusy) tab.WaitDownloading();
// Конструктор действий, тип Get
HtmlElement he = instance.ActiveTab.FindElementById("text");
if (he.IsVoid) return -1;
Так вот нужно, что бы он проверил на наличие елемента на странице, если его нету, значит прокси не валид, берем следующие но не более 5-10 раз. (не могу понять логики, ведь проверка происходит после назначения прокси, а ему нужно вернуться в начало снипета если прокси невалид. Или не нужно?)

И не совсем понятно, что делать с return -1
Это уже хороший кусочек кода писать нужно, с цыклами проверками, отлаживать код, извините у меня сейчас нету времени на это.
 
  • Спасибо
Реакции: Mikhail B.

nole

Client
Регистрация
19.11.2010
Сообщения
368
Благодарностей
214
Баллы
43
Усложним задачу!
Есть снипет модифицированный под сокс5
C#:
// Прокси
var ProxyList = project.Lists["Proxy"];
while(true)
{
   lock(SyncObjects.ListSyncer)
   {
   var proxy = ProxyList[0];
    var socks5 = "socks5://";
   ProxyList.RemoveAt(0);
     if (proxy != "")
     {
     ProxyList.Add(proxy);
     instance.SetProxy(socks5+proxy);
     return "Ok";
     }
   }
}
Есть снипет который переходит на яндекс и ищет элемент текст (можете сделать пост запрос и проверку на 200 ОК, если хотите)
C#:
// Проверка прокси
Tab tab = instance.ActiveTab;
tab.NavigateTimeout = 20;
if ((tab.IsVoid) || (tab.IsNull)) return -1;
tab.Navigate("http://ya.ru/", "");
if (tab.IsBusy) tab.WaitDownloading();
// Конструктор действий, тип Get
HtmlElement he = instance.ActiveTab.FindElementById("text");
if (he.IsVoid) return -1;
Так вот нужно, что бы он проверил на наличие елемента на странице, если его нету, значит прокси не валид, берем следующие но не более 5-10 раз. (не могу понять логики, ведь проверка происходит после назначения прокси, а ему нужно вернуться в начало снипета если прокси невалид. Или не нужно?)

И не совсем понятно, что делать с return -1
C#:
var ProxyList = project.Lists["Proxy"];
string proxy;
for (int i = 0; i < 10; i++) {
    lock(SyncObjects.ListSyncer) {
        proxy = ProxyList[0];
        ProxyList.RemoveAt(0);
    }
    if (proxy != "") {      
        var content = ZennoPoster.HttpGet("https://ya.ru/", "socks5://" + proxy, "utf-8",
                                            ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderOnly, 10000,
                                            "", project.Profile.UserAgent, true, 5);
        if (content.Contains("HTTP/1.1 200 O")) {
            ProxyList.Add(proxy);
            instance.SetProxy("socks5://" + proxy);
            return "Ok";
        }
    }
}
throw new Exception("Ошибка");
Если стоит цель только проверить работоспособность прокси вообще (а не именно на ya.ru), то лучше дергать страницу полегче, например, https://api.ipify.org/
 
  • Спасибо
Реакции: Mikhail B.

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
ну уже через linq выложите в две строки ))
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
C#:
var ProxyList = project.Lists["Proxy"];
string proxy;
for (int i = 0; i < 10; i++) {
    lock(SyncObjects.ListSyncer) {
        proxy = ProxyList[0];
        ProxyList.RemoveAt(0);
    }
    if (proxy != "") {     
        var content = ZennoPoster.HttpGet("https://ya.ru/", "socks5://" + proxy, "utf-8",
                                            ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderOnly, 10000,
                                            "", project.Profile.UserAgent, true, 5);
        if (content.Contains("HTTP/1.1 200 O")) {
            ProxyList.Add(proxy);
            instance.SetProxy("socks5://" + proxy);
            return "Ok";
        }
    }
}
throw new Exception("Ошибка");
Если стоит цель только проверить работоспособность прокси вообще (а не именно на ya.ru), то лучше дергать страницу полегче, например, https://api.ipify.org/
Совершенно верно цель проверить прокси, не суть важна каким сайтом, главное, что бы эффективно, хоть пост запрос, без разницы. Код рабочий? А то выше написали, про две строки, не совсем понял))

Всем спасибо за содействие, думаю этот код будет многим полезен, взять прокси проверить ее, и добавить в конец списка и все в 1 кубике. :dk: Молодцы!)
 
  • Спасибо
Реакции: ks1989

one

Client
Регистрация
22.09.2015
Сообщения
6 793
Благодарностей
1 264
Баллы
113
К какому решению пришли господа? Столкнулся с тем что и мне подобное нужно.
 

Mikhail B.

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

one

Client
Регистрация
22.09.2015
Сообщения
6 793
Благодарностей
1 264
Баллы
113
Ну помоги, если не трудно. Хотя с выбором понятно, тут назрел другой вопрос и видимо не совсем в тему. В поисках решения просто наткнулся на твой топик. Есть сниппет мне надо ему указать что бы работал через прокси который берется случайно из списка.
Сниппет взят отсюда. Вот пример.

Код:
 // Настройки
            WordPressSiteConfig wordPressSiteConfig = new WordPressSiteConfig();
            wordPressSiteConfig.BaseUrl = "http://www.ru/xmlrpc.php"; // Путь к xmlrpc
            wordPressSiteConfig.Username = "login";   // Логин
            wordPressSiteConfig.Password = "pass"; // Пароль
            wordPressSiteConfig.BlogId = 1;
            using (var client = new WordPressClient(wordPressSiteConfig))
            {
                var post = new Post
                {
                    PostType = "post", // "post" или "page"
                    Title = "Заголовок",
                    Content = "Контент записи, <p> А тут html код)</p>",
                    PublishDateTime = DateTime.Now, // Дата публикации
                    Status = "publish" // "draft" или "publish" (draft это черновик)
                };
                var id = Convert.ToInt32(client.NewPost(post)); // ID поста
            }
 

Mikhail B.

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

one

Client
Регистрация
22.09.2015
Сообщения
6 793
Благодарностей
1 264
Баллы
113
Да я сам не понимаю пока каким образом цепляется прокси к коду. Попробовал сэмулировать варианты получения и установки прокси экшенами, после запуск сниппета. Не совсем уверен, но вроде бы подцепил сниппет прокси.

Твой же сниппет берет прокси из списка, ложит его в переменную и все. Дальше же надо указывать что работать будем через прокси.
 

Mikhail B.

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

Твой же сниппет берет прокси из списка, ложит его в переменную и все. Дальше же надо указывать что работать будем через прокси.
Ниче не надо прописывать. там все сам делает, единственное во 2 строке укажи название списка точь в точь, а в 13 строке, если не сокс, то убери в скобках socks5+

http://zennolab.com/discussion/threads/vzjat-s-nachala-spiska-i-polozhit-v-konec-spiska.27242/#post-191529

Могу скинуть пример если совсем туго.
 
  • Спасибо
Реакции: GreenWay и one

one

Client
Регистрация
22.09.2015
Сообщения
6 793
Благодарностей
1 264
Баллы
113
Спасибо, попробую. Но помоему надобность отпала. Сниппет под который нужно было прокси не совсем рабочий оказался. Но блин хорош, прост и быстр был бы.
 

GreenWay

Client
Регистрация
11.05.2012
Сообщения
428
Благодарностей
132
Баллы
43
C#:
var ProxyList = project.Lists["Proxy"];
string proxy;
for (int i = 0; i < 10; i++) {
    lock(SyncObjects.ListSyncer) {
        proxy = ProxyList[0];
        ProxyList.RemoveAt(0);
    }
    if (proxy != "") {     
        var content = ZennoPoster.HttpGet("https://ya.ru/", "socks5://" + proxy, "utf-8",
                                            ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderOnly, 10000,
                                            "", project.Profile.UserAgent, true, 5);
        if (content.Contains("HTTP/1.1 200 O")) {
            ProxyList.Add(proxy);
            instance.SetProxy("socks5://" + proxy);
            return "Ok";
        }
    }
}
throw new Exception("Ошибка");
Отличный сниппет, все отрабатывет - берет по списку проверяет и устанавливает. Но прокси ставит в браузере, а как получиьт в переменную? Мне для последующего использования в post-get запросах.
 
  • Спасибо
Реакции: ks1989

GreenWay

Client
Регистрация
11.05.2012
Сообщения
428
Благодарностей
132
Баллы
43
Поправил код, прокси ложит в переменную proxy
Код:
var ProxyList = project.Lists["proxy"];
string proxy;
for (int i = 0; i < 10; i++) {
    lock(SyncObjects.ListSyncer) {
        proxy = ProxyList[0];
        ProxyList.RemoveAt(0);
    }
    if (proxy != "") {     
        var content = ZennoPoster.HttpGet("https://api.ipify.org", proxy, "utf-8",
                                            ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderOnly, 10000,
                                            "", project.Profile.UserAgent, true, 5);
        if (content.Contains("HTTP/1.1 200 O")) {
            ProxyList.Add(proxy);
            instance.SetProxy(proxy);
            project.Variables["proxy"].Value = proxy.ToString();
            return "Ok";
        }
    }
}
throw new Exception("Ошибка");
Если что-то не так, поправьте пожалуйста
 
  • Спасибо
Реакции: ks1989 и kagorec

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