Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Нужна помощь в правке скрипта-кликера для ВК (https://javascript.ru/forum/project/79296-nuzhna-pomoshh-v-pravke-skripta-klikera-dlya-vk.html)

whitenickkirov 21.01.2020 02:43

Нужна помощь в правке скрипта-кликера для ВК
 
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(); 
}

whitenickkirov 21.01.2020 02:46

ребята, что не так со скриптом, он нажимает на значок отправки очень большое количество раз и в хроме выскакивает ошибка, которую, нужно закрывать от 7 до 130 раз?

whitenickkirov 21.01.2020 02:51

объясню подробнее, этот скрипт спрашивает каждые 50мс "который час?" у сервера ВК, если время по Юникс-тайм становится больше указанного, то он делает задержку в определенное количество мс (530мс, в данном случае) и отправляет сообщение. помогите,пожалуйста, может быть, у Вас получится мне достойную альтернативу скинуть этому скрипту.
Цель создания: мне нужно отправлять сообщение в определенное время, но так, чтобы оно приходило в беседу ровно в 9:00, причем раньше всех остальных в очереди,которые отправляют вручную. т.е. у меня 9:00, остальные 8:59, либо 9:00, но позже моего сообщение выложено в беседу.

laimas 21.01.2020 10:37

Цитата:

Сообщение от whitenickkirov
этот скрипт спрашивает каждые 50мс "который час?"

И вы реально полагаете, что ВК настолько туп, что не посчитает ваши запросы атакой?

whitenickkirov 21.01.2020 11:08

получается, что ВК действительно туп)))
скрипт работает, когда наступает указанное время, скрипт реально делает задержку в 530мс и отправляет сообщение, только непонятно, для чего он ещё 20раз нажимает на значок записи голосового сообщения. как я понял, он спрашивает время у сервера, сервер говорит, что время больше, чем указанное для отправки, поэтому он вытается отправить его снова и снова, каждые 50мс, как задан таймаут для проверки времени. я пробовал менять сетТаймаут на сетИнтервал, но цикл всё равно некорректный. подскажите, как заставить скрипт кликать всего 1 раз по элементу отправки сообщения? буду признателен, если подскажете, как сделать 100% гарантию прихода сообщения на сервер в указанное время, нужна информация для бесед ВК, а не ЛС. Т.к. для ЛС задержка нужна в 700мс примерно, чтобы пришло в 00секунд, но для бесед, когда все отправляют сообщение к этому времени из 10 человек, моё приходит 3им-4ым.

Malleys 21.01.2020 12:20

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 или несколько задач,
		// которые выполняются один раз по достижении указанного времени
	},
};

laimas 21.01.2020 13:08

Цитата:

Сообщение от whitenickkirov
получается, что ВК действительно туп

Он как раз умен и ваши эксперименты могут закончится блокировкой вашего домена с его стороны. Чтобы обрабатывать запросы с такой частотой нужно держать соединение открытым, чего для вас ВК делать не станет. А реальную картину бардака и почему браузер недоволен смотрите в сетевой вкладке отладчика.

Malleys 21.01.2020 13:23

Цитата:

Сообщение от laimas
Чтобы обрабатывать запросы с такой частотой нужно держать соединение открытым, чего для вас ВК делать не станет.

Так я у вас и спросил, «почему нельзя только один раз спросить время у ВК, и записать его в константу и уже работать с ним?» И даже привёл пример, какие ещё могут быть сомнения? Или что именно вам не понятно в приведённом коде?

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 => {
		// В этом объекте можно описать одну или несколько задач,
		// которые выполняются один раз по достижении указанного времени
	},
};

laimas 21.01.2020 14:33

Цитата:

Сообщение от Malleys
Так я у вас и спросил, «почему нельзя только один раз спросить время у ВК

А я тут причем? Меня удивляет только одно - валить сервер и браузер запросами и считать это порядком вещей. А ВК мне он и даром не нужен, чего от него хотят мне все равно, предлагайте и объясняйте автору.

рони 21.01.2020 14:41

Цитата:

Сообщение от Malleys
async currentServerTime

почему async?

Malleys 21.01.2020 16:53

Цитата:

Сообщение от laimas
Меня удивляет только одно - валить сервер и браузер запросами и считать это порядком вещей.

Если бы читал, а не занимался догадками... А я разве пишу не против — «почему нельзя только один раз спросить время у ВК, и записать его в константу и уже работать с ним?»

Я за то, чтобы только один раз спросить время у ВК, и записать его в константу и уже работать с ним! А вы с вашим подходом «непременно нужно PHP даже там где не нужно» сильно удивили!

Цитата:

Сообщение от рони
почему async?

Можно и без async, просто я подумал, что автор захочет делать ещё какие-либо асинхронные действия с await.

laimas 21.01.2020 17:32

Цитата:

Сообщение от Malleys
А вы с вашим подходом «непременно нужно PHP даже там где не нужно» сильно удивили!

Вам впору уже диагноз ставить. Что вообще уже крыша поехала? Меня просто удивило, что товарищ пытается сделать то, что нельзя и спрашивает почему. Вот на это я и ответил, а что вы там ему предлагаете, мне как-то пох, хоть пляшите, мне все равно.

Malleys 21.01.2020 17:54

whitenickkirov, правильные ответы находятся в постах №6 и №8, а остальное не имеет отношения к теме

laimas 21.01.2020 18:01

Malleys, вот так бы давно, а то я, к чему-то РНР, жуть ... Я где-то писал, что против? :D Мне бы придумать как свою проблему решить, и что вы там предлагаете, я даже не вникаю.

whitenickkirov 24.01.2020 08:25

Цитата:

Сообщение от Malleys (Сообщение 519027)
whitenickkirov, правильные ответы находятся в постах №6 и №8, а остальное не имеет отношения к теме

спасибо огромное, "ларчик просто открывался:lol: " ))
даже и не догадался, что можно же один раз спросить время, а потом локальным пользоваться)


Часовой пояс GMT +3, время: 04:57.