Что нового

анализ гипертекста и определение координат

Hikari

Новичок
Сообщения
22
Репутация
0
Мне необходим бот для онлайн-игры.Но вся проблема в том, что необходимо работать одновременно с трех браузерох ,окна которых имеют примерно равный размер.Проблема заключается ещё в том, что необходимо действовать в зависимости от того пройден квест/подземелье и т.д. или нет.Всё это очень легко реализуется, если проанализировать содержимое нужных див блоков.Но тут возникает проблема с поиском оных на странице.В autoit нет функций позволяющих считывать текст с окон браузера, т.к. встроенная утилита выдает мне везде chrome legacy window . есть ли какие-то возможности или библиотеки позволяющие производить подобные действия?
 
Автор
H

Hikari

Новичок
Сообщения
22
Репутация
0
Inni , а ваша библиотека может найти нужный div-блок на веб-странице и запомнить его текущие координаты.Просто я составляю бота, который будет работать с нескольких браузеров одновременно.Казалось бы достаточно написать расширение под каждый браузер на Javascript и не морочить себе голову.Но это мерзопакостная игра помимо обычных ссылок генерирует какой-то набор цифр , из-за чего ссылки постоянно меняются.Из-за этого я решил изучить AutoIt :IL_AutoIt_1: .Но у меня нет инструментов, которые могут анализировать именно содержимое веб-страницы. Я попытался использовать UIAutomate, но инспектор видит в браузере Opera только разные меню и панель закладок, а содержимое веб-страницы он не анализирует
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Hikari [?]
инспектор видит в браузере Opera только разные меню и панель закладок
Для доступа к элементам страницы браузер Opera должен быть запущен с параметром --force-renderer-accessibility
Ищите на форуме примеры работы с Google Chrome - большинство должно работать и с Opera.
 
Автор
H

Hikari

Новичок
Сообщения
22
Репутация
0
InnI
А вы не знаете , как заставить AutoIT открыть программу именно по ярлыку с этим параметром? :scratch:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Hikari
В архиве с UIAutomate есть пример автоматизации Chrome, содержащий строку запуска Chrome с этим параметром. С Opera аналогично.
 
Автор
H

Hikari

Новичок
Сообщения
22
Репутация
0
В целом вопрос решён, большое спасибо Inni за помощь. С помощью утилиты Inspect находим нужный элемент.Определяем дескриптор окна , а далее используем функцию _UIA_FindAllElements , а потом _UIA_ElementMouseClick , либо другие , в зависимости от цели.В подавляющем большинстве потребностей это помогает.
 
Автор
H

Hikari

Новичок
Сообщения
22
Репутация
0
Может кто-то сказать , почему не срабатывает функция _UIA_ElementMouseClick?
Код:
#include <UIAutomate.au3>
Start()
Kach_Start()

;1 ур. kl isEnabled - true kl Снять kl
Func Start();запуск программы
AutoItSetOption("WinTitleMatchMode", 2)
Global Const $OPERA = _Opera_Start()
EndFunc


