Что нового

Бот для браузерной игры haddan

HORRIBLE

Знающий
Сообщения
22
Репутация
10
Бота в целом написал, но! не получается без участия мышки выбрать куда бить и ставить блок.
Код:
#include <IE.au3>
Global $health
Global $text_info_health = ""
Global $text_info_run_func = ""


Global $oIE = _IECreate("http://haddan.ru/main.php")
$sText = _IEBodyReadText ($oIE)
$text_break = StringReplace($sText, "К сожалению, нить Вашей связи с Хаддан оборвалась. Пожалуйста, войдите в Хаддан заново.", "-")
If @extended >= 1 then _auto_login()

$end = 0

AdlibRegister("info",1000)

While 1


	$text_info_health  = 'Проверка здоровья....'
	_check_health()
	If $health[1] < $health[2]*0.2 then
		$text_info_health  = 	'Проверка здоровья....Fault'& @CRLF & _
								'Доступно '& $health[1] & ' из '& $health[2] & 'Порог = '& $health[2]*0.2
		_repair()
	Else
		$text_info_health  = 	'Проверка здоровья....ОК'& @CRLF & _
								'Доступно '& $health[1] & ' из '& $health[2] & 'Порог = '& $health[2]*0.2
	EndIf

	;переход на страницу боя
		$oFrames_end_f = _IEFrameGetCollection ($oIE)
		$iNumFrames = @extended
		For $i = 0 to ($iNumFrames - 1)
			$oFrame_end_f = _IEFrameGetCollection ($oIE, $i)
			$oLinks = _IELinkGetCollection ($oFrame_end_f)
				For $oLink In $oLinks
					;MsgBox(0, "Link Info", $oLink.innertext)
						$sLinkText = _IEPropertyGet($oLink, "innerText")
						If 	StringInStr($sLinkText, 'поединки') Then
							;IF $oLink.innertext == 'Ударить!' then
							_IEAction($oLink, "click")
							_IELoadWaitFrame()
							;_IELoadWait($oFrame_l)
							;sleep(1000)
						EndIf
				Next
		Next
ShellExecute("msg.exe")

_accept()

;	sleep(100)
;MsgBox(0,"","отработка" )

	;ToolTip('Ждем появления сообщения о принятии заявки......'&@CRLF&$load,100,100)


_IELoadWaitFrame()

Do
_fight()

	$oFrames_end_f = _IEFrameGetCollection ($oIE)
	$iNumFrames = @extended
		For $i = 0 to ($iNumFrames - 1)
			$oFrame_end_f = _IEFrameGetCollection ($oIE, $i)
			$oImgs = _IEImgGetCollection ($oFrame_end_f)
			For $oImg In $oImgs
				;MsgBox(0, "Img Info", "src=" & $oImg.id)
					if 	$oImg.alt == "Бой закончен! Вы выжили! Кликните, чтобы выйти из боя." then
						$oImg.click
						$end = 1
						_IELoadWait($oFrame_end_f)
						ExitLoop
					EndIf
			Next
		Next

Until $end = 1 ;_IEImgClick ($oIE, "Бой закончен! Вы выжили! Кликните, чтобы выйти из боя.", "alt")

$end = 0
Wend

Func _auto_login()
	Local $login = 'Bykva-Iob'
	Local $pass = 'woozap'
	_IELinkClickByText ($oIE, "Вход")
	_IELoadWait($oIE)
	$oForm = _IEFormGetObjByName ($oIE, "frmLogin")
	$oQuery_u = _IEFormElementGetObjByName ($oForm, "username")
	$oQuery_p = _IEFormElementGetObjByName ($oForm, "passwd")
	_IEFormElementSetValue ($oQuery_u, $login)
	_IEFormElementSetValue ($oQuery_p, $pass)
	_IEFormSubmit ($oForm)
	_IELoadWait($oIE)
EndFunc

Func _fight()

$block_1 = Random(1,5,1)
Do
	sleep(10)
	$block_2 = Random(1,5,1)
Until $block_1 <> $block_2


$push_1 = Random(1,5,1)
$push_2 = Random(1,5,1)

Switch $block_1
	case 1
		_new_click('blk1')
	case 2
		_new_click('blk2')
	case 3
		_new_click('blk3')
	case 4
		_new_click('blk4')
	case 5
		_new_click('blk5')
EndSwitch
Switch $block_2
	case 1
		_new_click('blk1')
	case 2
		_new_click('blk2')
	case 3
		_new_click('blk3')
	case 4
		_new_click('blk4')
	case 5
		_new_click('blk5')
EndSwitch
Switch $push_1
	case 1
		_new_click('kill1')
	case 2
		_new_click('kill2')
	case 3
		_new_click('kill3')
	case 4
		_new_click('kill4')
	case 5
		_new_click('kill5')
EndSwitch
Switch $push_2
	case 1
		_new_click('kill6')
	case 2
		_new_click('kill7')
	case 3
		_new_click('kill8')
	case 4
		_new_click('kill9')
	case 5
		_new_click('kill10')
EndSwitch

$oFrames_l = _IEFrameGetCollection ($oIE)
$iNumFrames = @extended
For $i = 0 to ($iNumFrames - 1)
    $oFrame_l = _IEFrameGetCollection ($oIE, $i)
	$oLinks = _IELinkGetCollection ($oFrame_l )
	For $oLink In $oLinks
    ;MsgBox(0, "Link Info", $oLink.innertext)
	$sLinkText = _IEPropertyGet($oLink, "innerText")
    If StringInStr($sLinkText, 'Ударить!') or StringInStr($sLinkText, 'Ударить 2-й раз!') Then
	;IF $oLink.innertext == 'Ударить!' then
    _IEAction($oLink, "click")
	_IELoadWaitFrame()
	;_IELoadWait($oFrame_l)
	;sleep(1000)
EndIf

	Next

Next



EndFunc

Func _new_click($id_name) ; клик мышкой по рандомно выбранному блоку/удару

$oFrames = _IEFrameGetCollection ($oIE)
$iNumFrames = @extended
For $i = 0 to ($iNumFrames - 1)
    $oFrame = _IEFrameGetCollection ($oIE, $i)
	$oImgs = _IEImgGetCollection ($oFrame)
	if @ERROR then ExitLoop
For $oImg In $oImgs
	;MsgBox(0, "Img Info", "src=" & $oImg.id)
    if $oImg.id == $id_name then
	;MsgBox(0,"",$oImg.id & @CRLF & _
	;			$oImg.name& @CRLF & _
	;			$oImg.src,1)

	;$oImg.focus
	;$oImg.click
	$iScreenX = _IEPropertyGet($oImg, "screenx")
	$iScreenY = _IEPropertyGet($oImg, "screeny")
	$iBrowserX = _IEPropertyGet($oImg, "browserx")
	$iBrowserY = _IEPropertyGet($oImg, "browserY")
	$iWidth = _IEPropertyGet($oImg, "width")
	$iHeight = _IEPropertyGet($oImg, "height")
	MouseClick('left',$iScreenX+$iWidth/2, $iScreenY+$iHeight/2)
	EndIf
Next
Next
EndFunc

Func _accept() ; принятие заявки на бой
		$oFrames_end_a = _IEFrameGetCollection ($oIE)
		$iNumFrames = @extended
		For $i = 0 to ($iNumFrames - 1)
			$oFrame_end_a = _IEFrameGetCollection ($oIE, $i)
			$oLinks = _IELinkGetCollection ($oFrame_end_a)
			For $oLink In $oLinks
			       IF $oLink.href == "javascript:acceptRequest(0, 1, '-4')" then
			       _IEAction($oLink, "click")
			       ExitLoop
			;_IELoadWaitFrame()
                                                EndIf
			Next
		Next
EndFunc

Func _check_health() ;получаем значение хп
		$oFrames_end_f = _IEFrameGetCollection ($oIE)
		$iNumFrames = @extended
		For $i = 0 to ($iNumFrames - 1)
			$oFrame_end_f = _IEFrameGetCollection ($oIE, $i)
			$oInputs = _IETagNameGetCollection ($oFrame_end_f, "DIV")
				For $oInput In $oInputs
					if $oInput.id == 'lHPText' then
					;MsgBox(0,"",$oInput.innertext)
					$health = StringSplit($oInput.innertext,'/')

					;return $health[1]
					ExitLoop
				EndIf

				Next
		Next
EndFunc

Func _repair() ; ожидание восстановления всего хп
	$ok = 0
	$text_info_run_func = "запущена функция _repair()"
	Do
		Sleep(100)
		$oFrames_end_f = _IEFrameGetCollection ($oIE)
		$iNumFrames = @extended
		For $i = 0 to ($iNumFrames - 1)
			$oFrame_end_f = _IEFrameGetCollection ($oIE, $i)
			$oInputs = _IETagNameGetCollection ($oFrame_end_f, "DIV")
				For $oInput In $oInputs
					if $oInput.id == 'lHPText' then
					;MsgBox(0,"",$oInput.innertext)
					$health = StringSplit($oInput.innertext,'/')
					if 	$health[1] <> $health[2] then
						$text_info_health  = 	'Проверка здоровья....Fault'& @CRLF & _
												'Доступно '& $health[1] & ' из '& $health[2] & 'Порог = '& $health[2]*0.2
		Else
		      $ok = 1
		      $text_info_health  = 	'Проверка здоровья....ОК'& @CRLF & _
			'Доступно '& $health[1] & ' из '& $health[2] & 'Порог = '& $health[2]*0.2
		EndIf
					EndIf
				Next
		Next

		Until $ok = 1
EndFunc

Func info()
	ToolTip($text_info_run_func&@CRLF&$text_info_health,100,100)
EndFunc

Func _IELoadWaitFrame() ; ожидание загрузки всех фреймов
$oFrames_w = _IEFrameGetCollection ($oIE)
$iNumFrames = @extended
For $i = 0 to ($iNumFrames - 1)
    $oFrame_w = _IEFrameGetCollection ($oIE, $i)
	_IELoadWait($oFrame_w)
Next
EndFunc
Прикрепил msg.exe не получилось, превышает максимальный размер 200кв(, т.к. без него не получается нажать на сообщение о принятии боя.....скрипт который под spoiler`ом просто висит..........
Вот код msg.exe:
Код:
While 1
sleep(100)
If 	WinExists("Сообщение с веб-страницы","") Then ControlClick("Сообщение с веб-страницы", "", "[ID:1]")
wend

Если вы скрипт запустите, он откроет игру, откроет станицу с выбором боя и примет бой это все без мышки, а дальше выбор ударов и другого с мышкой что вы и увидите. Кликание мышкой сделано в этой функции _new_click($id_name) , $id_name - название блока или удара, оно выбирается рандомно в функции _fight().

Спасибо.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Делиться сорцами оно само по себе уже похвально, я с браузерными играми никогда не сталкивался поэтому особо чего-то дельного посоветовать не смогу, если не хочешь чтобы мышь учавствовала в процессе "визуально" попробуй напрямую отправлять запросы в user32.dll, вроде туда их надо слать чтобы кликнуть куда-либо в конкретном окне не используя курсор.
 
Автор
H

HORRIBLE

Знающий
Сообщения
22
Репутация
10
А если использовать User32.dll окно экспловера должны быть на виду или оно может быть скрыто?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
HORRIBLE сказал(а):
А если использовать User32.dll окно экспловера должны быть на виду или оно может быть скрыто?
может быть скрыто


Добавлено:
Сообщение автоматически объединено:

вот тут глянь http://worldcheats.mo-rpg.com/forum-f106/tema-t183.htm
 
Автор
H

HORRIBLE

Знающий
Сообщения
22
Репутация
10
http://forum.oszone.net/thread-171526.html решили тут =)
Оказалось можно кликнуть вот так:
Код:
#include <WinAPI.au3>


For $oImg In $oImgs
   If $oImg.Alt == "Download AutoIt" Then
	$iScreenX = _IEPropertyGet($oImg, "screenx")
	$iScreenY = _IEPropertyGet($oImg, "screeny")

	$hWnd = ControlGetHandle("[CLASS:IEFrame]", "", "Internet Explorer_Server1")
	$tPoint = DllStructCreate("int X;int Y;")

	DllStructSetData($tPoint, "X", $iScreenX)
	DllStructSetData($tPoint, "Y", $iScreenY)

	_WinAPI_ScreenToClient($hWnd, $tPoint)

	$iScreenX = DllStructGetData($tPoint, "X")
	$iScreenY = DllStructGetData($tPoint, "Y")

	ControlClick("[CLASS:IEFrame]", "", "Internet Explorer_Server1", "Main", 1, $iScreenX, $iScreenY-100)
   EndIf
Next


Только вот вопрос остался, кривая координата $iScreenY получается только из-за того что картинка находится во frame который лежит еще в кучи frame ?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Наверное если бы причиной было бы это то и $iScreenX была бы корявой. Хотя утверждать не берусь :smile:
 
Верх