1 (изменено: Botsy, 2021-03-05 22:12:52)

Тема: AHK: ожидание загрузки страницы, лайк на ФБ

Здравствуйте. Использую биб. chrome.ahk

Продолжаю делать накрутку лайков на фб, в целом прототип уже работает, однако не стабильно, ну на то он и прототип. Вернулся к старой проблеме.

В общем, надо было дожидаться загрузку страницы, потом лайкать и закрывать вкладку. Встроенный метод WaitForLoad работает плохо. Мне посоветовали переделать таймер, на ожидание загрузки конкретного элемента, а не страницы через "readyState". Так я и сделал. Но у страницы ФБ есть несколько "состояний". Из тех что я заметил, 3: "ошибка контента (очень редко)", "обычное состояние (очень часто)" и "альтернативное состояние(редко)".

По алгоритму скрипт открывает фб -> дожидается элемента -> действует -> закрывает вкладку. Скрипт обрабатывает эти состояния, однако, он часто срывается и делает выводы, не дождавшись загрузки страницы.

Не могли бы вы помочь разобраться с этой ситуацией? Если будет не лень, проверить скрипт можно без стороннего сайта, просто открывая страницу фб с фоткой для лайка, например эту: Пример. И запуская скрипт во время загрузки страницы.

Хотелось бы избавится от лишнего "Sleep" в начале и добавить надежности. Видео скрипта:
https://drive.google.com/file/d/1Wwg4HZ … sp=sharing 1080p


F3::
sleep, 1000
page_facebook := Chrome.GetPageByTitle("Facebook", MatchMode:="contains")

; массив блоков div, включая "нравится"

	like_fb_length_arr_js =
	(
	document.querySelectorAll('div.oajrlxb2.gs1a9yip.g5ia77u1.mtkw9kbi.tlpljxtp.qensuy8j.ppp5ayq2.goun2846.ccm00jje.s44p3ltw.mk2mc5f4.rt8b4zig.n8ej3o3l.agehan2d.sk4xxmp2.rq0escxv.nhd2j8a9.pq6dq46d.mg4g778l.btwxx1t3.pfnyh3mw.p7hjln8o.kvgmc6g5.cxmmr5t8.oygrvhab.hcukyx3x.tgvbjcpo.hpfvmrgz.jb3vyjys.rz4wbd8a.qt6c0cv9.a8nywdso.l9j0dhe7.i1ao9s8h.esuyzwwr.f1sip0of.du4w35lb.lzcic4wl.abiwlrkh.p8dawk7l').length;
	)

while (page_facebook.Evaluate(like_fb_length_arr_js).value == 0)
	{
		sleep, 100
		tooltip, NO Download
	}
tooltip, Download

; проверка на "ошибка контента (очень редко)"

if (page_facebook.Evaluate("document.querySelector('span.d2edcug0.hpfvmrgz.qv66sw1b.c1et5uql.rrkovp55.a8c37x1j.keod5gw0.nxhoafnm.aigsh9s9.ns63r2gh.fe6kdd0r.mau55g9w.c8b282yb.iv3no6db.o3w64lxj.b2s5l15y.hnhda86s.m9osqain.oqcyycmt')").subtype != "null")
	{
		tooltip, Error content
		page_facebook.Disconnect()
		WinClose, A
		return
	}
else tooltip, No Error content

; проверка на "альтернативное состояние(редко)" + лайк
	
