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

galardo

Client
Регистрация
23.10.2010
Сообщения
46
Благодарностей
2
Баллы
8
В качестве имени переменной использовать надо не макрос переменной ({-Variable.readytext-}), а только её имя - readytext (макросы вообще в коде использовать нельзя!)
Правильно так project.Variables["readytext"].Value
большое спасибо, все работает
 

KitKat21

Client
Регистрация
02.05.2017
Сообщения
263
Благодарностей
191
Баллы
43
Прекрасно работает!))) Большое спасибо, что поделились! Ты мой спаситель.)
 
  • Спасибо
Реакции: Lord_Alfred

SToRm1kkk

Client
Регистрация
29.12.2019
Сообщения
19
Благодарностей
4
Баллы
3
+ спасибо
 

expert565

Новичок
Регистрация
06.02.2022
Сообщения
3
Благодарностей
0
Баллы
1
К сожалению новый движок Хромиум не работает с данным кодом((( Кто-то нашел решение?
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 415
Благодарностей
9 119
Баллы
113
К сожалению новый движок Хромиум не работает с данным кодом((( Кто-то нашел решение?
Да, есть проблема, не работает этот код в Хромиуме instance.ActiveTab.KeyEvent("v","press","ctrl");
Будет исправлено в след. билдах.
А пока можно попробовать обойти проблему таким вариантом: instance.SendText("{CTRLDOWN}v{CTRLUP}", 15);
 
  • Спасибо
Реакции: expert565

RozMakc

Client
Регистрация
07.11.2016
Сообщения
1
Благодарностей
0
Баллы
1
Да, есть проблема, не работает этот код в Хромиуме instance.ActiveTab.KeyEvent("v","press","ctrl");
Будет исправлено в след. билдах.
А пока можно попробовать обойти проблему таким вариантом: instance.SendText("{CTRLDOWN}v{CTRLUP}", 15);
у меня вместе с буфером вставляется V
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 415
Благодарностей
9 119
Баллы
113
  • Спасибо
Реакции: zava75

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
"Выполнение действия CSharp OwnCode. Значение не может быть неопределенным.
Имя параметра: text"

в 10 потоков не вывозит((
 
Последнее редактирование:

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
Добавил паузы, ошибка пропала)

UPD. После назначения переменной надо паузу тоже поставить.

Там оповещения остались, что бы работали корректно надо сделать так или удалить их
C#:
lock(SyncObjects.InputSyncer) // блокировка
{
    project.SendToLog("1", LogType.Info, true, LogColor.Default);
    var descr = project.Variables["text_result"].Value;
    // Установленная пауза
    System.Threading.Thread.Sleep(1 * 1000);
    // сохраняем предыдущее состояние буфера
    String previous_text = null;
    previous_text = System.Windows.Forms.Clipboard.GetText();

    // сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
    System.Windows.Forms.Clipboard.SetText(descr);
    System.Threading.Thread.Sleep(1 * 1000);
 
    instance.ActiveTab.KeyEvent("v","press","ctrl");
    System.Threading.Thread.Sleep(1 * 1000);
    project.SendToLog("2", LogType.Info, true, LogColor.Default);
    // стираем буфер и возвращаем его к первоначальному состоянию
    System.Windows.Forms.Clipboard.Clear();
    System.Windows.Forms.Clipboard.SetText(previous_text);
 
    System.Threading.Thread.Sleep(1 * 1000);
    project.SendToLog("3", LogType.Info, true, LogColor.Default);
}
 
Последнее редактирование:
  • Спасибо
Реакции: MaximTurbo и spbalexpiter

zava75

Client
Регистрация
01.12.2019
Сообщения
161
Благодарностей
4
Баллы
18
Попробуйте поиграться задержками между нажатиями - число 15.
Скажите пожалуйста вот так вставляю но что бо бывает с буфером не понятное дублируется
/ сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
System.Windows.Forms.Clipboard.SetText(descr);
instance.SendText("{CTRLDOWN}v{CTRLUP}", 15);

как очистить после вставки полностью , вот нашел

// стираем буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
System.Windows.Forms.Clipboard.SetText(previous_text);

только что в переменную пустоту string previous_text = ""; ? или достаточно System.Windows.Forms.Clipboard.Clear(); для нормальной работы? Спасибо
 

nemezida32

Новичок
Регистрация
14.03.2019
Сообщения
4
Благодарностей
0
Баллы
1
Иногда при постинге на чьём-то WEB 2.0 ресурсе возникает такая хрень, что поставлен какой-то хитрый кастомный WYSIWYG-редактор, в который не так то просто запихать текст, а эмуляция клавиатуры работает так долго, что ну просто не приемлемо (или просто нет желания её использовать).
Именно в такой ситуации спасает копирование текста в буфер обмена Windows, а затем вставка его в нужное поле с помощью ZennoPoster. Но при работе с буфером обмена не стоит забывать о важной особенности: буфер один, а потоков - много. Поэтому не редки ситуации, когда в нескольких потоках может вставиться один и тот же текст.

Чтобы решить эту задачу и не прострелить себе ногу - следует использовать C#-сниппет:
Код:
lock(SyncObjects.InputSyncer) // блокировка
{
    var descr = project.Variables["content"].Value;

    // сохраняем предыдущее состояние буфера
    String previous_text = null;
    previous_text = System.Windows.Forms.Clipboard.GetText();

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

    // стираем буфер и возвращаем его к первоначальному состоянию
    System.Windows.Forms.Clipboard.Clear();
    System.Windows.Forms.Clipboard.SetText(previous_text);
}
Для работы этого кода нужно предварительно установить курсор (через эмуляцию клика мыши) в нужное поле. В следующий раз выложу сниппет для поиска элемента и клика мышью внутри него (если нужно?).
В данном коде нужно поменять переменную content на свою - в ней находится ваш текст для вставки.
Это просто божественно, ты сохранил огромное количество моего временни, я никогда не пишу на форумах. Но тут я не удержался.
Низкий поклон и огромная благодарность )))))
 

floppik

Новичок
Регистрация
05.08.2023
Сообщения
1
Благодарностей
0
Баллы
1
Здравствуйте, нужна срочная помощь, по данной теме, в общем у меня есть написанный код созданием и дальнейшим копированием email-адреса(копирование происходит по кнопке), а далее мне нужно вставить этот email на другой сайт, но как мне это сделать? Не могу найти не один код, который мне подходит.
 

xelium

Client
Регистрация
11.06.2021
Сообщения
3
Благодарностей
6
Баллы
3
Спасибо всем за сниппеты кода на C#, но мне ни один из них не подошел по разным причинам. Посмотрел через chrome dev tools какие события происходят при вставке из буфера через команду monitorEvents($0) и далее обратился к chatgpt. В итоге получил такой вариант, работающий на JS. Пользуйтесь))

Вставка текста из буфера обмена с эмуляцией событий нажатия ctrl+v на JavaScript:
// Автор кода - chatgpt
// Найдем элемент по XPath
var xpathExpression = "//input"; // Замените на свой XPath
var targetElement = document.evaluate(xpathExpression, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

// Проверим, что элемент найден
if (targetElement) {
  // Текст для вставки
  var textToPaste = "{-Variable.substring-}"; // Тут ваша переменная с текстом

  // Далее эмулируем те же события, что и в хром дев тулс через monitorEvents($0)
  // Создаем событие keydown для Ctrl
  var ctrlKeyDownEvent = new KeyboardEvent("keydown", { key: "Control" });

  // Создаем событие keydown для V
  var vKeyDownEvent = new KeyboardEvent("keydown", { key: "v", ctrlKey: true });

  // Создаем событие keyup для Ctrl
  var ctrlKeyUpEvent = new KeyboardEvent("keyup", { key: "Control" });

  // Создаем событие keyup для V
  var vKeyUpEvent = new KeyboardEvent("keyup", { key: "v", ctrlKey: true });

  // Диспетчеризируем события
  targetElement.dispatchEvent(ctrlKeyDownEvent);
  targetElement.dispatchEvent(vKeyDownEvent);

  // Вставляем текст в элемент
  targetElement.value = textToPaste; // Если элемент - это input или textarea

  targetElement.dispatchEvent(vKeyUpEvent);
  targetElement.dispatchEvent(ctrlKeyUpEvent);
}
 
  • Спасибо
Реакции: ZennoCat

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Спасибо всем за сниппеты кода на C#, но мне ни один из них не подошел по разным причинам. Посмотрел через chrome dev tools какие события происходят при вставке из буфера через команду monitorEvents($0) и далее обратился к chatgpt. В итоге получил такой вариант, работающий на JS. Пользуйтесь))

Вставка текста из буфера обмена с эмуляцией событий нажатия ctrl+v на JavaScript:
// Автор кода - chatgpt
// Найдем элемент по XPath
var xpathExpression = "//input"; // Замените на свой XPath
var targetElement = document.evaluate(xpathExpression, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

// Проверим, что элемент найден
if (targetElement) {
  // Текст для вставки
  var textToPaste = "{-Variable.substring-}"; // Тут ваша переменная с текстом

  // Далее эмулируем те же события, что и в хром дев тулс через monitorEvents($0)
  // Создаем событие keydown для Ctrl
  var ctrlKeyDownEvent = new KeyboardEvent("keydown", { key: "Control" });

  // Создаем событие keydown для V
  var vKeyDownEvent = new KeyboardEvent("keydown", { key: "v", ctrlKey: true });

  // Создаем событие keyup для Ctrl
  var ctrlKeyUpEvent = new KeyboardEvent("keyup", { key: "Control" });

  // Создаем событие keyup для V
  var vKeyUpEvent = new KeyboardEvent("keyup", { key: "v", ctrlKey: true });

  // Диспетчеризируем события
  targetElement.dispatchEvent(ctrlKeyDownEvent);
  targetElement.dispatchEvent(vKeyDownEvent);

  // Вставляем текст в элемент
  targetElement.value = textToPaste; // Если элемент - это input или textarea

  targetElement.dispatchEvent(vKeyUpEvent);
  targetElement.dispatchEvent(ctrlKeyUpEvent);
}
а буфер обмена тут причем?
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
  • Спасибо
Реакции: izubr

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 307
Благодарностей
865
Баллы
113
Скоро будем говорить "gpt наше все"))



Так в коде нажатие crtl+v. Или буфер обмена это про другое?
Не, тут просто сайту показывает как будто control+v юзер нажал и все. Вставка идет как через value в нужный текст (как через кубик установить значение value). К буферу никакого отношения не имеет.
 
  • Спасибо
Реакции: izubr и Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
Не, тут просто сайту показывает как будто control+v юзер нажал и все. Вставка идет как через value в нужный текст (как через кубик установить значение value). К буферу никакого отношения не имеет.
Хитро)) как вариант эмуляции кстати. Не всегда удобно буфер забивать. А использования буфера базовая возможность и не вызовет вопросов у сайта (если только у очень придирчивого).

