Что нового

Поиск точки на экране с помощью PixelSearch

trudmoy

Новичок
Сообщения
15
Репутация
1
скрипт не работает на других компьютерах. На моем все нормально, а у других то не находит цвет пикселя, то не создает файл, то не закрывает окна.
Помогите, кто чем может, пожалуйста.
Код:
#include <IE.au3>
#Include <Array.au3>
Global $n,$oSabmit,$Links,$var,$title,$hFile,$Otchet[100],$i,$pos
Global Const $sProIDText   = "Автопилот"
Opt("TrayIconDebug",1)
#Include <Misc.au3>
If NOT _Singleton($sProIDText, 1) Then
    MsgBox(48, 'Внимание', 'Одна копия программы уже запущена')	
    _MyExit()
EndIf
For $i=1 to 1 Step 1 
HotKeySet("{ESC}", "_MyExit") ;Esc - выход
$oIE = _IECreate("http://travelpluse.weebly.com")
_IELoadWait ($oIE)
$n = Random(7,28,1)
$oSubmit =_IEGetObjByName($oIE,"tasemcity01")
If @Error = 0 Then
_IELoadWait ($oIE)
_IELinkClickByIndex ($oSubmit,$n,0) ;выбор страны
Sleep(5000)
EndIf
_IELoadWait ($oIE)
$coord = PixelSearch(0,0,1024 ,728, 0xFFD46C)
If Not @error Then    
	$pos = MouseGetPos()
	MouseClick("left",$coord[0],$coord[1],1) ; проверка цен
	MouseMove($pos[0],$pos[1], 1)
	If  WinExists("Предупреждение системы безопасности") Then 
		Send("{Enter}")
	EndIf
EndIf
Sleep(15000)
_IELoadWait ($oIE)
Opt("WinTitleMatchMode", 2)
While WinActive("Microsoft Internet Explorer")
WinActivate("Microsoft Internet Explorer")
$title = WinGetTitle("Microsoft Internet Explorer")
$hFile = FileOpen(@ScriptDir & '\Otchet.txt', 1)
        ;открываем файл
        FileWriteLine($hFile, $title  & @CRLF)
        ;записывем в него ссылку страницы 
		FileClose($hFile)
        ;закрываем файл
		If BitAND(WinGetState($title), 2) Then
		WinSetState($title, "", @SW_MAXIMIZE)
		$n = Random(5000,10000,1000)
		Sleep($n)
		WinKill($title)
    EndIf
WEnd
$n = Random(3000,7000,1000)
	Sleep($n)
Next

MsgBox(0,"НЕ ЗАБУДЬ!","ОТПРАВЬ ОТЧЕТ АВТОПИЛОТА")
Func _MyExit()
    If ProcessExists('IEXPLORE.EXE') Then ProcessClose('IEXPLORE.EXE')
    Exit
EndFunc   ;==>_MyExit
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: скрипт не работает на другом компьютере

{CodeWarn.SModer}
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Re: скрипт не работает на другом компьютере

trudmoy
Тему лучше переименовать. Например:
Поиск точки на экране с помощью PixelSearch

А по коду - бардачек, конечно. Читайте комментарии
Код:
#include <IE.au3>
#Include <Array.au3>
Global $n,$oSabmit,$Links,$var,$title,$hFile,$Otchet[100],$i,$pos
Global Const $sProIDText   = "Автопилот"
Opt("TrayIconDebug",1)
#Include <Misc.au3>
If NOT _Singleton($sProIDText, 1) Then
    MsgBox(48, 'Внимание', 'Одна копия программы уже запущена')
    _MyExit()
