Сниппет вставки из буфера обмена для ZennoPoster (многопоточный, с блокировками) [Дон шампиньон]

Fedor5588

Client
Регистрация
04.06.2017
Сообщения
313
Благодарностей
73
Баллы
28
Решил кто проблему? У меня так же виснет через какое то время
 

lzlmrf

Client
Регистрация
14.08.2015
Сообщения
488
Благодарностей
149
Баллы
43
У себя заметил что это не с зенкой связано. Почему-то пропадает временами возможность копипаста, даже руками.
 

Fedor5588

Client
Регистрация
04.06.2017
Сообщения
313
Благодарностей
73
Баллы
28
У себя заметил что это не с зенкой связано. Почему-то пропадает временами возможность копипаста, даже руками.
Я код что в шапке зациклил, пока только таким Макаром выхожу из положения. Тот что дальше скидывали он у меня тупо встаёт и ничего не делает, может хоть целый день в таком состоянии провисеть и при этом ни ошибки не выдать и не вставить. А в шапке код сразу выдаёт ошибку. В итоге с таймером его связал и зациклил пока не выполнит. Причём связи вообще не вижу. Порой сутками нормально работает, а порой моментами начинает гнать.
 

jun_dev

Пользователь
Регистрация
04.08.2017
Сообщения
121
Благодарностей
7
Баллы
18
Самый простой и на 99% работающий вариант - это кликнуть вот так:
C#:
HtmlElement he = instance.ActiveTab.FindElementById("text"); // идентификатор text нужно заменить на свой, на тот id, по которому нужно кликнуть
he.Click();
привет.
отличный способ для клика по элементу, спасибо!
Вопрос, а как можно сразу же в этом снипете с эмулировать ввод с клавиатуры(есть переменная и в ней данные) которые нужно ввести в поле которое нашли. Вот пример: http://prntscr.com/hh98xh
Спасибо за ответ!
 

ikibostus

Client
Регистрация
27.09.2015
Сообщения
256
Благодарностей
26
Баллы
28
привет.
отличный способ для клика по элементу, спасибо!
Вопрос, а как можно сразу же в этом снипете с эмулировать ввод с клавиатуры(есть переменная и в ней данные) которые нужно ввести в поле которое нашли. Вот пример: http://prntscr.com/hh98xh
Спасибо за ответ!
Код:
he.SetAttribute("value", project.Variable["text"].Value);
 
  • Спасибо
Реакции: Lord_Alfred

jun_dev

Пользователь
Регистрация
04.08.2017
Сообщения
121
Благодарностей
7
Баллы
18
Код:
he.SetAttribute("value", project.Variable["text"].Value);
спасибо за быстрый ответ. я тут еще докумекал перевести обычную эмуляцию "кубик" в С# и вставил после

  1. HtmlElement he = instance.ActiveTab.FindElementById("text"); // идентификатор text нужно заменить на свой, на тот id, по которому нужно кликнуть
  2. he.Click();

    и заработало. сразу и с нужной паузой ввода.
 

jun_dev

Пользователь
Регистрация
04.08.2017
Сообщения
121
Благодарностей
7
Баллы
18

ikibostus

Client
Регистрация
27.09.2015
Сообщения
256
Благодарностей
26
Баллы
28
еще один нюанс с вашим кодом, а как допустим у нему прикрутить нужную паузу ввода текста? а то ваш мгновенно вставляет)
Наверное лучше тогда через эмуляцию, как у вас выше. Сначала клик по нужному полю, а потом код эмуляции ввода
 

jun_dev

Пользователь
Регистрация
04.08.2017
Сообщения
121
Благодарностей
7
Баллы
18
Наверное лучше тогда через эмуляцию, как у вас выше. Сначала клик по нужному полю, а потом код эмуляции ввода
сделал вот так :

Код:
HtmlElement he = instance.ActiveTab.FindElementById("id_research_keywords"); // идентификатор text нужно заменить на свой, на тот id, по которому нужно кликнуть
he.Click();