if (page_facebook.Evaluate("document.querySelector('div.oajrlxb2.rh7womw9.g5ia77u1.mtkw9kbi.tlpljxtp.qensuy8j.ppp5ayq2.goun2846.ccm00jje.s44p3ltw.mk2mc5f4.rt8b4zig.n8ej3o3l.agehan2d.sk4xxmp2.rq0escxv.nhd2j8a9.q4pta889.mg4g778l.btwxx1t3.rmfx599b.p7hjln8o.kvgmc6g5.cxmmr5t8.oygrvhab.hcukyx3x.tgvbjcpo.hpfvmrgz.jb3vyjys.rz4wbd8a.qt6c0cv9.a8nywdso.l9j0dhe7.i1ao9s8h.esuyzwwr.f1sip0of.du4w35lb.lzcic4wl.abiwlrkh.p8dawk7l.q4j490t4.bn9dirzp')").subtype != "null")
	{
		tooltip, Alternative OK
		page_facebook.Evaluate("document.querySelector('div.oajrlxb2.rh7womw9.g5ia77u1.mtkw9kbi.tlpljxtp.qensuy8j.ppp5ayq2.goun2846.ccm00jje.s44p3ltw.mk2mc5f4.rt8b4zig.n8ej3o3l.agehan2d.sk4xxmp2.rq0escxv.nhd2j8a9.q4pta889.mg4g778l.btwxx1t3.rmfx599b.p7hjln8o.kvgmc6g5.cxmmr5t8.oygrvhab.hcukyx3x.tgvbjcpo.hpfvmrgz.jb3vyjys.rz4wbd8a.qt6c0cv9.a8nywdso.l9j0dhe7.i1ao9s8h.esuyzwwr.f1sip0of.du4w35lb.lzcic4wl.abiwlrkh.p8dawk7l.q4j490t4.bn9dirzp').click()")
		page_facebook.WaitForLoad()
		page_facebook.Disconnect()
		WinClose, A
		return
	}
else tooltip, No alternative

; обычное состояние + лайк	

	like_fb_js = 
	(
		var elementsArrFb = document.querySelectorAll('div.oajrlxb2.gs1a9yip.g5ia77u1.mtkw9kbi.tlpljxtp.qensuy8j.ppp5ayq2.goun2846.ccm00jje.s44p3ltw.mk2mc5f4.rt8b4zig.n8ej3o3l.agehan2d.sk4xxmp2.rq0escxv.nhd2j8a9.pq6dq46d.mg4g778l.btwxx1t3.pfnyh3mw.p7hjln8o.kvgmc6g5.cxmmr5t8.oygrvhab.hcukyx3x.tgvbjcpo.hpfvmrgz.jb3vyjys.rz4wbd8a.qt6c0cv9.a8nywdso.l9j0dhe7.i1ao9s8h.esuyzwwr.f1sip0of.du4w35lb.lzcic4wl.abiwlrkh.p8dawk7l');
		var index = 0;
		var elementFinal = 0;
		for (index; index < elementsArrFb.length; ++index) {
			if (elementsArrFb[index].innerText == 'Нравится' && (elementFinal = elementsArrFb[index]))
				break;
		}
        if (elementFinal != 0) {
            elementFinal.click();
        }
        else {
            elementFinal = null;
        }
	)

if (page_facebook.Evaluate(like_fb_js).type = "object")
	{
		tooltip, Like error
		return
	}
else
	{
	page_facebook.WaitForLoad()
	page_facebook.Disconnect()
	WinClose, A
	tooltip, Like complete
	}

return

*WaitForLoad() добавлены на всякий случай

GD

2

Re: AHK: ожидание загрузки страницы, лайк на ФБ

Вряд ли кому-то будет интересно копаться в этом.
Я всегда автоматизировал загрузку, проверкой присутствия нужных мне элементов + (PageInst.Evaluate("document.readyState").value != "loading").

3

Re: AHK: ожидание загрузки страницы, лайк на ФБ

Malcev

Вряд ли кому-то будет интересно копаться в этом.

Скорее всего.
Для ФБ readyState не подходит, он не работает там. Проверку элементов я и сделал, но скрипт барахлит. Т.е. он ждет появление нужного элемента, но почему-то этого не достаточно.

GD

4

Re: AHK: ожидание загрузки страницы, лайк на ФБ

Я раньше вам писал, что сама идея не стоит потраченного времени.
Вы сказали, что вам интересно в этом разобраться.
Хорошо.
Но зачем вы тогда просите, чтобы кто-то разобрался в этом вместо вас?

5

Re: AHK: ожидание загрузки страницы, лайк на ФБ