EndIf
For $i=1 to 1 Step 1; По умлочанию step и так равен 1
HotKeySet("{ESC}", "_MyExit") ;Esc - выход >>Эту функцию вынести из цикла!!
$oIE = _IECreate("http://travelpluse.weebly.com")
_IELoadWait ($oIE); >> Убрать эту функцию. По умолчанию _IECreate ожидает полной загрузки страницы.
$n = Random(7,28,1)
$oSubmit =_IEGetObjByName($oIE,"tasemcity01")
If @Error = 0 Then; >> Сравнение лучше писать через двойное равно. А если @Error равен нулю, то что сделать?
_IELoadWait ($oIE); >> Что, Что тут ожидается, если ни чего не грузится?
_IELinkClickByIndex ($oSubmit,$n,0) ;выбор страны >> А почему бы не установить параметр ожидания после клика и убрать Sleep, убрать _IELoadWait после EndIf?
Sleep(5000); >> ...?
EndIf
_IELoadWait ($oIE); >> ...?
$coord = PixelSearch(0,0,1024 ,728, 0xFFD46C); >> Вы точно уверены, что необходимая точка будет в координатах 1024х728? А если разрешение экрана больше и окно сместить?
If Not @error Then
    $pos = MouseGetPos()
    MouseClick("left",$coord[0],$coord[1],1) ; проверка цен
    MouseMove($pos[0],$pos[1], 1)
	; >> А вот тут уместно вставить Sleep на 500-1000 мсек, вдруг окно предупреждения задержится
    If  WinExists("Предупреждение системы безопасности") Then
        Send("{Enter}")
    EndIf
EndIf
Sleep(15000); >> Зачем sleep если далее будет _IELoadWait?
_IELoadWait ($oIE)
Opt("WinTitleMatchMode", 2)
While WinActive("Microsoft Internet Explorer"); >> Пока окно активно...
WinActivate("Microsoft Internet Explorer"); >> Все равно его активировать. Не глупо?
$title = WinGetTitle("Microsoft Internet Explorer")
$hFile = FileOpen(@ScriptDir & '\Otchet.txt', 1)
        ;открываем файл
        FileWriteLine($hFile, $title  & @CRLF)
        ;записывем в него ссылку страницы >> Ссылку ли? WinGetTitle - возвращает заголовок окна.
        FileClose($hFile)
        ;закрываем файл
        If BitAND(WinGetState($title), 2) Then
        WinSetState($title, "", @SW_MAXIMIZE)
        $n = Random(5000,10000,1000); >> Зачем эти магические действия?
        Sleep($n); >> Зачем эти магические действия?
        WinKill($title)
    EndIf
WEnd
$n = Random(3000,7000,1000); >> Зачем эти магические действия?
    Sleep($n)
Next

MsgBox(0,"НЕ ЗАБУДЬ!","ОТПРАВЬ ОТЧЕТ АВТОПИЛОТА")
Func _MyExit()
    If ProcessExists('IEXPLORE.EXE') Then ProcessClose('IEXPLORE.EXE')
    Exit
EndFunc   ;==>_MyExit
 
Автор
trudmoy

trudmoy

Новичок
Сообщения
15
Репутация
1
Re: скрипт не работает на другом компьютере

как-то так? А все "магические действия" - "я как бы человек и как бы читаю информацию" - имитация "коммерческого клика"
Код:
#include <IE.au3>
#Include <Array.au3>
Global $n,$oSabmit,$Links,$var,$title,$hFile,$Otchet[100],$i,$pos
Global Const $sProIDText   = "Автопилот"
Opt("TrayIconDebug",1)
#Include <Misc.au3>
If NOT _Singleton($sProIDText, 1) Then
    MsgBox(48, 'Внимание', 'Одна копия программы уже запущена')
    _MyExit()
EndIf
HotKeySet("{ESC}", "_MyExit")
For $i=1 to 1
$oIE = _IECreate("http://travelpluse.weebly.com")
$n = Random(7,28,1)
$oSubmit =_IEGetObjByName($oIE,"tasemcity01")
If @Error == 0 Then
_IELinkClickByIndex ($oSubmit,$n,0)
_IELoadWait ($oIE)
Sleep(5000); >> Зачем эти магические действия?
EndIf
$coord = PixelSearch(0,0,1024 ,728, 0xFFD46C); точка будет>> Вы точно уверены, что необходимая точка будет в координатах 1024х728? А если разрешение экрана больше и окно сместить?
If Not @error Then
    $pos = MouseGetPos()
    MouseClick("left",$coord[0],$coord[1],1) ; проверка цен
    MouseMove($pos[0],$pos[1], 1)
	Sleep(1000) ; >> А вот тут уместно вставить Sleep на 500-1000 мсек, вдруг окно предупреждения задержится
    If  WinExists("Предупреждение системы безопасности") Then
        Send("{Enter}")
    EndIf