А то эмуль клавы вбивал левые keys. Не так то много полностью рабочих эмуляций ввода в зенке. Проще буфером шарахнуть :D
 
  • Спасибо
Реакции: izubr

kagorec

Client
Регистрация
24.08.2013
Сообщения
979
Благодарностей
524
Баллы
93
Спасибо всем за сниппеты кода на C#, но мне ни один из них не подошел по разным причинам. Посмотрел через chrome dev tools какие события происходят при вставке из буфера через команду monitorEvents($0) и далее обратился к chatgpt. В итоге получил такой вариант, работающий на JS. Пользуйтесь))

Вставка текста из буфера обмена с эмуляцией событий нажатия ctrl+v на JavaScript:
// Автор кода - chatgpt
// Найдем элемент по XPath
var xpathExpression = "//input"; // Замените на свой XPath
var targetElement = document.evaluate(xpathExpression, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

// Проверим, что элемент найден
if (targetElement) {
  // Текст для вставки
  var textToPaste = "{-Variable.substring-}"; // Тут ваша переменная с текстом

  // Далее эмулируем те же события, что и в хром дев тулс через monitorEvents($0)
  // Создаем событие keydown для Ctrl
  var ctrlKeyDownEvent = new KeyboardEvent("keydown", { key: "Control" });

  // Создаем событие keydown для V
  var vKeyDownEvent = new KeyboardEvent("keydown", { key: "v", ctrlKey: true });

  // Создаем событие keyup для Ctrl
  var ctrlKeyUpEvent = new KeyboardEvent("keyup", { key: "Control" });

  // Создаем событие keyup для V
  var vKeyUpEvent = new KeyboardEvent("keyup", { key: "v", ctrlKey: true });

  // Диспетчеризируем события
  targetElement.dispatchEvent(ctrlKeyDownEvent);
  targetElement.dispatchEvent(vKeyDownEvent);

  // Вставляем текст в элемент
  targetElement.value = textToPaste; // Если элемент - это input или textarea

  targetElement.dispatchEvent(vKeyUpEvent);
  targetElement.dispatchEvent(ctrlKeyUpEvent);
}
Во многоптоке работает корректно?)
 
  • Спасибо
