Что нового

[Автоматизация] [Сила стихий] Бот для добычи ресурсов. Извлечение информации из html страницы.

Spays

Новичок
Сообщения
10
Репутация
0
Доброе время суток уважаемые форумчане, обращаюсь к вам с просьбой помочь написать и разъяснить некоторые элементы по написанию бота для текстовой браузерной онлайн игры.
Что бот должен делать:
1. Раз в 20 секунд нажимать кнопку "Добыть самоцветы".
2. При добыче ресурса выскакивает окно с капчей(к примеру это 312), в исходном коде страницы капча отображается как: "<img src=./kap/312.png alt=число>. Так вот, меня интересует каким образом можно извлечь это самое число, (при том, что оно меняется в зависимости от капчи) и вставить в окошко ввода, а затем нажать на кнопку "Отколоть".

В AutoIt нуб, второй день ломаю голову, и ни как не могу реализовать сие творенье.

Ниже выкладываю код страницы с добычей:
Код:
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
<title>Сила стихий</title>
<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">
 <link rel=stylesheet href=css/1.css type=text/css /></head>
<body>
<div class="cent" align="center">
<div class="top">
</div>
<div class="logo">
<b><font color=red>[284/300]</font><font color=blue>[300/300]</font><font color=green>[129/205]</font></b><hr><font color=red>(30715)</font>
 <b><font color=blue><a href=88.php?go=mine&kopat=101>Добыть самоцветы</a></font></b>
<form name=form1 action=88.php?go=mine method=post><img src=./kap/483.png alt=число>
    <input type=text name=capcha maxlength=4 size=5>

    <input type=submit name=otkolot value=Отколоть>
</form><a href=88.php?go=peoplelok&pers=Serezhenka ><font color=green><b>Serezhenka </font></b></a>Great Empire    <a href=88.php?go=peoplelok&pers=Serezhenka&mob=1></a>
<a href=88.php?go=peoplelok&pers=BARSXXX ><font color=green><b>BARSXXX </font></b></a>The End    <a href=88.php?go=peoplelok&pers=BARSXXX&mob=1></a>
<a href=88.php?go=peoplelok&pers=poluswm ><font color=green><b>poluswm </font></b></a>The End    <a href=88.php?go=peoplelok&pers=poluswm&mob=1></a>
20:06:21: <font color=a0c0c0> Serezhenka  не смог добыть кристалл</font> 
20:06:21: <font color=a0c0c0> BARSXXX  не смог добыть кристалл</font> 
20:06:00: <font color=a0c0c0> Serezhenka  не смог добыть кристалл</font> 
20:05:39: <font color=a0c0c0> Serezhenka  не смог добыть кристалл</font> 
20:05:38: <font color=a0c0c0> BARSXXX  не смог добыть кристалл</font> 
20:05:29: <font color=a0c0c0> Mercury  не смог добыть кристалл</font> 
20:05:17: <font color=a0c0c0> Serezhenka  не смог добыть кристалл</font> 
20:05:15: <font color=a0c0c0> BARSXXX  добыл Средний Авантюрин</font> 
20:05:04: <font color=a0c0c0> Mercury  не смог добыть кристалл</font> 
20:04:54: <font color=a0c0c0> Serezhenka  не смог добыть кристалл</font> 
20:04:32: <font color=a0c0c0> Serezhenka  добыл Средний Галенит</font> 
<hr><b>
	<a href=88.php?go=karta style=color:green>Карта</a>

	<a href=88.php?go=teleport style=color:green>Телепорт</a>

	<a href=88.php?go=comnuniti style=color:blue>Комьюнити</a>

	<a href=88.php?go=rukzak style=color:#CC3333>Рюкзак</a>

<a href=88.php?go=do&kopal style=color:#CC3333>Копать</a>

	<a href=88.php?go=pessonag style=color:green>Персонаж</a>

	<a href=88.php?go=profil style=color:green>Профиль</a>

<a href=88.php?go=magazin style=color:green>Магазин</a>
	<a href=88.php?go=do>в игру</a><hr><div style="background: #0084ff; border-top:solid 1px #bebebe; height:20px;"><font color="red">0.13|20:06:31</font>
</div>
</div>
</body>
</html>

Ссылка на игру: http://elementforce.ru/
Тест персонаж:
L:Test
P:123456007
(Для того, что бы появилось окно ввода с капчей надо ходить север/юг (для шахты нужна более серьезная раскачка))
Скриншот с капчей:
Я пробовал этот код для извлечения значения капчи, но у меня выдало весь исходный текст страницы:
Код:
#include "IE.au3" 
#include "Array.au3"

$sUrl = "http://elementforce.ru/88.php?go=mine&kopat=580"
$oIE = _IECreate($sUrl)
$sHTML = _IEDocReadHTML ($oIE)

$sPatern = '(?smi).*?./kap/"?>([^&\s].*?)<.*' 
$sResult = StringRegExpReplace( $sHTML, $sPatern, '\1', 1 )

MsgBox(48,'Значение:', $sResult)


Очень надеюсь на вашу помощь в написании бота :-[
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
$sPatern = '(?i)\Qimg src=./kap/\E([\d]+)\Q.png\E'
$aResult = StringRegExp($sHTML,$sPatern,1)
If IsArray($aResult) Then
MsgBox(48,'Значение:', $aResult[0])
Else
MsgBox(48,'Значение:', "Не найдено")
EndIf

Такой паттерн попробуй

И посмотри
Код:
_IEImgGetCollection
 
Автор
S

Spays

Новичок
Сообщения
10
Репутация
0
[Интеракция] Re: [Автоматизация] [Сила стихий] Бот для добычи ресурсов. Извлечение информации из h

Выдает ошибку, если можно полный скрипт:smile:
Ибо я еще плохо разбираюсь в скрипте.
 

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Код:
#include <IE.au3>
 $sUrl='адрес страницы' ; задаётся самостоятельно
 $oIE=_IEAttach($sUrl, 'url')
 If Not @error Then
	 $oIE=_IEAttach($sUrl, 'url')
 Else
	 $oIE=_IECreate($sUrl)
 EndIf

 $oImgs=_IETagNameGetCollection($oIE, 'img')
 If Not @error Then
	For $oImg In $oImgs
		$sImgProp=_IEPropertyGet($oIE, 'outerhtml')
		If Not @error Then
			If StringInStr($sImgProp, 'kap') And StringInStr($sImgProp, 'число') Then
				$aCap=StringRegExp($sImgProp, '(?si)/(\d+?)\D', 3)
				If Not @error Then
					MsgBox(0, 'Captcha', $aCap[0])
				EndIf
			EndIf
		EndIf
	Next
 EndIf

Ошибка в одной переменной испортила весь скрипт.
Вот рабочий вариант:
Код:
#include <IE.au3>
$sUrl='http://elementforce.ru/88.php?go=do'
$oIE=_IEAttach($sUrl, 'url')
If Not @error Then
    $oIE=_IEAttach($sUrl, 'url')
Else
    $oIE=_IECreate($sUrl)
EndIf
$oImgs=_IETagNameGetCollection($oIE, 'img')
If Not @error Then
    For $oImg In $oImgs
        $sImgProp=_IEPropertyGet($oImg, 'outerhtml')
        If Not @error Then
            If StringInStr($sImgProp, 'kap') And StringInStr($sImgProp, 'число') Then
                MsgBox(0, 'Img_Captch', $sImgProp)
                $aCap=StringRegExp($sImgProp, '/(\d+)\D', 3)
                If Not @error Then
                    MsgBox(0, 'Captcha', $aCap[0])
                EndIf
            EndIf
        EndIf
    Next
EndIf
 
Автор
S

Spays

Новичок
Сообщения
10
Репутация
0
[Автоматизация] Re: [Автоматизация] [Сила стихий] Бот для добычи ресурсов. Извлечение информации и

Клево! :laugh: Выводит окошко с капчей, и вторая часть вопроса, как теперь значение капчи вставить в окно ввода?
 

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Наскоряк написал:

Код:
#include <IE.au3>

Global $sCaptcha='каптча'

$oInputs=_IETagNameGetCollection($oIE, 'input')
If Not @error Then
	For $oInput In $oInputs
		$sPropInp=_IEPropertyGet($oInput, 'outerhtml')
		If Not @error Then
			If StringInStr($sPropInp, 'text') And StringInStr($sPropInp, 'capcha') Then
				_IEFormElementSetValue($oInput, $sCaptcha)
				ExitLoop
			EndIf
		EndIf
	Next
EndIf

$oInputs=_IETagNameGetCollection($oIE, 'input')
If Not @error Then
	For $oInput In $oInputs
		$sPropInp=_IEPropertyGet($oInput, 'outerhtml')
		If Not @error Then
			If StringInStr($sPropInp, 'submit') And StringInStr($sPropInp, 'Отколоть') Then
				_IEAction($oInput, 'click')
				ExitLoop
			EndIf
		EndIf
	Next
EndIf
 
Автор
S

Spays

Новичок
Сообщения
10
Репутация
0
Скрипт работает если только соединить первый со вторым:smile:
Код:
#include <IE.au3>

$sUrl='http://elementforce.ru/88.php?go=mine&kopat='
$oIE=_IEAttach($sUrl, 'url')
If Not @error Then
    $oIE=_IEAttach($sUrl, 'url')
Else
    $oIE=_IECreate($sUrl)
EndIf
$oImgs=_IETagNameGetCollection($oIE, 'img')
If Not @error Then
    For $oImg In $oImgs
        $sImgProp=_IEPropertyGet($oImg, 'outerhtml')
        If Not @error Then
            If StringInStr($sImgProp, 'kap') And StringInStr($sImgProp, 'число') Then
                MsgBox(0, 'Img_Captch', $sImgProp)
                $aCap=StringRegExp($sImgProp, '/(\d+)\D', 3)
                If Not @error Then
                    MsgBox(0, 'Captcha', $aCap[0])
                EndIf
            EndIf
        EndIf
    Next
EndIf

Global $sCaptcha=($aCap[0])

$oInputs=_IETagNameGetCollection($oIE, 'input')
If Not @error Then
    For $oInput In $oInputs
        $sPropInp=_IEPropertyGet($oInput, 'outerhtml')
        If Not @error Then
            If StringInStr($sPropInp, 'text') And StringInStr($sPropInp, 'capcha') Then
                _IEFormElementSetValue($oInput, $sCaptcha)
                ExitLoop
            EndIf
        EndIf
    Next
EndIf

$oInputs=_IETagNameGetCollection($oIE, 'input')
If Not @error Then
    For $oInput In $oInputs
        $sPropInp=_IEPropertyGet($oInput, 'outerhtml')
        If Not @error Then
            If StringInStr($sPropInp, 'submit') And StringInStr($sPropInp, 'Отколоть') Then
                _IEAction($oInput, 'click')
                ExitLoop
            EndIf
        EndIf
    Next
EndIf

Код:
Global $sCaptcha='каптча' заменил на Global $sCaptcha=($aCap[0]) и убрал все MsgBox


Скрипт отличный! А главное все работает! :beer:



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

И еще пара вопросов по скрипту:
1.Нужен клик по "Добыть самоцветы" пробовал с помощью функции клик мышью по координатам, но постоянно кликало не туда))
2. Задержка после "Добыть самоцветы" 20 сек
Код:
Sleep(20000)
это я понял)
3. Если скрипт не находит капчу, он выдает ошибку
Код:
Global $sCaptcha=($aCap[0])
Global $sCaptcha=(^ ERROR
Пробовал решить с помощью вставки после
Код:
Global $sCaptcha=($aCap[0])
 If Not @error Then
но ошибок только прибавилось :(
4. Сделать скрипт цикличным, бесконечный цикл, но если
Код:
Do
    ;действия
Until 1
это я уяснил, то ошибка из-за отсустствия капчи мне не дает покоя.
 

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Добавь условие, если есть капча, то искать её и вводить, а если нету, то просто нажимать напрямую.
Поиск капчи оформи в виде фукнкции:

Код:
Func _Captcha()
    ; тело функции
EndFunc


Клик по кнопке делать тоже с помощью _IEaction(..)
 
Автор
S

Spays

Новичок
Сообщения
10
Репутация
0
Попробовал сделать так:
Код:
#include <IE.au3>

$sUrl='http://elementforce.ru/88.php?go=mine&kopat='
sleep(20000)
$oa=_IETagNameGetCollection($oIE, 'href')
If Not @error Then
    For $ohref In $ohrefs
        $shrefProp=_IEPropertyGet($ohref, 'outerhtml')
        If Not @error Then
            If StringInStr($shrefProp, 'mine') And StringInStr($shrefProp, 'kopat' Then
			   _IEAction($ohref, 'click')
			      ExitLoop
            EndIf
        EndIf
    Next
EndIf

Ошибка на ошибке))

Право условие тоже ошибку выдает.. видимо я не туда ее вставляю) Перерыл наверное весь форум и пол гугла, пытаясь понять куда что вставить)
 

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Href это не тег.
Ссылки в тегах 'a' или можно:

Код:
_IELinkGetCollection(..)
 

running-frag

why me?
Сообщения
441
Репутация
60
"href" это атрибут, к примеру ссылка без него не ссылка а просто "подсвеченный текст", если не заданно значение тогда ссылка будет иметь путь "#"

Код:
<a href="httt://some-site.dom" alt="">link</a>
Вот так он используется.
 
Автор
S

Spays

Новичок
Сообщения
10
Репутация
0
Если можно пример по поиску данной ссылки, на форуме смотрел но там у ссылок в коде были дополнительные зацепки что-то вроде
Код:
type=submit или type=text
а тут
Код:
<a href=88.php?go=mine&kopat=101>Добыть самоцветы</a>
и от от того, что я не знаю как за эту ссылку зацепиться у меня такая каша в голове :stars:. С тегами "<а>" получается тоже самое что и с атрибутом "href" я уже по всякому тут извращался))

Еще 2 вопроса по скрипту:
1.Как объеденить будущий скрипт поиска и нажатия кнопки с остальным скриптом?
2.
Код:
Func _Captcha()
    ; тело функции
EndFunc
Как, куда это самое условие вставлять, я пробовал делать:
Код:
Func _Captcha()
Global $sCaptcha=($aCap[0])

$oInputs=_IETagNameGetCollection($oIE, 'input')
If Not @error Then
    For $oInput In $oInputs
        $sPropInp=_IEPropertyGet($oInput, 'outerhtml')
        If Not @error Then
            If StringInStr($sPropInp, 'text') And StringInStr($sPropInp, 'capcha') Then
                _IEFormElementSetValue($oInput, $sCaptcha)
                ExitLoop
            EndIf
        EndIf
    Next