instance.WaitFieldEmulationDelay(); // не знаю, обязательна ли эта строка, но, в принципе, не мешает
string str = project.Variables["bio"].Value; // переменная с текстом
int latencyMin = 45; // минимальная задержка для ввода одного символа, мс
int latencyMax = 65; // максимальная задержка для ввода одного символа, мс
char[] symbol = str.ToArray();
Random rnd = new Random();
for (int i = 0; i < symbol.Count(); i++)
{
    string text = symbol[i].ToString();
    int latency = rnd.Next(latencyMin, latencyMax);
    instance.SendText(text, latency);
}
слепил из 2-х тем на форуме. У меня все заработало. И кликает и данные вводит с непалевной паузой.
 
  • Спасибо
Реакции: August TS и one

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Подредактировал сниппет вставки текста из буфера обмена.
Проблема: Выскакивала ошибка, если в буфер обмена был пуст или в нем содержался не текст, а что-то другое, например картинка.
Решение: добавлена проверка на содержания текста в буфере обмена при возврате данных в буфер. Если текста нет, то в буфер ничего не возвращается.


Код:
lock(SyncObjects.InputSyncer) // блокировка
{
            
    // сохраняем предыдущее состояние буфера
    string previous_text = System.Windows.Forms.Clipboard.GetText();
  
    //сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
    System.Windows.Forms.Clipboard.SetText(strAnswerText);// strAnswerText - переменная со вставляемым текстом
    instance.ActiveTab.KeyEvent("v","press","ctrl");
  
    // стираем буфер и возвращаем его к первоначальному состоянию
    System.Windows.Forms.Clipboard.Clear();
    if (previous_text!=String.Empty){
        System.Windows.Forms.Clipboard.SetText(previous_text);
    }
}
 

booldozer

Client
Регистрация
13.02.2011
Сообщения
139
Благодарностей
45
Баллы
28
Огромнейшее спасибо. :bo::bp::bo::bp:
 

Advice

Client
Регистрация
18.03.2013
Сообщения
26
Благодарностей
4
Баллы
3
Кто-то решил проблему с зависаниями?Пробовал сниппет в первом посте, в последнем, как ни крути зависает на глухо. Что делать то?Запускаю 3 потока, через время смотрю - все 3 зависли на вставке сообщения.
 

ezotonal

Client
Регистрация
13.01.2014
Сообщения
819
Благодарностей
231
Баллы
43
Кто-то решил проблему с зависаниями?Пробовал сниппет в первом посте, в последнем, как ни крути зависает на глухо. Что делать то?Запускаю 3 потока, через время смотрю - все 3 зависли на вставке сообщения.
Переменная объявлена из которой в буфер обмена берется текст?
 

Advice

Client
Регистрация
18.03.2013
Сообщения
26
Благодарностей
4
Баллы
3
Переменная объявлена из которой в буфер обмена берется текст?
В самой зенке?Естественно

Переделал последний вариант в топике заменой лока инпута на лок таблиц(в шабе не используется), хоть это и не совсем правильно, но по предварительным тестам зависаний либо вообще нет, либо на порядок меньше.
Код:
lock(SyncObjects.TableSyncer) // блокировка
{
           
    // сохраняем предыдущее состояние буфера
    string previous_text = System.Windows.Forms.Clipboard.GetText();

    //сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
    System.Windows.Forms.Clipboard.SetText(project.Variables["text"].Value);
    instance.ActiveTab.KeyEvent("v","press","ctrl");

    // стираем буфер и возвращаем его к первоначальному состоянию
    System.Windows.Forms.Clipboard.Clear();
    if (previous_text!=String.Empty){
        System.Windows.Forms.Clipboard.SetText(previous_text);
    }
}
 
  • Спасибо
Реакции: nicanil

Master4eg

Client
Регистрация
06.04.2016
Сообщения
421
Благодарностей
122
Баллы
43
А можно ли картинку которая уже в буфере сохранять на комп в папку?? очень нужно
 

alya_6