Func _Opera_Start();запуск браузера
    Local $operwnd, $private
    ShellExecute("Opera.exe", "--force-renderer-accessibility", "C:\Program Files\Opera\")
    $operwnd = WinWaitActive("Opera", Null, 10)
    Sleep(2000)
    Send("^+n")
    Sleep(1000)
    WinClose($operwnd)
	$private = WinWaitActive("Opera", Null, 10)
    If Not $private Then Exit ConsoleWrite(" - Окно не найдено" & @LF)
    $oParent = _UIA_GetElementFromHandle($private)
    Return $oParent
	EndFunc
	Func OpenMT();открытие сайта игры
	$adresstype = _UIA_GetControlTypeElement($OPERA, "UIA_EditControlTypeId", "Поле адреса") ;Поле адреси
    _UIA_ElementMouseClick($adresstype)
    Sleep(1000)
    Send("m.vten.ru{ENTER}")
	$light_version = _UIA_WaitControlTypeElement($OPERA,"UIA_TextControlTypeId (0xC364)","Облегч","LegacyIAccessible.Name:",True,0)
	
	Send("^-")
	If (IsObj($light_version)) Then
	_UIA_ElementMouseClick($light_version)
	Else 
	Exit
	EndIf
Sleep(2000)

EndFunc   ;==>_Opera_Start

 Func Kach_Start();прохождение игры до начала регистрации персонажа
OpenMT()
Start_Play()
FirstQuest()
SecondQuest()

 EndFunc
Func FirstQuest()
$tavern = _UIA_WaitControlTypeElement($OPERA,"UIA_HyperlinkControlTypeId (0xC355)","Таверна","LegacyIAccessible.Name:",True,0)
_UIA_ElementMouseClick($tavern,"",Default,Default,1,True)
Local $startquest = _UIA_WaitControlTypeElement($OPERA,"UIA_HyperlinkControlTypeId (0xC355)","Выследить волка","LegacyIAccessible.Name:",True,0);Запуск квеста
_UIA_ElementMouseClick($startquest,"",Default,Default,1,True)
DoQuest(0)
EndFunc

Func SecondQuest()
Local $startquest
$startquest = _UIA_WaitControlTypeElement($OPERA,"UIA_HyperlinkControlTypeId (0xC355)","Отправиться","LegacyIAccessible.Name:",True,0);Запуск квеста
_UIA_ElementMouseClick($startquest,"",Default,Default,1,True)
DoBattle(0)
$continue = _UIA_WaitControlTypeElement($OPERA,"UIA_HyperlinkControlTypeId (0xC355)","Продолжить приключения ","LegacyIAccessible.Name:",False,0)
_UIA_ElementMouseClick($continue,"",Default,Default,1,True)
EndFunc
Func Start_Play();создание персонажа
$startbutton = _UIA_WaitControlTypeElement($OPERA,"UIA_HyperlinkControlTypeId (0xC355)","Начать игру","LegacyIAccessible.Name:",False,0)
_UIA_ElementMouseClick($startbutton,"",Default,Default,1,True)
EndFunc

Func DoQuest($type)
;тип квеста,0 - квест обучающий, 1 - боевой квест, 2 - квест на сдачу ресурсов, 3 - особый квест(механика определяется согласно специальной библиотеки)

Select
    Case $type=0
	DoBattle(0)
	$continue = _UIA_WaitControlTypeElement($OPERA,"UIA_HyperlinkControlTypeId (0xC355)","Продолжить приключения","LegacyIAccessible.Name:",True,0)
	_UIA_ElementMouseClick($continue,"",Default,Default,1,True)
	Case $type=1
    EndSelect


EndFunc


Func DoBattle($mode);0-режим новичка(просто атака), 1 - режим нейтрала(удары и гром, распитие зелий, начиная с версии 0.5.3)
Local $timetowait = 0
Local $continue = ""
Select
    Case $mode=0
	While Not(IsObj(_UIA_WaitControlTypeElement($OPERA,"UIA_HyperlinkControlTypeId (0xC355)","Продолжить","LegacyIAccessible.Name:",True,(2/10))))
	Attack()
	$timetowait = Random(-1500,2500)
	Sleep(2500+$timetowait)
	WEnd

    Case $mode=1
    Exit
    EndSelect

$continue = _UIA_WaitControlTypeElement($OPERA,"UIA_HyperlinkControlTypeId (0xC355)","Продолжить","LegacyIAccessible.Name:",True,0)
_UIA_ElementMouseClick($continue,"",Default,Default,1,True)
EndFunc
Func Attack();стандартная атака

$attackclick = _UIA_WaitControlTypeElement($OPERA,"UIA_HyperlinkControlTypeId (0xC355)","Добивать","LegacyIAccessible.Name:",True,5)
If (Not(IsObj($attackclick))) Then
 _UIA_ElementMouseClick(_UIA_WaitControlTypeElement($OPERA,"UIA_HyperlinkControlTypeId (0xC355)","Бить","LegacyIAccessible.Name:",True,5),"",Default,Default,1,True)
Else 
_UIA_ElementMouseClick($attackclick,"",Default,Default,1,True)
EndIf
EndFunc
Func UseForceAmuletGroup($mode);1-воин(по умолчанию),2-монах, 3 - маг
EndFunc

По идее скрипт должен переключиться на облегченную версию игры, а он работает через раз, иногда пропускает действия связанные с переходом на облегченку, то есть с "нажатием мыши" на этот элемент
Код:
If (IsObj($light_version)) Then
	_UIA_ElementMouseClick($light_version)
	Else

Эта строка кода вроде бы срабатывает, но нажатие не происходит, а продолжается действие скрипта
P.S.Запускал через консоль и вставлял MsgBox'ы , но так и не смог обнаружить логического объяснения происходящему
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Hikari [?]
работает через раз
Попробуйте добавить небольшую задержку после изменения масштаба, чтобы элементы успели переместиться на новые координаты.

не смог обнаружить логического объяснения происходящему
Текстовые элементы не могут быть прокручены в зону видимости функцией _UIA_ElementScrollIntoView(). Также, большинство из них не реагируют на установку им фокуса ввода, которое используется в _UIA_ElementMouseClick(). В данном случае текст является дочерним элементом ссылки (см. дерево Inspect), поэтому лучше искать именно ссылку UIA_HyperlinkControlTypeId и работать с ней. К тому же ссылки реагируют на _UIA_ElementDoDefaultAction(), что позволяет "кликать" по ним даже, если они находятся за пределами видимости.
Код:
...
    $light_version = _UIA_WaitControlTypeElement($OPERA," UIA_HyperlinkControlTypeId","Облегч","LegacyIAccessible.Name:",True,0)
    If (IsObj($light_version)) Then
      _UIA_ElementDoDefaultAction($light_version)
    Else
...
 
Верх