Не совсем так. Тут конкретный вопрос, почему оно не работает так, как надо. Это же не зависит от идеи в целом. Даже в видео есть наглядный пример, что readystate и ожидание самого элемента не всегда работают. Может быть это из-за какой-то особенной структуры ФБ, моей ошибки или что это не сайт, а приложение развернутое на вебе ну или что-то типо такого.

У меня есть вопрос и я приложил к теме все что его касается. Если вы не знаете ответа или вам лень разбираться, что вполне логично, то это не значит, что не ответит кто-нибудь другой, ведь так? Попробовать все равно стоило же.

GD

6 (изменено: Malcev, 2021-03-07 22:27:58)

Re: AHK: ожидание загрузки страницы, лайк на ФБ

Botsy пишет:

Тут конкретный вопрос, почему оно не работает так, как надо

Я был бы очень удивлен если бы вот такая конструкция работала бы:

div.oajrlxb2.gs1a9yip.g5ia77u1.mtkw9kbi.tlpljxtp.qensuy8j.ppp5ayq2.goun2846.ccm00jje.s44p3ltw.mk2mc5f4.rt8b4zig.n8ej3o3l.agehan2d.sk4xxmp2.rq0escxv.nhd2j8a9.pq6dq46d.mg4g778l.btwxx1t3.pfnyh3mw.p7hjln8o.kvgmc6g5.cxmmr5t8.oygrvhab.hcukyx3x.tgvbjcpo.hpfvmrgz.jb3vyjys.rz4wbd8a.qt6c0cv9.a8nywdso.l9j0dhe7.i1ao9s8h.esuyzwwr.f1sip0of.du4w35lb.lzcic4wl.abiwlrkh.p8dawk7l

7

Re: AHK: ожидание загрузки страницы, лайк на ФБ

Botsy
ФБ не знаю, но был опыт что присутствие элемента ещё не являлось признаком загрузки, надо было ждать чтобы он был видимый, html содержимое было не менее какой то длинны, и он находился в координатах отображаемого фрейма и.т.п.
Та белиберда, что у вас в селекторах, скорее всего динамические имена. Возможно что искать нужные контейнеры нужно по косвенным признакам.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: Botsy, 2021-03-08 00:15:36)

Re: AHK: ожидание загрузки страницы, лайк на ФБ

serzh82saratov "надо было ждать чтобы он был видимый", а что отвечает за видимость ? Косвенные признаки, это какие ?

Malcev Я думал, что это динамический путь и он меняется. Но за все время (2-3к лайков), заметил только 3 варианта возможных контейнеров, обработал их, а частоту появления написал в 1-ом сообщении.

GD

9 (изменено: serzh82saratov, 2021-03-08 01:11:29)

Re: AHK: ожидание загрузки страницы, лайк на ФБ

Botsy пишет:

serzh82saratov "надо было ждать чтобы он был видимый", а что отвечает за видимость ? Косвенные признаки, это какие ?

Свойство visible, zIndex.
html содержимое, координаты и.т.п.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: ожидание загрузки страницы, лайк на ФБ

Botsy пишет:

Malcev Я думал, что это динамический путь и он меняется. Но за все время (2-3к лайков), заметил только 3 варианта возможных контейнеров, обработал их, а частоту появления написал в 1-ом сообщении

У кнопки like есть role и aria-label.

11

Re: AHK: ожидание загрузки страницы, лайк на ФБ

Ещё, искомый элемент может находиться в iframe и хотя, визуально это может выглядеть как обычная страница, контент iframe — это дочерний document, со своим window, readystate и прочим, изолированный от родительского. Элементы такого узла невозможно выбрать querySelector().

Botsy пишет:

скрипт барахлит. Т.е. он ждет появление нужного элемента, но почему-то этого не достаточно.

Что подразумевается под "скрипт барахлит" и какого поведения, Вы ожидаете?

Если скрипт запущенный на странице отрабатывает без ошибок и возвращает ожидаемый результат, когда это не так, то Вы неправильно описываете его алгоритм.

