Что нового

[Cwars] Контроль над брауз. игрой, получение/дублирование сообщений с чата....

jilexandr

Знающий
Сообщения
129
Репутация
6
И так... Есть игра браузерная, состоит с фреймов, кстати вот ссылка http://cwars.ru

И есть в ней чат, сообщения с которого нужно получать в реальном времени, сохранять в переменную и дублировать в окно приложения, вобщем что делать с ними нужно не важно, главное их "поймать"...
P.S. Еще нужно "установить контроль" над игрой, минимум нужно осуществить переход в "Локация", кнопка находиться в верхнем меню. Получил фрейм по имени, сделал
Код:
_IELinkClickByText($oIE, "Локация")
но всеравно ничего... может игра "особенная", но скорее всего я что-то не понимаю :(
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

jilexandr,
Попробуйте так.
Код:
#include <IE.au3>
#include <Date.au3>
#include <File.au3>
#include <WinAPIEx.au3>

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

Global $iPause = 20000, _ ;проверка каждые 20 сек.
		$sStringChat = @CRLF, $iStart, $sTitleScript = @ScriptName & '{[/@[email protected]\]}', _
		$sLogin = 'Login', $sPass = 'Pass'

If WinExists($sTitleScript) Then Exit
AutoItWinSetTitle($sTitleScript)

HotKeySet('+{Esc}', '_Exit');Shift+Esc - выход

_Avtor_Cwars($sLogin, $sPass, 1);0 - IE скрыт.
If @error Then
	MsgBox(16, 'Error', '_Avtor_Cwars')
	_Exit()
EndIf
Sleep(2000)
_Select_Menu()
If Not @error Then
	Sleep(2000)
	_Get_Chat($sStringChat)
	If Not @error Then
		_Show()
	EndIf
Else
	ConsoleWrite('Error _Select_Menu' & @LF)
EndIf
HotKeySet('+{1}', '_Show');Shift+1 - показать
TraySetToolTip('Shift + Esc - выход' & @LF & 'Shift + 1 - информация')
_Memory_Check()
$iStart = TimerInit()
While 1
	If TimerDiff($iStart) > $iPause Then
		ConsoleWrite('_Get_Chat' & @LF)
		_Select_Menu()
		If Not @error Then
			Sleep(1000)
			_Get_Chat($sStringChat)
			If Not @error Then
				If @extended Then
					_Show()
				EndIf
			Else
				ConsoleWrite('Error _Get_Chat' & @LF)
			EndIf
		Else
			ConsoleWrite('Error _Select_Menu' & @LF)
		EndIf
		_Memory_Check()
		$iStart = TimerInit()
	EndIf
	Sleep(100)
WEnd

Func _Show()
	Local $s_String
	If StringLen($sStringChat) > 2 Then
		$s_String = StringTrimLeft(StringTrimRight($sStringChat, 2), 2)
		MsgBox(64, 'Сообщения:', $s_String, 10)
	Else
		MsgBox(16, 'Error', 'Нет сообщений', 10)
	EndIf
	$iStart = TimerInit()
EndFunc   ;==>_Show

Func _Exit()
	Local $s_Title = '[Title:Clan; Class:IEFrame]'
	If WinExists($s_Title) Then WinClose($s_Title)
	_Save()
	_DelOld()
	Exit
EndFunc   ;==>_Exit

Func _DelOld($i_Diff_Day = 30)
	;удалит все файлы вида YYYY_MM_DD.txt, старше $i_Diff_Day дней
	Local $s_Dir = @ScriptDir & '\ChatLog', $a_Files, $s_Date, $i_Diff
	$a_Files = _FileListToArray($s_Dir, '*.txt', 1)
	If @error Then Return
	For $i = 1 To $a_Files[0]
		$s_Date = StringReplace(StringRegExpReplace($a_Files[$i], '\..*$', ''), '_', '/')
		$i_Diff = _DateDiff('D', $s_Date, _NowCalcDate())
		If Not @error Then
			If $i_Diff > $i_Diff_Day Then FileDelete($s_Dir & '\' & $a_Files[$i])
		EndIf
	Next
EndFunc   ;==>_DelOld

Func _Save()
	;запишет в файл с именем вида YYYY_MM_DD.txt (сегодня) текст сообщений.
	Local $h_File, $s_TextOLd, $s_TextNew, $s_Path = @ScriptDir & '\ChatLog', _
			$s_File = StringReplace(_NowCalcDate(), '/', '_') & '.txt', $a_TextNew

	$s_TextNew = StringTrimLeft($sStringChat, 2)
	If StringLen($sStringChat) <= 2 Then Return
	If FileExists($s_Path & '\' & $s_File) Then
		$h_File = FileOpen($s_Path & '\' & $s_File, 0)
		If $h_File = -1 Then Return
		$s_TextOLd = FileRead($h_File)
		FileClose($h_File)
		If ($s_TextOLd = $s_TextNew Or Not $s_TextOLd) Then Return
		$a_TextNew = StringSplit(StringStripCR($s_TextNew), @LF)
		For $i = 1 To $a_TextNew[0]
			If Not StringInStr($s_TextOLd, $a_TextNew[$i] & @CRLF) Then
				$s_TextOLd &= $a_TextNew[$i] & @CRLF
			EndIf
		Next
		$h_File = FileOpen($s_Path & '\' & $s_File, 2)
		If $h_File <> -1 Then
			FileWrite($h_File, $s_TextOLd)
			FileClose($h_File)
		EndIf
	Else
		$h_File = FileOpen($s_Path & '\' & $s_File, 2)
		If $h_File <> -1 Then
			FileWrite($h_File, $s_TextNew)
			FileClose($h_File)
		EndIf
	EndIf
EndFunc   ;==>_Save

Func _Get_Chat(ByRef $s_String)
	Local $s_Title = '[Title:Clan; Class:IEFrame]', $h_HWND, $o_Obj, $o_Frame, $o_Head, _
			$s_HTML, $a_Temp, $i_Extended, $s_Temp

	$h_HWND = WinGetHandle($s_Title)
	If Not $h_HWND Then Return SetError(1)
	$o_Obj = _IEAttach($h_HWND, 'HWND')
	If @error Then Return SetError(1)
	$o_Frame = _IEFrameGetObjByName($o_Obj, 'null')
	If @error Then Return SetError(1)
	$o_Head = _IETagNameGetCollection($o_Frame, 'head', 0)
	If @error Then Return SetError(1)
	$s_HTML = _IEPropertyGet($o_Head, 'innerhtml')
	If @error Then Return SetError(1)
	$a_Temp = StringRegExp($s_HTML, '(\d{1,2}:\d{1,2}:\d{1,2}.*?)(?:<span class="date|''\);)', 3)
	If Not @error Then
		For $i = 0 To UBound($a_Temp) - 1
			$s_Temp = StringStripWS(StringRegExpReplace($a_Temp[$i], '<.*?>', ''), 7)
			If Not $s_Temp Or StringRegExp($s_Temp, '\d{1,2}:\d{1,2}:\d{1,2}\hUTC|GMT') Then ContinueLoop
			If Not StringInStr($s_String, @CRLF & $s_Temp & @CRLF) Then
				$s_String &= $s_Temp & @CRLF
				$i_Extended = 1
			EndIf
		Next
	EndIf
	Return SetExtended($i_Extended)
EndFunc   ;==>_Get_Chat

Func _Select_Menu($s_String_Menu = 'Локация')
	Local $s_Title = '[Title:Clan; Class:IEFrame]', $h_HWND, $o_Obj, _
			$o_Frame, $o_Tags, $i_Error = 1
	$h_HWND = WinGetHandle($s_Title)
	If Not $h_HWND Then Return SetError(11)
	$o_Obj = _IEAttach($h_HWND, 'HWND')
	If @error Then Return SetError(12)
	For $i = 1 To 1
		$o_Frame = _IEFrameGetObjByName($o_Obj, 'menu')
		If @error Then ExitLoop
		$o_Tags = _IETagNameGetCollection($o_Frame, 'a')
		If @error Then ExitLoop
		For $o_Tag In $o_Tags
			If $o_Tag.innertext == 'Локация' Then
				_IEAction($o_Tag, 'click')
				If @error Then ExitLoop
				_IELoadWait($o_Obj)
				If @error Then ExitLoop
				$i_Error = 0
			EndIf
		Next
	Next
	Return SetError($i_Error)
EndFunc   ;==>_Select_Menu

Func _Avtor_Cwars($s_Login, $s_Pass, $f_Visible = 0)
	Local $o_Obj, $s_Url_Avtor = 'http://www.cwars.ru/', $o_Form, $o_Login, $o_Pass

	$o_Obj = _IECreate('about:blank', 0, $f_Visible)
	If @error Then Return SetError(1)
	For $i = 1 To 1
		_IENavigate($o_Obj, $s_Url_Avtor)
		If @error Then ExitLoop
		$o_Form = _IEGetObjByName($o_Obj, 'log')
		If @error Then ExitLoop
		$o_Login = _IEFormElementGetObjByName($o_Form, 'nick')
		If @error Then ExitLoop
		$o_Pass = _IEFormElementGetObjByName($o_Form, 'password')
		If @error Then ExitLoop
		_IEFormElementSetValue($o_Login, $s_Login)
		If @error Then ExitLoop
		_IEFormElementSetValue($o_Pass, $s_Pass)
		If @error Then ExitLoop
		_IEFormSubmit($o_Form, 0)
		If @error Then ExitLoop
		_IELoadWait($o_Obj)
		If @error Then ExitLoop
	Next
	Return SetError(@error)
EndFunc   ;==>_Avtor_Cwars

Func _Memory_Check()
	Local $a_Memory, $i_MaxMemory = 3 * 1024 * 1024

	$a_Memory = ProcessGetStats()
	If Not @error And IsArray($a_Memory) Then
		If $a_Memory[0] > $i_MaxMemory Then
			_WinAPI_EmptyWorkingSet()
		EndIf
	EndIf
EndFunc   ;==>_Memory_Check
 
Автор
J

jilexandr

Знающий
Сообщения
129
Репутация
6
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

madmasles

меня пугает размер скрипта :shok:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

jilexandr [?]
меня пугает размер скрипта
Удалите ненужное. :smile:
 
Автор
J

jilexandr

Знающий
Сообщения
129
Репутация
6
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

madmasles

ищу не нужное =)

переход по меню понял как работает

а вот получение чата... слишком массивная функция получилась, что-то пробовал мудрить (копировал функцию к себе в приложение, без создания окна через _IEAttach), но не все сообщения с чата получаю, несколько последних, или вобще ничего (


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

тьфу, умеете Вы написать непонятный для новичка сприпт =)))))) хотел скинуть элементы кода которые относятся к получению сообщений, но запутался что к чему относиться (


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

можно по простому получить сообщения чата? без проверок ошибок, доп. функций, простой не профессиональной код )) что бы было максимально удобно изменять, а то к примеру
Код:
$sStringChat = @CRLF, $iStart, $sTitleScript = @ScriptName & '{[/@[email protected]\]}', _
что это?))
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