Client
Регистрация
27.08.2018
Сообщения
172
Благодарностей
19
Баллы
18
Здравствуйте! Спасибо за код.
Подскажите, пожалуйста, а что нужно сделать, чтобы текст из буфера не вставляло куда-то, а сохраняло в переменную? Пробовала изменить ваш код под себя:
Код:
lock(SyncObjects.InputSyncer) // блокировка
{
    var descr = project.Variables["content"].Value;
    // сохраняем предыдущее состояние буфера
    String previous_text = null;
    previous_text = System.Windows.Forms.Clipboard.GetText();
    // сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
    project.Variables["myvariable"].Value = System.Windows.Forms.Clipboard.GetText();
    // стираем буфер и возвращаем его к первоначальному состоянию
    System.Windows.Forms.Clipboard.Clear();
    System.Windows.Forms.Clipboard.SetText(previous_text);
}
Но возвращает ошибку "Выполнение действия CSharp OwnCode. Значение не может быть неопределенным.
Имя параметра: text"

Подскажите, пожалуйста, что не так.

P.S.: еще так пробовала:
Код:
lock(SyncObjects.InputSyncer) // блокировка
{
    var myvariable = project.Variables["content"].Value;
    // сохраняем предыдущее состояние буфера
    String previous_text = null;
    previous_text = System.Windows.Forms.Clipboard.GetText();
    // сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
    System.Windows.Forms.Clipboard.SetText(myvariable);
    project.Variables["myvariable"].Value = System.Windows.Forms.Clipboard.GetText();
    // стираем буфер и возвращаем его к первоначальному состоянию
    System.Windows.Forms.Clipboard.Clear();
    System.Windows.Forms.Clipboard.SetText(previous_text);
}
и другие модификации - результат тот же.
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
Подскажите, пожалуйста, а что нужно сделать, чтобы текст из буфера не вставляло куда-то, а сохраняло в переменную? Пробовала изменить ваш код под себя:
C#:
lock(SyncObjects.InputSyncer) // блокировка
{
    // сохраняем предыдущее состояние буфера
    String previous_text = null;
    previous_text = System.Windows.Forms.Clipboard.GetText();
    if (!String.IsNullOrEmpty(previous_text)) {
        project.Variables["myvariable"].Value = previous_text;
    }
}
 

alya_6

Client
Регистрация
27.08.2018
Сообщения
172
Благодарностей
19
Баллы
18
C#:
lock(SyncObjects.InputSyncer) // блокировка
{
    // сохраняем предыдущее состояние буфера
    String previous_text = null;
    previous_text = System.Windows.Forms.Clipboard.GetText();
    if (!String.IsNullOrEmpty(previous_text)) {
        project.Variables["myvariable"].Value = previous_text;
    }
}
Спасибо большое, работает!
 
  • Спасибо
Реакции: bashka

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
Тоже столкнулся с проблемой зависания шаблона при вставке текста из буфера обмена. Версия программы - 5.28.0.0
Зенка у меня работает в VirtualBox, общий буфер обмена отключил (думал может это поможет, но нет). Пробовал заменить SyncObjects.InputSyncer на SyncObjects.TableSyncer как подсказали чуть выше. Но это тоже не дало желаемого результата - код всё-равно зависал (мог провисеть минуту, 5 минут, 15 и более).

Прочитал очень хорошую конкурсную статью о lock'ах. Вооружившись новыми знаниями собрал dll'ку, в ней только один объект, который я использую для lock'а. Собирал dll чтоб несколько копий одного шаблона, которые работают с буфером обмена, не мешали друг другу (doc в той же теме по lock'ам подсказал, что можно было использовать статические переменные из общего кода для блокировок, если работает несколько копий одного и того же шаблона).

На данный момент шаблон работает больше суток, зависаний не замечал.
Справедливости ради стоит заметить, что один раз код "задумался" на 7 секунд (в обычных условиях вставка у меня занимает 1-2 секунды).
 
  • Спасибо