Реакции: izubr

xelium

Client
Регистрация
11.06.2021
Сообщения
3
Благодарностей
6
Баллы
3
Во многоптоке работает корректно?)
Да, корректно, потому что как таковой буфер обмена ОС тут не используется. Мы эмулируем вставку контента через JS-события, минуя буфер обмена ОС. Как раз все предложенные варианты в теме мне не подошли отчасти из-за проблем с многопотоком, а также из-за проблем с буфером. Потому что во время работы зенки не получится пользоваться ctrl+c, т к туда попадали значения из шаблона
 
  • Спасибо
Реакции: izubr и kagorec

kagorec

Client
Регистрация
24.08.2013
Сообщения
979
Благодарностей
524
Баллы
93
Да, корректно, потому что как таковой буфер обмена ОС тут не используется. Мы эмулируем вставку контента через JS-события, минуя буфер обмена ОС. Как раз все предложенные варианты в теме мне не подошли отчасти из-за проблем с многопотоком, а также из-за проблем с буфером. Потому что во время работы зенки не получится пользоваться ctrl+c, т к туда попадали значения из шаблона
Спасибо всем за сниппеты кода на C#, но мне ни один из них не подошел по разным причинам. Посмотрел через chrome dev tools какие события происходят при вставке из буфера через команду monitorEvents($0) и далее обратился к chatgpt. В итоге получил такой вариант, работающий на JS. Пользуйтесь))