EndIf
Sleep(15000); >> Зачем эти магические действия?
_IELoadWait ($oIE)
Opt("WinTitleMatchMode", 2)
While WinActive("Microsoft Internet Explorer"); >> Пока окно активно...
WinActivate("Microsoft Internet Explorer"); >> Все равно его активировать. Не глупо? окон то 2 то 6 я пытаюсь их все по очереди развернуть, закрыть.
$title = WinGetTitle("Microsoft Internet Explorer")
$hFile = FileOpen(@ScriptDir & '\Otchet.txt', 1)
        ;открываем файл
        FileWriteLine($hFile, $title  & @CRLF)
        ;записывем в него Title страницы >> Ссылку ли? WinGetTitle - возвращает заголовок окна.Прав. не правильно описал, но мне не принципиально.
        FileClose($hFile)
        ;закрываем файл
        If BitAND(WinGetState($title), 2) Then
        WinSetState($title, "", @SW_MAXIMIZE)
        $n = Random(5000,10000,1000); >> Зачем эти магические действия?
        Sleep($n); >> Зачем эти магические действия?
        WinKill($title)
    EndIf
WEnd
$n = Random(3000,7000,1000); >> Зачем эти магические действия?
    Sleep($n)
Next

MsgBox(0,"НЕ ЗАБУДЬ!","ОТПРАВЬ ОТЧЕТ АВТОПИЛОТА")
Func _MyExit()
    If ProcessExists('IEXPLORE.EXE') Then ProcessClose('IEXPLORE.EXE')
    Exit
EndFunc   ;==>_MyExit
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Re: скрипт не работает на другом компьютере

trudmoy
И все-таки, переименуйте, пожалуйста, тему.
Можно заглянуть сюда и узнать как будет лучше.
 
Автор
trudmoy

trudmoy

Новичок
Сообщения
15
Репутация
1
спасибо, бардак подправил, но на других машинах скрипт так и не работает.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Кстати, _IELinkClickByIndex, по умолчанию, то же ожидает полной загрузки страницы.
Т.е. после этой функции нет необходимости вызывать _IELoadWait.

Код:
If @Error == 0 Then

Ну так а если есть ошибка, что делать?

Код:
PixelSearch(0,0,1024 ,728, 0xFFD46C)

Точно в этих координатах будет искомая точка на других ПК?

Код:
If Not @error Then

А если точка не была найдена, то что делать?

Код:
While WinActive("Microsoft Internet Explorer");
WinActivate("Microsoft Internet Explorer")

Так окно УЖЕ активно - зачем его ЕЩЕ раз активировать?

А зачем окно развертывать на весь экран и потом сразу закрывать?
Может сразу закрыть?

Итого, ошибки могут возникать из-за:
* не находится элемент HTML с name "tasemcity01" - необходимо действие при отсутствии;
* не находится точка - необходимо действие при отсутствии;
* может не находится окно по заголовку ..
*
 
Автор
trudmoy

trudmoy

Новичок
Сообщения
15
Репутация
1
Спасибо за терпение. Недавно пробую AutoIt.
Так лучше?
Код:
#include <IE.au3>
#Include <Array.au3>
Global $n,$oSabmit,$Links,$var,$title,$hFile,$Otchet[100],$i,$pos
Global Const $sProIDText   = "Автопилот"
Opt("TrayIconDebug",1)
#Include <Misc.au3>
If NOT _Singleton($sProIDText, 1) Then
    MsgBox(48, 'Внимание', 'Одна копия программы уже запущена')
    _MyExit()