jilexandr [?]
Глобальные переменные.
 
Автор
J

jilexandr

Знающий
Сообщения
129
Репутация
6
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

Код:
Global ... $sStringChat = @CRLF
...
_Get_Chat($sStringChat)


что я передаю в функцию?

@CRLF, это вроде перевод строки?
 
Автор
J

jilexandr

Знающий
Сообщения
129
Репутация
6
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

вобщем вклеил скрипт себе в приложение )) только маленькая проблема
помещаю функции в цикл
Код:
While 1
Sleep(1000)
_Get_Chat($sStringChat)
_Show()
WEnd

потом сообщения дублирую в edit, но из-за этого цикла, нельзя нажать на кнопку для выполнения других действий, может у вашей функции есть такая возможность, но разобрать до конца так и не смог


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

:scratch:
 
Автор
J

jilexandr

Знающий
Сообщения
129
Репутация
6
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

:wacko: я ведь чесно не знаю как
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Как правильно называть темы

"Контроль над брауз. игрой, получение/дублирование сообщений с чата...." - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Модератор раздела.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

jilexandr [?]
но из-за этого цикла, нельзя нажать на кнопку для выполнения других действий
Пока функция работает, другие действия производиться не будут, ИМХО, Вы слишком часто обновляете данные. Можно, наверное, попробовать сделать отдельный модуль.
 
Автор
J

jilexandr

Знающий
Сообщения
129
Репутация
6
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

Belfigor
"Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)"
название темы полностью отображает суть вопроса/проблемы :whistle:
P.S тему перенесли с "Для новичков" и проблем в названии не было :scratch:


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

Вы слишком часто обновляете данные

если получать данные с большим интервалом, то потребность в боте полностью отпадает....

Можно, наверное, попробовать сделать отдельный модуль.

модуль? :scratch:
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

Тема должна быть оформлена в соответствии с правилами раздела иначе она будет закрыта.
 
Автор
J

jilexandr

Знающий
Сообщения
129
Репутация
6
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

Belfigor
там может подскажете как тему назвать? я просто не знаю...
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
Re: Контроль над брауз. игрой, получение/дублирование сообщений с чата....

http://autoit-script.ru/index.php/topic,6125.0.html
Тут вроде все понятно написано.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
Вполне
 
Автор
J

jilexandr

Знающий
Сообщения
129
Репутация
6
две функции вместил в одну, нужна оптимизация конкретная...( вместо цикла пробовал использовать функции AdlibRegister, но запускается только один раз, может из-за цикла for внутри? так как слипов, msgbox'ов там нету
 
Автор
J

jilexandr

Знающий
Сообщения
129
Репутация
6
не пойму как работает функция, в чате около 30 сообщений, выполняю функцию... ничего не отображает, пишу в чат, еще раз выполняю функцию, и есть мое сообщение, почему так???
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
jilexandr [?]
не пойму как работает функция, в чате около 30 сообщений, выполняю функцию... ничего не отображает, пишу в чат, еще раз выполняю функцию, и есть мое сообщение, почему так???
Там хитрый фрейм, текст сообщений в нем появляется только при запуске и после добавления нового сообщения. Почему так - вопрос к разработчикам игры(сайта).
 
Верх