Вставка текста из буфера обмена с эмуляцией событий нажатия ctrl+v на JavaScript:
// Автор кода - chatgpt
// Найдем элемент по XPath
var xpathExpression = "//input"; // Замените на свой XPath
var targetElement = document.evaluate(xpathExpression, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

// Проверим, что элемент найден
if (targetElement) {
  // Текст для вставки
  var textToPaste = "{-Variable.substring-}"; // Тут ваша переменная с текстом

  // Далее эмулируем те же события, что и в хром дев тулс через monitorEvents($0)
  // Создаем событие keydown для Ctrl
  var ctrlKeyDownEvent = new KeyboardEvent("keydown", { key: "Control" });

  // Создаем событие keydown для V
  var vKeyDownEvent = new KeyboardEvent("keydown", { key: "v", ctrlKey: true });

  // Создаем событие keyup для Ctrl
  var ctrlKeyUpEvent = new KeyboardEvent("keyup", { key: "Control" });

  // Создаем событие keyup для V
  var vKeyUpEvent = new KeyboardEvent("keyup", { key: "v", ctrlKey: true });

  // Диспетчеризируем события
  targetElement.dispatchEvent(ctrlKeyDownEvent);
  targetElement.dispatchEvent(vKeyDownEvent);

  // Вставляем текст в элемент
  targetElement.value = textToPaste; // Если элемент - это input или textarea

  targetElement.dispatchEvent(vKeyUpEvent);
  targetElement.dispatchEvent(ctrlKeyUpEvent);
}
Замечательно!)
Наконецто решение с быстрой вставкой текста появилось.


На веб версии ИИ сайтов особенно где генерируется результат в виде текста, есть кнопка COPY (именно этот вариант) которая в буфер помещает результат - такое можно сохранять без использования буфера Windows?
 
Последнее редактирование:
  • Спасибо
Реакции: izubr и SanchoPancho

rumobik

Client
Регистрация
29.01.2024
Сообщения
24
Благодарностей
1
Баллы
3
Спасибо всем за сниппеты кода на C#, но мне ни один из них не подошел по разным причинам. Посмотрел через chrome dev tools какие события происходят при вставке из буфера через команду monitorEvents($0) и далее обратился к chatgpt. В итоге получил такой вариант, работающий на JS. Пользуйтесь))