Botsy пишет:

почему оно не работает так, как надо.

В мире JS, всё не совсем так, как в AHK и работает оно именно так как и надо, просто Вы это пытаетесь оценивать опытом, который ничего об этом не рассказывает.

В своей практике я использую наблюдателей, в частности "MutationObserver".
Выстраиваете на загруженной странице обёртку вокруг контейнера искомого элемента и, взаимодействуя с ним смотрите, достаточный ли это уровень вложенности, чтобы получать наиболее объективные сведения о происходящем. Затем, размещаете этот функционал при помощи addScriptToEvaluateOnNewDocument. Это обеспечит надёжное выполнение кода и начало обработки всех изменений ещё до получения страницей разметки. Отлаживаете сценарий наблюдателя до тех пор, пока не убедитесь, что состояние искомого элемента всегда адекватно оценивается и вызываете из этого места функционал клиентского кода. Это и будет Вашей точкой входа.

Имейте так же ввиду, из-за того, что страница загружается неравномерно и наблюдателя можно закрепить только за существующим узлом — в подавляющем большинстве бывает недостаточно одного наблюдателя. Это приводит к тому, что выстраивается цепочка наблюдателей, запускающих последовательность наблюдений в зависимости от того как загружается контент.

Да, это существенно сложнее, чем [readystate === "complete"], за то это позволяет покрыть 100% любых тонкостей возникающих при загрузке страницы. Однако надо ещё помнить о том, что отказоустойчивость у такого подхода минимальна. Любое изменение в дизайне страницы может сделать код неработоспособным в любой момент.

12 (изменено: Botsy, 2021-03-09 03:01:27)

Re: AHK: ожидание загрузки страницы, лайк на ФБ

serzh82saratov Думал что visibility, используется строго как вариант отображения элемента на странице. Элемент существует, но его отображение вариативно (visible : hidden) и это ни как не используется при загрузке страницы. В любом случае, проверил на эти св-ва - они не используются.

Malcev Изменил селектор. Чисто интересно, это так правильнее или может для удобочитаемости или почему ? Работает одинаково.

KusochekDobra Вроде iframe'а нету. Вторую часть вашего сообщения про наблюдателя, 0 понимания. Либо написано слишком "научным, не простым" языком, либо это пока не для меня.
В конкретной проблеме, нужно чтобы скрипт нажимал на элемент. Насколько я понял, сначала дождавшись его появления/загрузки:
- ждёт элемента
- кликает на элемент

С новыми изменениями, в консоли браузера проверил, что это точно нужный мне элемент и что JS возвращает. А так же момент его существования во время загрузки страницы. Видео скрипта: 1080p


while !(page_facebook := Chrome.GetPageByTitle("Facebook", MatchMode:="contains"))
{
	sleep, 100
	tooltip, %A_index% NO Page
}

like_fb_js =
(
	document.querySelector('[aria-label=Нравится]');
)

while (page_facebook.Evaluate(like_fb_js).subtype == "null")
{
	sleep, 100
	tooltip, %A_index% NO Download
}
tooltip, %A_index% Download
sleep, 1000
page_facebook.Evaluate(Rtrim(like_fb_js, ";") ".click();")

return

Как видно в видео всё якобы загружено (не является null), хотя в браузере еще не отображается сайт/элемент. Без паузы будет ошибка.

OFF: можно ли как-то вставлять видео с превью, так же как картинку через bbcode?

UPD: Не знаю как, но проблема решилась. Возможно с каждой итерацией изменения кода, что-то не то удалял, либо лишнего добавлял. Всё почистил, проверил и заработало.

GD

13

Re: AHK: ожидание загрузки страницы, лайк на ФБ

Botsy
Привет. А как по итогу будет выглядеть готовый скрипт? Я тут нов)

14

Re: AHK: ожидание загрузки страницы, лайк на ФБ

valeryklintsou, добро пожаловать на форум! Ознакомьтесь, пожалуйста, с Правилами, отредактируйте свой пост. Обратите внимание на точки в конце предложений.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder