Что нового

[Мышь, клавиатура] эмуляция нажатия кнопки голосования за комент (+ или -) на сайте newsland.ru

Alex300

Новичок
Сообщения
17
Репутация
1
Версия AutoIt: 3.3.6.1

Описание: Подскажите, плиз, как на сайте www.newsland.ru, например на этой страничке http://www.newsland.ru/onair/comments/user/1088823/
эмулировать нажатие на зеленый плюс или красный минус?

Пусть это будет даже не поиск кнопки, а указание на конкретный комент....

Прямое эмулирование движения мышкой часто промахивается из-за смещения странички.

Примечания: Осложнение в том, что будет использован не IE, а браузер типа FireFox или Crom.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Alex300,
Если в IE, то это не сложно, можно попробовать. С другими браузерами я пас.
 
Автор
A

Alex300

Новичок
Сообщения
17
Репутация
1
Если не затруднит. Наверное проще организовать работу скрипта в IE, чем найти решение для другого браузера.
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Alex300
указание на конкретный комент....
т.е. в поле зрения будет всего 2 кнопки? + и -
я правильно понял?


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

Если кнопки + и - одни в поле зрения, то вот:
True - Жмет на +
False - Жмет на -
Без параметров жмет на +


Код:
Сlick(False)

Func Click($mode=true)
	If $mode=True then
		$coord = PixelSearch( 0, 0, @DesktopWidth, @DesktopHeight, 0x9EBD6B )
		If Not @error Then
			MouseClick("left",$coord[0],$coord[1],1,0)
		EndIf
	elseif $mode=False Then
		$coord = PixelSearch( 0, 0, @DesktopWidth, @DesktopHeight, 0xE0667A )
		If Not @error Then
			MouseClick("left",$coord[0],$coord[1],1,0)
		EndIf	
	EndIf
EndFunc


P.S. Желательно все таки на IE сделать. (тогда и в скрытом виде работать будет и надежнее)
 
Автор
A

Alex300

Новичок
Сообщения
17
Репутация
1
"Да", но на всякий случай оставлю за собой право на уточнение, после попытки применить Вашу подсказку, мало ли какой там подводный камень вылезет 8)

Уточните плиз по Вашему коду. Его можно привязать к конкретному коменту?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Alex300
В IE. Только сначала надо авторизироваться.
Код:
#include <IE.au3>

$sUrl = 'http://www.newsland.ru/onair/comments/user/1088823/'
$iCountPlus = 0
;$iCountMinus = 0
$oIE = _IECreate($sUrl)
If @error Then
	MsgBox(16, 'Error', '_IECreate')
	Exit
EndIf
For $i = 1 To 1
	$oTags = _IETagNameGetCollection($oIE, 'a')
	If @error Then ExitLoop
	;жмем все +
	For $oTag In $oTags
		If $oTag.classname == 'buttonPlus' Then
			_IEAction($oTag, 'click')
			If Not @error Then $iCountPlus += 1
			_IELoadWait($oIE)
		EndIf
		;жмем все -
		;If $oTag.classname == 'buttonMinus' Then
		;	_IEAction($oTag, 'click')
		;	If Not @error Then $iCountMinus += 1
		;	_IELoadWait($oIE)
		;EndIf
	Next
Next
MsgBox(64, 'Info', 'Нажали плюсов ' & $iCountPlus)
;MsgBox(64, 'Info', 'Нажали минусов ' & $iCountMinus)
Если надо на конкретные комментарии ставить +-, то будет сложнее.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Alex300,
Скрипт берет данные из двух ини-файлов, которые должны лежать рядом со скриптом. Образцы - в прикрепленном архиве.
Код:
#include <IE.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $aLogin, $aUrl[1][6][2], $oIE

If WinExists(@ScriptName & '{[/@$@\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@$@\]}')

_Get_Login_Array($aLogin)
If @error Then
	MsgBox(16, 'Error', '_Get_Login_Array')
	Exit
EndIf
_Get_Url_Array($aUrl)
If @error Then
	MsgBox(16, 'Error', '_Get_Url_Array')
	Exit
EndIf

For $i = 1 To $aLogin[0][0]
	_Exit_Login($oIE)
	If @error Then ExitLoop
	_Avtor($oIE, $aLogin[$i][0], $aLogin[$i][1])
	If @error Then ContinueLoop
	For $j = 1 To $aUrl[0][0][0]
		_Click_Plus_Minus_Url($oIE, $aUrl, $j, $aLogin[$i][0])
	Next
Next
_IEQuit($oIE)

Func _Avtor(ByRef $o_Obj, $s_Login, $s_Pass)
	Local $s_Url_Avtor = 'http://newsland.ru/user/login/', $o_Form, $o_Login, $o_Pass, _
			$o_Enter, $i_Start, $i_Error = 1, $s_LocUrl

	For $i = 1 To 1
		_IENavigate($o_Obj, $s_Url_Avtor)
		If @error Then ExitLoop
		$o_Form = _IEGetObjById($o_Obj, 'user_login_form')
		If @error Then ExitLoop
		$o_Login = _IEFormElementGetObjByName($o_Form, 'login_or_email')
		If @error Then ExitLoop
		$o_Pass = _IEFormElementGetObjByName($o_Form, 'password')
		If @error Then ExitLoop
		$o_Enter = _IEFormElementGetObjByName($o_Form, 'Войти')
		If @error Then ExitLoop
		_IEFormElementSetValue($o_Login, $s_Login)
		If @error Then ExitLoop
		_IEFormElementSetValue($o_Pass, $s_Pass)
		If @error Then ExitLoop
		_IEAction($o_Enter, 'click')
		If @error Then ExitLoop
		$i_Start = TimerInit()
		While 1
			If WinExists('[Title:Сообщение с веб-страницы; Class:#32770]') Then
				ControlClick('[Title:Сообщение с веб-страницы; Class:#32770]', '', '[CLASS:Button; INSTANCE:1]')
				ExitLoop 2
			EndIf
			$s_LocUrl = _IEPropertyGet($o_Obj, 'locationurl')
			If @error Then ExitLoop 2
			If $s_LocUrl == 'http://www.newsland.ru/' Then ExitLoop
			If TimerDiff($i_Start) > 10000 Then ExitLoop 2
			Sleep(1000)
		WEnd
		$i_Error = 0
	Next
	Return SetError($i_Error)
EndFunc   ;==>_Avtor

Func _Exit_Login(ByRef $o_Obj)
	Local $s_Text, $s_Exit = 'Выйти', $s_Url = 'http://www.newsland.ru/', $i_Error = 1
	If Not IsObj($o_Obj) Then
		$o_Obj = _IECreate()
		If @error Then Return SetError(1)
	EndIf
	For $i = 1 To 1
		_IENavigate($o_Obj, $s_Url)
		If @error Then ExitLoop
		$s_Text = _IEBodyReadText($o_Obj)
		If @error Then ExitLoop
		If StringInStr($s_Text, $s_Exit) Then
			_IELinkClickByText($o_Obj, $s_Exit)
			If @error Then ExitLoop
		EndIf
		$i_Error = 0
	Next
	Return SetError($i_Error)
EndFunc   ;==>_Exit_Login