EndIf
HotKeySet("{ESC}", "_MyExit")
For $i=1 to 1
$oIE = _IECreate("http://travelpluse.weebly.com")
$n = Random(7,28,1)
$oSubmit =_IEGetObjByName($oIE,"tasemcity01");здесь окно находится на всех компах и дальнеший клик происходит тоже у всех.
If @Error == 0 Then ;if - EndIf - убрать совсем?
_IELinkClickByIndex ($oSubmit,$n,0)
Sleep(5000)
EndIf
$coord = PixelSearch(0,0,1024 ,728, 0xFFD46C);открываются абсолютно одинаковые окна и точка эта есть даже в нескольких местах по экрану.  
If Not @error Then ; даже если вдруг нет - пропустили и пошли дальше.
    $pos = MouseGetPos()
    MouseClick("left",$coord[0],$coord[1],1) ; проверка цен
    MouseMove($pos[0],$pos[1], 1)
	Sleep(1000) 
    If  WinExists("Предупреждение системы безопасности") Then
        Send("{Enter}")
    EndIf
EndIf
Sleep(15000)
_IELoadWait ($oIE)
Opt("WinTitleMatchMode", 2)
While WinActive("Microsoft Internet Explorer"); >> Пока окно активно...так правильно?
$title = WinGetTitle("Microsoft Internet Explorer")
$hFile = FileOpen(@ScriptDir & '\Otchet.txt', 1)
        ;открываем файл
        FileWriteLine($hFile, $title  & @CRLF)
        ;записывем в него Title страницы 
        FileClose($hFile)
        ;закрываем файл
        If BitAND(WinGetState($title), 2) Then
        WinSetState($title, "", @SW_MAXIMIZE) ;те же  магические действия?
        $n = Random(5000,10000,1000)
        Sleep($n)
        WinKill($title)
    EndIf
WEnd
$n = Random(3000,7000,1000)
    Sleep($n)
Next

MsgBox(0,"НЕ ЗАБУДЬ!","ОТПРАВЬ ОТЧЕТ АВТОПИЛОТА")
Func _MyExit()
    If ProcessExists('IEXPLORE.EXE') Then ProcessClose('IEXPLORE.EXE')
    Exit
EndFunc   ;==>_MyExit
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Дело в том, что для того, что бы выяснить, почему скрипт на других ПК не работает так, как должен - необходимо узнать, в чем ошибка, какие из действий скрипта срабатывают не так, как нужно.

Соответственно, необходимо определить характер ошибок скрипта на других ПК. А уже после исправлять скрипт. В противном случае – медитировать можно долго и долго.

Не стесняйтесь использовать TAB/пробел-отступы, пробелы после запятых и соблюдать иерархию вложенности. Таким образом код будет намного читабельней, и с ним легче будет работать.

Подобные конструкции:
Код:
$n = Random(3000,7000,1000)
Sleep($n)

Можно заменить на:
Код:
Sleep(Random(3000,7000,1000))


И это тоже:
Код:
$hFile = FileOpen(@ScriptDir & '\Otchet.txt', 1)
FileWriteLine($hFile, $title  & @CRLF)
FileClose($hFile)

На это:
Код:
FileWriteLine(@ScriptDir & '\Otchet.txt', $title  & @CRLF)

Т.к. если указывать адрес файла, а не указатель на открытый файл, то файл будет автоматически открываться и закрываться. FileWriteLine записывает данные в конец файла.


Отформатированный код:
Код:
#include <IE.au3>
#Include <Array.au3>
#Include <Misc.au3>

Opt('TrayIconDebug', 		1)
Opt('WinTitleMatchMode', 	2)

HotKeySet('{ESC}', '_MyExit')

Global $oSabmit, $Links, $var, $title, $hFile, $Otchet[100], $i, $pos
Global Const $sProIDText = 'Автопилот'

If Not _Singleton($sProIDText, 1) Then
	MsgBox(48, 'Внимание', 'Одна копия программы уже запущена')
    _MyExit()
EndIf

