Что нового

Поиск совпадений в мгновенных сообщениях Lync 2013.

PACHOM

Новичок
Сообщения
99
Репутация
0
Здравствуйте!

На работе часто бывает, что сетевой диск отключается и работать с сетевыми файлами не получается. Как выход из ситуации все сотрудники использую чат (в качестве агента выступает Lync 2013). Но перечитывать каждый раз кто какой счёт сделал достаточно муторно и у меня появилась идея: при поступлении нового сообщения в чате, скриптом Autoit обрабатывать всю переписку. Сама обработка подразумевает поиск повторяющихся номеров счетов - если уже такой счёт был - выдать предупреждение об этом.
Осталось реализовать.
Для меня решение вопроса следующее:
1. Запускаем чат и скрипт;
2. При поступлении нового сообщения скрипт вытаскивает из чата всю переписку;
3. Осуществляет поиск по вытащенной переписке;
4. Нашёл совпадение - выдал сообщение и наоборот.

Что я не понимаю:
1. Как объяснить скрипту, что пришло новое сообщение?
2. Как осуществить поиск в вытащенной переписке?

Буду благодарен за любое участие :smile:

С уважением,
ПАХОМ.
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
PACHOM [?]
1. Как объяснить скрипту, что пришло новое сообщение?
Записать содержимое, а через некоторое время считать переписку и сравнить с уже записанной. Если есть отличия то их вывести. И переписать предыдущую запись для последующего сравнения.
2. Как осуществить поиск в вытащенной переписке?
Функциями работы со строками например.
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
Добрый день!

Записать содержимое,
Да, это мы можем ... это при первом запуске агента и скрипта.

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


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

Добрый вечер! :smile:

Сижу и пишу скрипт ... уважаемые ГУРУ ... помогите пожалуйста.
Код:
;~ #RequireAdmin
#AutoIt3Wrapper_Res_requestedExecutionLevel = highestAvailable


;~ Изменяет метод сопоставления заголовков окон при операции поиска.
;~ 1 = Начальное соответствие заголовка (по умолчанию)
;~ 2 = Соответствие любой подстроке в заголовке
;~ 3 = Точное соответствие заголовка
;~ 4 = Расширенный режим, смотрите заголовки и текст окон (расширенные)
;~ 		От -1 до -4 = принудительное сопоставление в нижнем регистре для соответствующих типов сопоставления.
Opt("WinTitleMatchMode", 4)

;~ назначаем горячую клавишу для остановки скрипта при необходимости
HotKeySet("{ESC}", "Terminate")
Func Terminate()
	Exit 0
EndFunc


$sTitle = "Mail.Ru Агент" 			;Заголовок окна
$sClass = "MRA_SENDRECEIVE" 	;Внутреннее название класса окна

;~ находим окно по его заголовку и классу, поиск по тексту окна не осущестляем, но даём 2 секунды на его поиск
$hWnd = WinWait("[TITLE:" & $sTitle & "; CLASS:" & $sClass & "]", "", 2)
If Not $hWnd Then
    MsgBox(16+4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта.')
    Exit
EndIf

;~ WinActivate($hWnd) ;Активируем найденное окно

; извлекаем текст
$Text = ControlGetText($hWnd, "", "JSScrollBar1")
MsgBox(4096, 'Текст элемента JSScrollBar в Mail.Ru Агент', $Text)

;~ ДАЛЕЕ НАЧИНАЮТСЯ ВОПРОСЫ :)

$sLast ; Как подсчитать и апоминить максимальное кол-во строчек

While 1 ;~ запускаем бесконечный цикл на проверку новый строчек в тексте
	If @error Then ExitLoop
;~  Как объяснить, что если окно $hWnd закрыто, то выходим из скрипта? (If ???? Then ExitLoop)


;~ если новый строчек нет - продолжаем эти строчки ожидать
;~ если есть новые строчки, делаем следующее:
	;~ 1. Считываем 1-ю строчку - это имя написавшего
	;~ 2. Считываем 2-ю строчку - она будет содержать что-то типа: 12345 в 1025
	;~ 3. Ищим по регулярному выражению (берём его из 2-ой строчки нового сообщения) во всём файле совпадения
	;~ 3.1. Если нет совпадений - обновляем переменную $sLast
	;~ 3.2. если есть совпадения - выводим сообщение о том кто присылал такое же сообщение
	;~ 4. После закрытия сообщения продолжаем
		;~ 	4.1. обновляем переменную $sLast
		;~ 	4.2. продолжаем ожидать новых сообщений.

Wend
Место с которого начинаются вопросы я отметил ...

