Я пытаюсь автоматизировать отправку ответов на мои сообщения Steemit, используя простой JS или JQuery.
Я использовал приведенный ниже код javascript, но кнопка остается отключенной и поэтому не позволяет публиковать ответ / комментарий.
Как я могу правильно запускать события keydown / keypress / keyup в текстовой области, чтобы имитировать "классическое" взаимодействие пользователя для отправки ответа?
Спасибо
Пример цели: https://steemit.com/usa/@gaottantacinque/happy-4th-of-july
В консоли Dev Tools:
function nap (durationMs) {
new Promise(resolve => setTimeout(() => resolve(), durationMs))
}
async function replyToPost() {
var replyBtn = document.getElementsByClassName("PostFull__reply")[0]
.getElementsByTagName('a')[0];
replyBtn.click();
await nap(1000);
var textarea = document.getElementsByTagName('textarea')[0];
const msg = 'My programmatically generated comment goes here';
textarea.focus();
textarea.click();
textarea.value = msg; // textarea.innerHTML = msg; textarea.innerText = msg;
await nap(100);
var postReplyBtn = document.querySelectorAll('[type=submit]')[1];
// postReplyBtn.disabled = false;
postReplyBtn.click();
}
replyToPost();
Заметки: Этот код заполняет текстовое поле, но кнопка по-прежнему неактивна. Просто вручную щелкнув текстовое поле и набрав что-нибудь, вместо этого активируется кнопка.
Кроме того, значение textarea, вставленное программно, исчезает после щелчка, например, на фоне, но не при обычном вводе.
Я перепроверяю, но не думаю, что это проблема. Существует множество ботов, и сообщество поощряет их использование.
В этом случае программный запуск события был запрошен ранее: Программный запуск события нажатия клавиши в ванильном Javascript посмотрите, работает ли это для вас.
Стим-боты в порядке: steemit.com/steem/@earthnation/…
@HereticMonkey нашел решение. Это ошибка в ReactJs.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробовав все, я обнаружил, что проблема, похоже, связана с ошибкой в React при запуске onchange для текстовых полей.
Есть обходной путь ..
function setNativeValue(element, value) {
const valueSetter = Object.getOwnPropertyDescriptor(element, 'value').set;
const prototype = Object.getPrototypeOf(element);
const prototypeValueSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;
if (valueSetter && valueSetter !== prototypeValueSetter) {
prototypeValueSetter.call(element, value);
} else {
valueSetter.call(element, value);
}
}
var textarea = document.getElementsByTagName('textarea')[0];
setNativeValue(textarea, 'My automated comment here');
textarea.dispatchEvent(new Event('input', { bubbles: true }));
в некоторых случаях это может не сработать, как и для меня, но вот общее решение:
const textarea = document.getElementsByTagName('textarea')[0]
function setNativeValue(element, value) {
const { set: valueSetter } = Object.getOwnPropertyDescriptor(element, 'value') || {}
const prototype = Object.getPrototypeOf(element)
const { set: prototypeValueSetter } = Object.getOwnPropertyDescriptor(prototype, 'value') || {}
if (prototypeValueSetter && valueSetter !== prototypeValueSetter) {
prototypeValueSetter.call(element, value)
} else if (valueSetter) {
valueSetter.call(element, value)
} else {
throw new Error('The given element does not have a value setter')
}
}
setNativeValue(textarea, 'some text')
textarea.dispatchEvent(new Event('input', { bubbles: true }))
я также хочу поблагодарить предыдущего человека, который писал об этом ... это действительно помогло ОЧЕНЬ
Вам, вероятно, следует обязательно прочитать Условия использования сайта, чтобы убедиться, что вы можете использовать ботов; вероятно, есть причина, по которой они затруднили это программно ...