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

Решил кто проблему? У меня так же виснет через какое то время
 
У себя заметил что это не с зенкой связано. Почему-то пропадает временами возможность копипаста, даже руками.
 
У себя заметил что это не с зенкой связано. Почему-то пропадает временами возможность копипаста, даже руками.
Я код что в шапке зациклил, пока только таким Макаром выхожу из положения. Тот что дальше скидывали он у меня тупо встаёт и ничего не делает, может хоть целый день в таком состоянии провисеть и при этом ни ошибки не выдать и не вставить. А в шапке код сразу выдаёт ошибку. В итоге с таймером его связал и зациклил пока не выполнит. Причём связи вообще не вижу. Порой сутками нормально работает, а порой моментами начинает гнать.
 
Самый простой и на 99% работающий вариант - это кликнуть вот так:
C#:
Развернуть Свернуть Копировать
HtmlElement he = instance.ActiveTab.FindElementById("text"); // идентификатор text нужно заменить на свой, на тот id, по которому нужно кликнуть
he.Click();
привет.
отличный способ для клика по элементу, спасибо!
Вопрос, а как можно сразу же в этом снипете с эмулировать ввод с клавиатуры(есть переменная и в ней данные) которые нужно ввести в поле которое нашли. Вот пример: http://prntscr.com/hh98xh
Спасибо за ответ!
 
привет.
отличный способ для клика по элементу, спасибо!
Вопрос, а как можно сразу же в этом снипете с эмулировать ввод с клавиатуры(есть переменная и в ней данные) которые нужно ввести в поле которое нашли. Вот пример: http://prntscr.com/hh98xh
Спасибо за ответ!
Код:
Развернуть Свернуть Копировать
he.SetAttribute("value", project.Variable["text"].Value);
 
  • Спасибо
Реакции: Lord_Alfred
Код:
Развернуть Свернуть Копировать
he.SetAttribute("value", project.Variable["text"].Value);
спасибо за быстрый ответ. я тут еще докумекал перевести обычную эмуляцию "кубик" в С# и вставил после

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

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

Код:
Развернуть Свернуть Копировать
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
Подредактировал сниппет вставки текста из буфера обмена.
Проблема: Выскакивала ошибка, если в буфер обмена был пуст или в нем содержался не текст, а что-то другое, например картинка.
Решение: добавлена проверка на содержания текста в буфере обмена при возврате данных в буфер. Если текста нет, то в буфер ничего не возвращается.


Код:
Развернуть Свернуть Копировать
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);
    }
}
 
Огромнейшее спасибо. :bo::bp::bo::bp:
 
Кто-то решил проблему с зависаниями?Пробовал сниппет в первом посте, в последнем, как ни крути зависает на глухо. Что делать то?Запускаю 3 потока, через время смотрю - все 3 зависли на вставке сообщения.
 
Кто-то решил проблему с зависаниями?Пробовал сниппет в первом посте, в последнем, как ни крути зависает на глухо. Что делать то?Запускаю 3 потока, через время смотрю - все 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
Здравствуйте! Спасибо за код.
Подскажите, пожалуйста, а что нужно сделать, чтобы текст из буфера не вставляло куда-то, а сохраняло в переменную? Пробовала изменить ваш код под себя:
Код:
Развернуть Свернуть Копировать
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);
}

и другие модификации - результат тот же.
 
Подскажите, пожалуйста, а что нужно сделать, чтобы текст из буфера не вставляло куда-то, а сохраняло в переменную? Пробовала изменить ваш код под себя:
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;
    }
}
 
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
Тоже столкнулся с проблемой зависания шаблона при вставке текста из буфера обмена. Версия программы - 5.28.0.0
Зенка у меня работает в VirtualBox, общий буфер обмена отключил (думал может это поможет, но нет). Пробовал заменить SyncObjects.InputSyncer на SyncObjects.TableSyncer как подсказали чуть выше. Но это тоже не дало желаемого результата - код всё-равно зависал (мог провисеть минуту, 5 минут, 15 и более).

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

На данный момент шаблон работает больше суток, зависаний не замечал.
Справедливости ради стоит заметить, что один раз код "задумался" на 7 секунд (в обычных условиях вставка у меня занимает 1-2 секунды).
 
  • Спасибо
Реакции: Advice
Ха-ха-ха*HAHA*
Надо было молчать.
Сейчас глянул на работу шаблона, а он висит на вставке из буфера:dy: Висел относительно не долго, 6 минут, но тем не менее.
Поиски решения проблемы продолжаются.
Stay tuned.
 
Поиски решения проблемы продолжаются.
Проверял какой вид эмуляции выставлен в шаблоне? Если там на "качество" вставка, то может оказаться что он побуквенно вставляет (но не уверен, т.к. не эмуляция клавы же).
Ну и смотреть надо через инстансы что там происходит по-хорошему. Да и в саму реализацию вставки в C# не мешало бы посмотреть, там тоже явно какие-то блокировки задействуются, наверное, так что они может создают такую жесть,
 
Проверял какой вид эмуляции выставлен в шаблоне? Если там на "качество" вставка, то может оказаться что он побуквенно вставляет (но не уверен, т.к. не эмуляция клавы же).
Да, стоит на "качество". Но как ты уже правильно подметил - это не эмуляция.
Ну и смотреть надо через инстансы что там происходит по-хорошему.
А там ничего не происходит. Просто висит себе шаблон и всё. Курсор моргает в поле ввода (куда должен вставиться текст), я могу взаимодействовать с сайтом (т.е. это не проблема зависшего инстанса).

Пока что я в сниппете буквально через каждую строчку расставил вывод сообщений в лог. Как только ещё раз зависнет - буду копаться в логе. Не знаю даст это что-то или нет, но ничего лучше я пока не придумал.
 
Пока что я в сниппете буквально через каждую строчку расставил вывод сообщений в лог. Как только ещё раз зависнет - буду копаться в логе. Не знаю даст это что-то или нет, но ничего лучше я пока не придумал.
Какую всё таки блокировку используешь по итогу? Подозреваю, что TableSyncer используется для работы с таблицами внутри зенки и из-за него так точно может что-то локать надолго, а InputSyncer возможно тоже где-то может быть, поэтому идеальный вариант - свой кастомный.
 
Какую всё таки блокировку используешь по итогу?
Сейчас использую свою блокировку - собрал dll отдельно и в него закинул объект для блокировки. И всё-равно проблемы.
Сейчас провожу тесты. Прогресс есть, но пока рано делать выводы. Как только станет что-то более или менее понятно сразу тут отпишу.
 
Описываю ситуацию, которая сложилась у меня (я не могу гарантировать, что у вас всё так же).

В моём случае виновником зависания был метод 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
а по итогу как положить значение и потом начать к примеру сtrl+v
 
5147fbdfb5cd7b9f8fcba4fcb2c730f7.png


с чем это связанно?
 

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