For $i=1 to 1
	$oIE = _IECreate('http://travelpluse.weebly.com')
	$oSubmit = _IEGetObjByName($oIE, 'tasemcity01')

	If @error == 0 Then
		_IELinkClickByIndex($oSubmit, Random(7, 28, 1), 0)
		Sleep(5000)
	Else
		; А что сделать если ошибка возникла? Надо же как-то об этом узнать.
	EndIf

	$coord = PixelSearch(0, 0, 1024, 728, 0xFFD46C);открываются абсолютно одинаковые окна и точка эта есть даже в нескольких местах по экрану.
	If Not @error Then ; даже если вдруг нет - пропустили и пошли дальше.
		MouseClick('left', $coord[0], $coord[1],1) ; проверка цен
		
		$pos = MouseGetPos()
		MouseMove($pos[0], $pos[1], 1)
		
		Sleep(1000)
		If WinExists('Предупреждение системы безопасности') Then Send('{Enter}')
	EndIf

	Sleep(15000)
	_IELoadWait($oIE)

	While WinActive('Microsoft Internet Explorer')
		$title = WinGetTitle('Microsoft Internet Explorer')

		FileWriteLine(@ScriptDir & '\Otchet.txt', $title  & @CRLF)

		; Зачем разворачивать окно на весь экран?
		; WEB скрипты это отслеживать не будут
		; Лучше сразу закрыть окно, ну и сначала случайную пузу для имитации.
		If BitAND(WinGetState($title), 2) Then
			WinSetState($title, '', @SW_MAXIMIZE)
			Sleep(Random(5000,10000,1000))
			WinKill($title)
		EndIf
	WEnd

	Sleep(Random(3000,7000,1000))
Next

MsgBox(48, 'НЕ ЗАБУДЬ!', 'ОТПРАВЬ ОТЧЕТ АВТОПИЛОТА')

Func _MyExit()
    If ProcessExists('IEXPLORE.EXE') Then ProcessClose('IEXPLORE.EXE')
    Exit
EndFunc   ;==>_MyExit
 
Автор
trudmoy

trudmoy

Новичок
Сообщения
15
Репутация
1
Со всем согласен, но есть "но".
1. При таком написании поиск пикселя происходит до загрузки окна(не всегда, но бывает. Поставил контрольку - увидел.) Соответственно нет клика. Перед поиском пикселя поэтому и лепил _IELoadWait ($oIE) - помогало.
2. Опять же не всегда но бывает либо закрытие всех окон одновременно
(и в отчете только 1 строка), либо в отчете дублируются данные.
Извини за тупость, истерю понемногу.
 
Автор
trudmoy

trudmoy

Новичок
Сообщения
15
Репутация
1
на другом ПК не ищет пиксель и не находит открытых окон - нет отчета и не закрывает окна. на моем все видит и находит. Где же жемчужина...
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
trudmoy [?]
на другом ПК не ищет пиксель и не находит открытых окон - нет отчета и не закрывает окна.
Надо узнать - что не выполняется или выполняется не так на другом ПК - поиск, поиск, поиск.
Можно просматривать результат выполнения каждого шага через MsgBox.
 
Автор
trudmoy

trudmoy

Новичок
Сообщения
15
Репутация
1
на другом ПК не всегда находит пиксель и не находит открытых окон никогда
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
trudmoy [?]
на другом ПК не всегда находит пиксель
На другом ПК может точка другого цвета? Или вне видимости.


не находит открытых окон никогда
Так у вас проверка:
Код:
While WinActive('Microsoft Internet Explorer')

Может нет активных окон или заголовок окна имеет другое название.
Например у IE8 в заголовке:
 
Автор
trudmoy

trudmoy

Новичок
Сообщения
15
Репутация
1
заголовок - это да. попробую.
если AutoIt Window Info показывает на моем ПК цвет пикселя, он может быть другим на другом ПК?
ищу по цвету пикселя т.к. не мугу поймать кнопку в целом.
адрес кнопки: http://cdn.tripadvisor.com/img2/x.gif
связанный текст: CHECK RATES!
как не пробовал - не идет. Не видит ни ссылку, ни объект.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Советую, все же пользоваться функция _IE* и именно с их помощью нажимать на кнопку/картинку и т.д.
Если неполучается самому, обратитесь в стол заказов. Но не забывайте:
* в разделах есть свои правила;
* чем точней и досканальней вопрос - тем лучше ответ.
 
Верх