С уважением,
ПАХОМ.


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

Буду рад любым ссылкам по функциям в справочнике ...


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

Застрял на:
1. Как подсчитать кол-во строк в тексте?
Может есть функция поиска переноса строки?
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
PACHOM
PACHOM сказал(а):
Каждый раз запускать скрипт муторно и бессмысленно.
Так я имел в виду использование цикла, что приведет Ваше участие в запуске скрипта к нулю.
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
Здравствуйте!

Ночью возникла другая идея реализации:
Считать весь текст окна - реализовано;
Циклом обработать текст: запихать данные в 3-х мерный массив (ИМЯ - сообщение - статус). Тут просто распишу: если в сообщении есть регулярное выражение: 12345 в 10:25, то запихиваем всё в массив. И если это регулярное сообщение уже ранее повторялось - ставим статус - ОТКАЗ, а в противном случае УСПЕХ.
Всё.

Пожалуйста, тех кто уверенно чувствует себя в Autoit - дайте намётки что лучше использовать. Да вообще буду рад советам :smile:

ПС: ivsatel - Доброе утро и спасибо :smile:


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

С 3-х мерным массивом я переборщил ... лучше 2-х мерный :smile:


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

Вот код ... но он в конце не выдаёт кол-во сообщение.
Прошу помочь ... пожалуйста
Код:
#include <Array.au3>
;~ #RequireAdmin
;~ #AutoIt3Wrapper_Res_requestedExecutionLevel = highestAvailable

Opt("WinTitleMatchMode", 4)

;~ назначаем горячую клавишу для остановки скрипта при необходимости
HotKeySet("{ESC}", "Terminate")
Func Terminate()
	Exit 0
EndFunc

$sTitle = "Mai" 		;Заголовок окна
$sClass = "MRA_SENDRECEIVE" 	;Внутреннее название класса окна