EndIf

$oInputs=_IETagNameGetCollection($oIE, 'input')
If Not @error Then
    For $oInput In $oInputs
        $sPropInp=_IEPropertyGet($oInput, 'outerhtml')
        If Not @error Then
            If StringInStr($sPropInp, 'submit') And StringInStr($sPropInp, 'Отколоть') Then
                _IEAction($oInput, 'click')
                ExitLoop
            EndIf
        EndIf
    Next
EndIf
EndFunc

Но код не оценил моих потуг и выдал ошибку.

Собсна
Автор: ggzgamer
Добавь условие, если есть капча, то искать её и вводить, а если нету, то просто нажимать напрямую.
Поиск капчи оформи в виде фукнкции:
интересует реализация данной фичи.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Spays
Поле для воода капчи есть все время, или появляется только тогда, когда нужно ввести капчу.

Если появляется, то делай поиск этого объкта
Код:
<input type=text name=capcha maxlength=4 size=5>
Если найдется, то вызывай функцию для поиска и ввода капчи, если не найдена - продолжай копать.
 

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Код:
If _CheckCaptcha() Then
	; заполнение
EndIf

Код:
Func _CheckCaptcha()
	Local $oInputs=_IETagNameGetCollection($oIE, 'input')
	If Not @error Then
		For $oInput In $oInputs
			Local $sPropInput=_IEPropertyGet($oInput, 'outerhtml')
			If Not @error Then
				If StringInStr($sPropInput, 'capcha') Then
					Return True
				EndIf
			EndIf
		Next
	EndIf
EndFunc

Код:
Func _Kopat()
	Local $oLinks=_IETagNameGetCollection($oIE, 'a')
	If Not @error Then
		For $oLink In $oLinks
			Local $sPropLink=_IEPropertyGet($oLink, 'outerhtml')
			If Not @error Then
				If StringInStr($sPropLink, 'kopat') And StringInStr($sPropLink, 'Добыть') Then
					_IEAction($oLink, 'click')
					ExitLoop
				EndIf
			EndIf
		Next
	EndIf
EndFunc
 
Автор
S

Spays

Новичок
Сообщения
10
Репутация
0
Вспонил анегдот из серии трое из леса, но по теме))
Спасибо ggzgamer, огромное спасибо!:smile:


Угостили как-то Вещего Олега бубликом.
Олег полдня его и так и сяк вертел, и на голову надевал, и на солнышко сквозь дырку смотрел, и по столу катал… Измучился. К вечеру пришел Таргитай, увидел бублик, хвать его и слопал.
Олег обиделся, ногами топает, руками машет, орет на дурня:
Ну что ты натворил, дубина стоеросовая? Еще чуть-чуть, и я бы понял…

В скрипте по поиску разобрался, сегодня ночью тренировался.

Вопрос по функциям и условию, как я понял из справки фун-ию к примеру
Код:
_Kopat()
надо вставить в другое действие ээ скрипт.

Вопрос, как сделать это самое условие, в голове не укладывается, как возможно реализовать что..."проверяем страницу на каптчу если каптчи нет, то мы копаем, есть, вводим" :blink:

В справке и на форуме ничего более менее нормального не нашел для примера не нашел.

Я уже фибрами чувствую что замучал отвечающих))
 

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Ну вон она функция, которая проверяет страницу на капчу. Если есть, то возвращает True, если нет - просто 0.
И после условия If _CheckCaptcha() заполнение каптчи, если нету каптчи, то после Then выполняться ничего не будет.
Всё как раз как надо. Есть каптча - заполняем. Нету каптчи - условие ложно и проходим мимо.
Функции можно вкладывать в функции.
 
Автор
S

Spays

Новичок
Сообщения
10
Репутация
0
Спасибо что объяснил дружище, я прост не мог алгоритм функций понять:smile:
Тему можно закрывать)) Решение найдено))
 
Верх