Реакции: Advice

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
Ха-ха-ха*HAHA*
Надо было молчать.
Сейчас глянул на работу шаблона, а он висит на вставке из буфера:dy: Висел относительно не долго, 6 минут, но тем не менее.
Поиски решения проблемы продолжаются.
Stay tuned.
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
Поиски решения проблемы продолжаются.
Проверял какой вид эмуляции выставлен в шаблоне? Если там на "качество" вставка, то может оказаться что он побуквенно вставляет (но не уверен, т.к. не эмуляция клавы же).
Ну и смотреть надо через инстансы что там происходит по-хорошему. Да и в саму реализацию вставки в C# не мешало бы посмотреть, там тоже явно какие-то блокировки задействуются, наверное, так что они может создают такую жесть,
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
Проверял какой вид эмуляции выставлен в шаблоне? Если там на "качество" вставка, то может оказаться что он побуквенно вставляет (но не уверен, т.к. не эмуляция клавы же).
Да, стоит на "качество". Но как ты уже правильно подметил - это не эмуляция.
Ну и смотреть надо через инстансы что там происходит по-хорошему.
А там ничего не происходит. Просто висит себе шаблон и всё. Курсор моргает в поле ввода (куда должен вставиться текст), я могу взаимодействовать с сайтом (т.е. это не проблема зависшего инстанса).

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

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
Пока что я в сниппете буквально через каждую строчку расставил вывод сообщений в лог. Как только ещё раз зависнет - буду копаться в логе. Не знаю даст это что-то или нет, но ничего лучше я пока не придумал.
Какую всё таки блокировку используешь по итогу? Подозреваю, что TableSyncer используется для работы с таблицами внутри зенки и из-за него так точно может что-то локать надолго, а InputSyncer возможно тоже где-то может быть, поэтому идеальный вариант - свой кастомный.
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
Какую всё таки блокировку используешь по итогу?
Сейчас использую свою блокировку - собрал dll отдельно и в него закинул объект для блокировки. И всё-равно проблемы.
Сейчас провожу тесты. Прогресс есть, но пока рано делать выводы. Как только станет что-то более или менее понятно сразу тут отпишу.
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
Описываю ситуацию, которая сложилась у меня (я не могу гарантировать, что у вас всё так же).

В моём случае виновником зависания был метод System.Windows.Forms.Clipboard.GetText(). Я попытался покопать интернет в поисках решений, но из того что находил всё было слишком сложным.

Был выбран самый лёгкий путь - удалил строку где идёт вызов данного метода (ну и ещё пару строк, которые отвечали за возврат буфера обмена в первоначальное состояние). После этих манипуляций тестовый шаблон отработал без проблем около 400 выполнений. В то время как до удаления метода шаблон зависал буквально через 5 выполнений. В тестовом шаблоне использовал стандартный lock-объект SyncObjects.InputSyncer

Мой шаблон работает в отдельном VirtualBox, в настройках отключил "Общий буфер обмена" поэтому данный способ меня вполне устраивает. Данный способ не подойдёт тем, кто работает на основной машине, т.к. шаблон будет очищать буфер обмена


ВНИМАНИЕ! Нижеприведённый код безвозвратно удаляет содержимое буфера обмена ВНИМАНИЕ!

Код взят из этого поста, в данном варианте убран метод GetText() и ещё несколько строк, которые стали ненужными.
C#:
/* =============================================================== */
/*Нижеприведённый код безвозвратно удаляет содержимое буфера обмена*/
/* =============================================================== */
lock(SyncObjects.InputSyncer)
{
  var descr = project.Variables["rez"].Value;
  if (String.IsNullOrEmpty(descr)) {
  throw new Exception("Пустой текст для вставки");
  }
  // сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
  System.Windows.Forms.Clipboard.SetText(descr);
  instance.ActiveTab.KeyEvent("v","press","ctrl");
  // стираем буфер и возвращаем его к первоначальному состоянию
  System.Windows.Forms.Clipboard.Clear();
}
 
Последнее редактирование модератором:
  • Спасибо
Реакции: udder и Lord_Alfred

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
Единственное что в коде потерял первую строку: lock(SyncObjects.InputSyncer)
 
  • Спасибо
Реакции: nicanil

xatchikzzz

Client
Регистрация
08.09.2010
Сообщения
577
Благодарностей
41
Баллы
28
а по итогу как положить значение и потом начать к примеру сtrl+v
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

xatchikzzz

Client
Регистрация
08.09.2010
Сообщения
577
Благодарностей
41
Баллы
28

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113

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