Нужна помощь в правке скрипта-кликера для ВК
var i = 1;
var script;
var flag = true;
function callbackFunc(result) {
if (result.response >= 1573106399) {
if (flag == true) {
setTimeout (function () {
flag = false;
document.querySelector("#content > div > div.im-page.js-im-page.im-page_classic.im-page_history-show > div.im-page--history.page_block._im_page_history > div.im-page-history-w > div.im-page--chat-input._im_chat_input_w > div.im-chat-input.clear_fix.im-chat-input_classic._im_chat_input_parent > div.im-chat-input--textarea.fl_l._im_text_input._emoji_field_wrap > div.im-chat-input--txt-wrap._im_text_wrap > button").click();
}, 530)
}
}
}
function myLoop () {
setTimeout(function () {
script = document.createElement('SCRIPT');
script.src = "https://api.vk.com/method/utils.getServerTime?&access_token=bca63fbbbca63fbbbca63fbbfbbccafe57bbca6bca63fbbe1d2a790c16613abe7a292dc&v=5.52&callback=callbackFunc";
document.getElementsByTagName("head")[0].appendChild(script);
var result;
if (result !=undefined) {
callbackFunc(result);
}
i++;
if (i < 10000) {
myLoop();
}
}, 50)
}
if (i < 10000) {
myLoop();
}
|
ребята, что не так со скриптом, он нажимает на значок отправки очень большое количество раз и в хроме выскакивает ошибка, которую, нужно закрывать от 7 до 130 раз?
|
объясню подробнее, этот скрипт спрашивает каждые 50мс "который час?" у сервера ВК, если время по Юникс-тайм становится больше указанного, то он делает задержку в определенное количество мс (530мс, в данном случае) и отправляет сообщение. помогите,пожалуйста, может быть, у Вас получится мне достойную альтернативу скинуть этому скрипту.
Цель создания: мне нужно отправлять сообщение в определенное время, но так, чтобы оно приходило в беседу ровно в 9:00, причем раньше всех остальных в очереди,которые отправляют вручную. т.е. у меня 9:00, остальные 8:59, либо 9:00, но позже моего сообщение выложено в беседу. |
Цитата:
|
получается, что ВК действительно туп)))
скрипт работает, когда наступает указанное время, скрипт реально делает задержку в 530мс и отправляет сообщение, только непонятно, для чего он ещё 20раз нажимает на значок записи голосового сообщения. как я понял, он спрашивает время у сервера, сервер говорит, что время больше, чем указанное для отправки, поэтому он вытается отправить его снова и снова, каждые 50мс, как задан таймаут для проверки времени. я пробовал менять сетТаймаут на сетИнтервал, но цикл всё равно некорректный. подскажите, как заставить скрипт кликать всего 1 раз по элементу отправки сообщения? буду признателен, если подскажете, как сделать 100% гарантию прихода сообщения на сервер в указанное время, нужна информация для бесед ВК, а не ЛС. Т.к. для ЛС задержка нужна в 700мс примерно, чтобы пришло в 00секунд, но для бесед, когда все отправляют сообщение к этому времени из 10 человек, моё приходит 3им-4ым. |
laimas, whitenickkirov, а почему нельзя только один раз спросить время у ВК, и записать его в константу и уже работать с ним? (Далее, чтобы узнать время по серверу от ВК, вам нужно от текущего локального времени отнять локальное время, когда был получен ответ и прибавить время сервера (локальное время можно получить через Date.now() или performance.now())
Вот, например, так... В объекте tasks можно указать все задачи, которые нужно выполнить в определённое время.
var script = document.createElement("script");
script.src = "https://api.vk.com/method/utils.getServerTime?&access_token=bca63fbbbca63fbbbca63fbbfbbccafe57bbca6bca63fbbe1d2a790c16613abe7a292dc&v=5.52&callback=main";
document.head.appendChild(script);
function main({ response: time }) {
const startClientTime = performance.now() / 1e3;
const startServerTime = time;
(function loop() {
const serverTime = performance.now() / 1e3 - startClientTime + startServerTime;
for (const [time, task] of Object.entries(tasks)) {
if (Number(time) >= startServerTime && serverTime >= Number(time)) {
delete tasks[time];
try {
task(serverTime);
} catch (error) {
console.error(error);
}
}
}
setTimeout(loop, 50);
})();
}
var tasks = {
[1579598059 + 0.530]: async currentServerTime => {
document.querySelector(`
#content > div > div.im-page.js-im-page.im-page_classic.im-page_history-show
> div.im-page--history.page_block._im_page_history > div.im-page-history-w
> div.im-page--chat-input._im_chat_input_w
> div.im-chat-input.clear_fix.im-chat-input_classic._im_chat_input_parent
> div.im-chat-input--textarea.fl_l._im_text_input._emoji_field_wrap
> div.im-chat-input--txt-wrap._im_text_wrap > button
`).click();
},
[1579598065]: async currentServerTime => {
// В этом объекте можно описать однy или несколько задач,
// которые выполняются один раз по достижении указанного времени
},
};
|
Цитата:
|
Цитата:
whitenickkirov, вот ещё пример...
var script = document.createElement("script");
script.src = "https://api.vk.com/method/utils.getServerTime?&access_token=bca63fbbbca63fbbbca63fbbfbbccafe57bbca6bca63fbbe1d2a790c16613abe7a292dc&v=5.52&callback=main";
document.head.appendChild(script);
function main({ response: time }) {
const startServerTime = time;
for (const [time, task] of Object.entries(tasks)) {
const timeout = Number(time) - startServerTime;
if(timeout < 0) continue;
setTimeout(task, 1000 * timeout, Number(time));
}
}
var tasks = {
[1579604333 + 0.530]: async currentServerTime => {
document.querySelector(`
#content > div > div.im-page.js-im-page.im-page_classic.im-page_history-show
> div.im-page--history.page_block._im_page_history > div.im-page-history-w
> div.im-page--chat-input._im_chat_input_w
> div.im-chat-input.clear_fix.im-chat-input_classic._im_chat_input_parent
> div.im-chat-input--textarea.fl_l._im_text_input._emoji_field_wrap
> div.im-chat-input--txt-wrap._im_text_wrap > button
`).click();
},
[1579604333]: async currentServerTime => {
// В этом объекте можно описать одну или несколько задач,
// которые выполняются один раз по достижении указанного времени
},
};
|
Цитата:
|
Цитата:
|
Цитата:
Я за то, чтобы только один раз спросить время у ВК, и записать его в константу и уже работать с ним! А вы с вашим подходом «непременно нужно PHP даже там где не нужно» сильно удивили! Цитата:
|
Цитата:
|
whitenickkirov, правильные ответы находятся в постах №6 и №8, а остальное не имеет отношения к теме
|
Malleys, вот так бы давно, а то я, к чему-то РНР, жуть ... Я где-то писал, что против? :D Мне бы придумать как свою проблему решить, и что вы там предлагаете, я даже не вникаю.
|
Цитата:
даже и не догадался, что можно же один раз спросить время, а потом локальным пользоваться) |
| Часовой пояс GMT +3, время: 02:50. |