Вставка текста из буфера обмена с эмуляцией событий нажатия ctrl+v на JavaScript:
// Автор кода - chatgpt
// Найдем элемент по XPath
var xpathExpression = "//input"; // Замените на свой XPath
var targetElement = document.evaluate(xpathExpression, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

// Проверим, что элемент найден
if (targetElement) {
  // Текст для вставки
  var textToPaste = "{-Variable.substring-}"; // Тут ваша переменная с текстом

  // Далее эмулируем те же события, что и в хром дев тулс через monitorEvents($0)
  // Создаем событие keydown для Ctrl
  var ctrlKeyDownEvent = new KeyboardEvent("keydown", { key: "Control" });

  // Создаем событие keydown для V
  var vKeyDownEvent = new KeyboardEvent("keydown", { key: "v", ctrlKey: true });

  // Создаем событие keyup для Ctrl
  var ctrlKeyUpEvent = new KeyboardEvent("keyup", { key: "Control" });

  // Создаем событие keyup для V
  var vKeyUpEvent = new KeyboardEvent("keyup", { key: "v", ctrlKey: true });

  // Диспетчеризируем события
  targetElement.dispatchEvent(ctrlKeyDownEvent);
  targetElement.dispatchEvent(vKeyDownEvent);

  // Вставляем текст в элемент
  targetElement.value = textToPaste; // Если элемент - это input или textarea

  targetElement.dispatchEvent(vKeyUpEvent);
  targetElement.dispatchEvent(ctrlKeyUpEvent);
}
Как сделать если поле ввода не input или textarea а находится в span. Скрипт не вставляет....
 

xatchikzzz

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

kagorec

Client
Регистрация
24.08.2013
Сообщения
979
Благодарностей
524
Баллы
93
Спасибо всем за сниппеты кода на C#, но мне ни один из них не подошел по разным причинам. Посмотрел через chrome dev tools какие события происходят при вставке из буфера через команду monitorEvents($0) и далее обратился к chatgpt. В итоге получил такой вариант, работающий на JS. Пользуйтесь))

Вставка текста из буфера обмена с эмуляцией событий нажатия ctrl+v на JavaScript:
// Автор кода - chatgpt
// Найдем элемент по XPath
var xpathExpression = "//input"; // Замените на свой XPath
var targetElement = document.evaluate(xpathExpression, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

// Проверим, что элемент найден
if (targetElement) {
  // Текст для вставки
  var textToPaste = "{-Variable.substring-}"; // Тут ваша переменная с текстом

  // Далее эмулируем те же события, что и в хром дев тулс через monitorEvents($0)
  // Создаем событие keydown для Ctrl
  var ctrlKeyDownEvent = new KeyboardEvent("keydown", { key: "Control" });

  // Создаем событие keydown для V
  var vKeyDownEvent = new KeyboardEvent("keydown", { key: "v", ctrlKey: true });

  // Создаем событие keyup для Ctrl
  var ctrlKeyUpEvent = new KeyboardEvent("keyup", { key: "Control" });

  // Создаем событие keyup для V
  var vKeyUpEvent = new KeyboardEvent("keyup", { key: "v", ctrlKey: true });

  // Диспетчеризируем события
  targetElement.dispatchEvent(ctrlKeyDownEvent);
  targetElement.dispatchEvent(vKeyDownEvent);

  // Вставляем текст в элемент
  targetElement.value = textToPaste; // Если элемент - это input или textarea

  targetElement.dispatchEvent(vKeyUpEvent);
  targetElement.dispatchEvent(ctrlKeyUpEvent);
}
Надо отметить что в JS кубике исполнение `на текущей странице`

Проверил код, с короткими предложениями в одну строку работает хорошо.
Но если там статья с переносом строки и еще с html тегами то не работает.
 
Последнее редактирование:
  • Спасибо
Реакции: izubr

Pendolf

Client
Регистрация
25.11.2019
Сообщения
95
Благодарностей
63
Баллы
18
100% способ вставки из переменной:

string textToPaste = project.Variables["text"].Value;
System.Windows.Forms.Clipboard.SetText(textToPaste);
instance.ActiveTab.KeyEvent("v", "press", "ctrl");
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
  • Спасибо
Реакции: Ribas

Pendolf

Client
Регистрация
25.11.2019
Сообщения
95
Благодарностей
63
Баллы
18
Последнее редактирование:

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 307
Благодарностей
865
Баллы
113

Pendolf

Client
Регистрация
25.11.2019
Сообщения
95
Благодарностей
63
Баллы
18

Nord

Client
Регистрация
22.03.2012
Сообщения
2 406
Благодарностей
1 473
Баллы
113
  • Спасибо
Реакции: kagorec

Pendolf

Client
Регистрация
25.11.2019
Сообщения
95
Благодарностей
63
Баллы
18
Решение для многопотока:


lock(SyncObjects.InputSyncer) // блокировка потока
{
string text = project.Variables["Your_Text"].Value;

// сохраняем текущее состояние буфера
String previous_text = null;
previous_text = System.Windows.Forms.Clipboard.GetText();

// сохраняем объедененный вами ранее текст в буфер производим действие {CTRL+V}
System.Windows.Forms.Clipboard.SetText(text);
instance.ActiveTab.KeyEvent("v","press","ctrl");

// чистим буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
System.Windows.Forms.Clipboard.SetText(previous_text);
}
 

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