;~ находим окно по его заголовку и классу, поиск по тексту окна не осущестляем, но даём 2 секунды на его поиск
$hWnd = WinWait("[TITLE:" & $sTitle & "; CLASS:" & $sClass & "]", "", 2)
If Not $hWnd Then
    MsgBox(16+4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта.')
    Exit
EndIf

; извлекаем текст
$Text = ControlGetText($hWnd, "", "JSScrollBar1")
MsgBox(4096, 'Сообщение', "Сообщение С пустыми строками:" & @LF & $Text)

;Удаляем & @LF & @LF & @LF & пустые строки
$Text = StringRegExpReplace($Text, '(\r\n|\r|\n){2,}', '\1')
MsgBox(4096, 'Сообщение', "Сообщение без пустых строк:" & @LF & $Text)

;~ подсчитываем длину текста
$LenFirst = StringLen($Text)

;~ запускаем бесконечный цикл на проверку новый строчек в тексте
While 1
	If @error Then ExitLoop
	If Not $hWnd Then ExitLoop
	;~ проверяем наличие нового сообщения
	$TextLast = ControlGetText($hWnd, "", "JSScrollBar1") ;считываем текст с окна чата
	$TextLast = StringRegExpReplace($TextLast, '(\r\n|\r|\n){2,}', '\1') ;Удаляем & @LF & @LF & @LF & пустые строки
	$LenLast = StringLen($TextLast) ;определяем кол-во знаков в тексте
	If $LenFirst <> $LenLast Then ;если есть новые строчки
	  $NewText = StringMid($TextLast, $LenFirst) ;~получаем текст нового сообщения
	  MsgBox(4096, 'Весь текст', "Весть текст НОВОГО сообщения:" & @LF & $NewText)
	  $sRegStr = StringRegExpReplace($NewText, '(\d{4})', '$1');~ ищим регулярное выражение в новом сообщении
	  MsgBox(4096, 'Сообщение ОДИН', "Кол-во регулярных выражений составляет:" & @LF & @extended & @LF & @error)
	  MsgBox(4096, 'Сообщение ОДИН+', "НАЙДЕНО! регулярное выражение, вот оно:" & @LF & $sRegStr)
	    If @error = 2 Then
		  MsgBox(4096, 'Ошибка', "Ошибка замены руг-го выражения:" & @LF & @error)
		  ExitLoop
		Endif

		If @extended > 0 Then ;~ если регулярное выражение найдено и нет ошибки
		  MsgBox(4096, 'Сообщение', "НАЙДЕНО! регулярное выражение, вот оно:" & @LF & $sRegStr)
	      $OldText = StringMid($TextLast, 1, $LenFirst) ;~получаем текст старого сообщения
		  MsgBox(4096, 'Сообщение',"Вот весь текст СТАРОГО сообщения:" & @LF & $OldText)
		  $res_array = StringRegExp($OldText, $sRegStr, 3) ;ищим регулярное выражение, из нового сообщения, в старом тексте
		  $array = StringRegExpReplace($OldText, $sRegStr, "реге-е") ;ищим регулярное выражение, из нового сообщения, в старом тексте
		  MsgBox(4096, 'Сообщение ДВА', "Кол-во регулярных выражений составляет:" & @LF & $res_array)
		EndIf

		;~Для продолжения цикал обновляем переменную
		$LenFirst = $LenLast

	EndIf
Wend



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

Тему можно закрывать ... если кто доделает - скажу БОЛЬШОЕ спасибо :smile:

Код:
#include <Array.au3>
;~ #RequireAdmin
;~ #AutoIt3Wrapper_Res_requestedExecutionLevel = highestAvailable

Opt("WinTitleMatchMode", 4)

;~ назначаем горячую клавишу для остановки скрипта при необходимости
HotKeySet("{ESC}", "Terminate")
Func Terminate()
	Exit 0
EndFunc

$sTitle = "Mai" 		;Заголовок окна
$sClass = "MRA_SENDRECEIVE" 	;Внутреннее название класса окна

;~ находим окно по его заголовку и классу, поиск по тексту окна не осущестляем, но даём 2 секунды на его поиск
$hWnd = WinWait("[TITLE:" & $sTitle & "; CLASS:" & $sClass & "]", "", 2)
If Not $hWnd Then
    MsgBox(16+4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта.')
    Exit
EndIf

; извлекаем текст
$Text = ControlGetText($hWnd, "", "JSScrollBar1")
;~ MsgBox(4096, 'Сообщение', "Сообщение С пустыми строками:" & @LF & $Text)

;Удаляем & @LF & @LF & @LF & пустые строки
$Text = StringRegExpReplace($Text, '(\r\n|\r|\n){2,}', '\1')
;~ MsgBox(4096, 'Сообщение', "Сообщение без пустых строк:" & @LF & $Text)

;~ подсчитываем длину текста
$LenFirst = StringLen($Text)

;~ запускаем бесконечный цикл на проверку новый строчек в тексте
While 1
	If @error Then ExitLoop
	If Not $hWnd Then ExitLoop
	;~ проверяем наличие нового сообщения
	$TextLast = ControlGetText($hWnd, "", "JSScrollBar1") ;считываем текст с окна чата
	$TextLast = StringRegExpReplace($TextLast, '(\r\n|\r|\n){2,}', '\1') ;Удаляем & @LF & @LF & @LF & пустые строки
	$LenLast = StringLen($TextLast) ;определяем кол-во знаков в тексте
	If $LenFirst <> $LenLast Then ;если есть новые строчки

	  $NewText = StringMid($TextLast, $LenFirst) ;~получаем текст нового сообщения
;~ 	  MsgBox(4096, 'Весь текст', "Весть текст НОВОГО сообщения:" & @LF & $NewText)

      $sRegStr = StringRegExp($NewText, "\d{5}\h[\wА-яЁё]\h[\d:]{4,5}", 3) ;~ ищим регулярное выражение в новом сообщении
	  If @error = 2 Then
		MsgBox(16+4096, 'Ошибка', "Ошибка замены рег-го выражения:" & @LF & @error)
		ExitLoop
	  Endif

;~ 	  MsgBox(4096, 'Сообщение ОДИН', "Кол-во регулярных выражений составляет:" & @LF & @extended + 2 & @LF & @error)

	  For $i = 0 To UBound($sRegStr) - 1

;~ 		MsgBox(4096, 'Сообщение ОДИН+', "НАЙДЕНО! регулярное выражение, вот оно:" & @LF & $sRegStr[$i])
	    $OldText = StringMid($TextLast, 1, $LenFirst) ;~получаем текст старого сообщения

;~ 	    MsgBox(4096, 'Сообщение',"Вот весь текст СТАРОГО сообщения:" & @LF & $OldText)
	    $res_array = StringRegExp($OldText, $sRegStr[$i]) ;ищим регулярное выражение в старом тексте, из нового сообщения

	    If @error = 2 Then
		  MsgBox(16+4096, 'Ошибка', "Ошибка замены рег-го выражения:" & @LF & @error)
		  ExitLoop
	    Endif

		If $res_array = 1 Then	MsgBox(4096, 'ВНИМАНИЕ!',"Номер " & $sRegStr[$i] & " уже был.")

	  Next

		;~Для продолжения цикал обновляем переменную
		$LenFirst = $LenLast

	EndIf
Wend
 
Верх