Func _Click_Plus_Minus_Url(ByRef $o_Obj, $a_Array, $i_Index, $s_Login)
	Local $s_Url = 'http://www.newsland.ru/onair/comments/user/', $i_Count_Click_Plus = 0, _
			$i_Count_Click_Minus = 0, $i_CountPlus, $i_CountMinus, $o_Tags, _
			$s_FileLog = @ScriptDir & '\Log\' & @MDAY & '_' & @MON & '.txt', $h_File

	$s_Url &= $a_Array[$i_Index][0][0] & '/'
	For $j = 1 To 1
		_IENavigate($o_Obj, $s_Url)
		If @error Then ExitLoop
		$o_Tags = _IETagNameGetCollection($o_Obj, 'a')
		If @error Then ExitLoop
		For $o_Tag In $o_Tags
			If $o_Tag.classname == 'buttonPlus' Then
				$i_CountPlus += 1
				For $i = 1 To 5
					If $a_Array[$i_Index][$i][0] == $i_CountPlus And $a_Array[$i_Index][$i][1] == 'p' Then
						_IEAction($o_Tag, 'click')
						If Not @error Then
							If WinWait('[Title:Сообщение с веб-страницы; Class:#32770]', '', 2) Then
								ControlClick('[Title:Сообщение с веб-страницы; Class:#32770]', '', '[CLASS:Button; INSTANCE:1]')
							Else
								_IELoadWait($o_Obj)
								If Not @error Then $i_Count_Click_Plus += 1
							EndIf
						EndIf
					EndIf
				Next
			EndIf
			If $o_Tag.classname == 'buttonMinus' Then
				$i_CountMinus += 1
				For $i = 1 To 5
					If $a_Array[$i_Index][$i][0] == $i_CountPlus And $a_Array[$i_Index][$i][1] == 'm' Then
						_IEAction($o_Tag, 'click')
						If Not @error Then
							If WinWait('[Title:Сообщение с веб-страницы; Class:#32770]', '', 2) Then
								ControlClick('[Title:Сообщение с веб-страницы; Class:#32770]', '', '[CLASS:Button; INSTANCE:1]')
							Else
								_IELoadWait($o_Obj)
								If Not @error Then $i_Count_Click_Minus += 1
							EndIf
						EndIf
					EndIf
				Next
			EndIf
		Next
	Next
	$h_File = FileOpen($s_FileLog, 9)
	If $h_File <> -1 Then
		FileWrite($h_File, @HOUR & ':' & @MIN & ':' & @SEC & @CRLF & 'От имени ' & $s_Login & @CRLF & _
				'Пользователю № ' & $a_Array[$i_Index][0][0] & @CRLF & 'Поставили плюсов:' & @TAB & _
				$i_Count_Click_Plus & @CRLF & 'Поставили минусов:' & @TAB & $i_Count_Click_Minus & _
				@CRLF & '-----------------------' & @CRLF & @CRLF)
		FileClose($h_File)
	EndIf
EndFunc   ;==>_Click_Plus_Minus_Url

Func _Get_Login_Array(ByRef $a_Array)
	Local $s_FileLogin = @ScriptDir & '\Login.ini', $s_Section = 'Login'
	If Not FileExists($s_FileLogin) Then Return SetError(1)
	$a_Array = IniReadSection($s_FileLogin, $s_Section)
	If @error Then Return SetError(1)
EndFunc   ;==>_Get_Login_Array

Func _Get_Url_Array(ByRef $a_Array)
	Local $s_FileLogin = @ScriptDir & '\Url.ini', $a_Sections, $a_Temp
	If Not FileExists($s_FileLogin) Then Return SetError(1)
	$a_Sections = IniReadSectionNames($s_FileLogin)
	If @error Then Return SetError(1)
	ReDim $a_Array[$a_Sections[0] + 1][6][2]
	$a_Array[0][0][0] = $a_Sections[0]
	For $i = 1 To $a_Array[0][0][0]
		$a_Temp = IniReadSection($s_FileLogin, $a_Sections[$i])
		If @error Then Return SetError(1)
		$a_Array[$i][0][0] = $a_Sections[$i]
		For $j = 1 To $a_Temp[0][0]
			$a_Array[$i][$j][0] = $a_Temp[$j][0]
			$a_Array[$i][$j][1] = $a_Temp[$j][1]
			If $j = 5 Then ExitLoop
		Next
	Next
EndFunc   ;==>_Get_Url_Array
 
Автор
A

Alex300

Новичок
Сообщения
17
Репутация
1
Фигассе какой монстрик получился..... :shok:
Спасибо огромное!!!
Хотя "спасибо" за такую помощь явно не достаточно.
Отпишу после тестирования.
-----------------------
25.09.2011 примерно с 11 часов на связке mail-newsland какой-то глюк - не заходит вообще с mail-a на newsland. Такое уже бывало. Может осложнить тестирование.
 
Верх