Что нового

[Автоматизация] Автоматический аудио граббер с интернет страницы

DR_ALF

Новичок
Сообщения
16
Репутация
0
Хочу сделать англо-русский словарь с произношением слов. Есть текстовый файл dic.txt с английскими словами расположенные в столбик. Сначала я кликаю на слове мышкой, чтобы оно выделилось, следом нажимаю F1, дальше уже работает скрипт до момента произношения слова на странице. Тут необходимо уже вручную нажимать на иконку воспроизведения. Можно было применить MouseClick, но положение кнопки на странице постоянно меняется, в зависимости от длинны введенного в поле слова. Предполагаю что в код нужно добавить команду
PixelSearch, которая по сработке на нужном пикселе передаст его координаты функции MouseClick.
Лучше конечно сделать все в автомате, но моих познаний пока не хватает.
Подскажите пожалуйста как можно доработать код скрипта.
..скрипт берет по порядку слова из документа, вставляет их в форму интернет-страницы, нажимает проговаривание, кликает на DownloadHelper и сохраняет аудио файл. Так пока не дойдет до конца документа dic.txt.

Адрес: http://translate.yandex.ru/?text=new

Код:
TraySetIcon("Shell32.dll", 44)
HotKeySet("{F1}", "Copy")

While 1
    Sleep(100)
WEnd

Func Copy()
WinWaitActive("dic")
Send("^{INS}");копировать в буфер обмена
Sleep(500)
WinSetState("dic", "", @SW_MINIMIZE)
Sleep(500)
WinSetState("Яндекс.Перевод - онлайн-переводчик", "", @SW_MAXIMIZE)
WinWaitActive("Яндекс.Перевод - онлайн-переводчик")
Sleep(500)
Send("^{a}");выделить всё
Sleep(500)
Send("{RCTRL}+{Insert}");вставить из буфера обмена
;Здесь вручную нажимаю на иконку произношения слова на странице Mozilla Firefox
;далее кликаю по DownloadHelper, открывается окно"Сохранить файл"
WinWaitActive("Сохранить файл")
Sleep(500)
Send("{RCTRL}+{Insert}");вставить текст из буфера обмена в поле окна "Сохранить файл"
Sleep(500)
Send('{ENTER}');сохраняем захваченный файл
EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
;$x1 - левый край линии поиска
;$x1 должен быть<$x2
;$x2 правый край
;поиск идет справа на лево 
;по координате $y
$x1 = 100
$x2 = 200
$y = 50

For $x2 To $x1 Step -6
   $var = PixelSearch($x1, $y, $x2, $y, 0xF4F7FF, 10)
   If @error Then
	  MouseClick("left", $var[0], $var[1], 1, 10)
	  ExitLoop
   EndIf
Next

Проверяем от x2 до x1 каждый 6-й пиксель, в случае нахождения цвета отличного от фона, тыкаем туда мышкой.
Каждый 6й пиксель взят потому, что ширина граммофона = 7 пикселей по горизонтали. По сути можно и каждый 7-й проверять.
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Кусочек моего вдохновения:

Код:
$STR = 'Hello AutoIt'
$LANG = 'en_GB'

InetGet("http://tts.voicetech.yandex.net/tts?format=mp3&quality=hi&platform=web&application=translate&text="&$STR&"&lang="&$LANG, @TempDir & "\voicetechyandex.mp3")
SoundPlay(@TempDir & "\voicetechyandex.mp3", 1)

$STR = '%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82' ;~ Привет
$LANG = 'ru_RU'

InetGet("http://tts.voicetech.yandex.net/tts?format=mp3&quality=hi&platform=web&application=translate&text="&$STR&"&lang="&$LANG, @TempDir & "\voicetechyandex.mp3")
SoundPlay(@TempDir & "\voicetechyandex.mp3", 1)


ЗЫ: правда надо с русским подшаманить чуть-чуть.
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Код:
$STR = _UnicodeURLEncode('Я говорю тебе привет')
$LANG = 'ru_RU'

InetGet("http://tts.voicetech.yandex.net/tts?format=mp3&quality=hi&platform=web&application=translate&text="&$STR&"&lang="&$LANG, @TempDir & "\voicetechyandex.mp3")
SoundPlay(@TempDir & "\voicetechyandex.mp3", 1)

Func _UnicodeURLEncode($UnicodeURL)
    $UnicodeBinary = StringToBinary ($UnicodeURL, 4)
    $UnicodeBinary2 = StringReplace($UnicodeBinary, '0x', '', 1)
    $UnicodeBinaryLength = StringLen($UnicodeBinary2)
    Local $EncodedString
    For $i = 1 To $UnicodeBinaryLength Step 2
        $UnicodeBinaryChar = StringMid($UnicodeBinary2, $i, 2)
        If StringInStr("$-_.+!*'(),;/?:@=&abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", BinaryToString ('0x' & $UnicodeBinaryChar, 4)) Then
            $EncodedString &= BinaryToString ('0x' & $UnicodeBinaryChar)
        Else
            $EncodedString &= '%' & $UnicodeBinaryChar
        EndIf
    Next
    Return $EncodedString
EndFunc
 
Автор
D

DR_ALF

Новичок
Сообщения
16
Репутация
0
Спасибо всем за помощь! Примеры очень интересны в освоении принципа действия кода. Похоже я обойдусь без плагина захвата аудио и без браузера.
Belfigor, я наверно неправильно делаю, что запускаю Ваш код как самостоятельный скрипт? Он выдает мне сообщение об ошибке.
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Belfigor
А разве так можно?
Код:
For $x2 To $x1 Step -6
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Ой и правда, надо вот так:
Код:
$x1 = 100
$x2 = 200
$y = 50

For $x=$x2 To $x1 Step -6
   $var = PixelSearch($x, $y, $x, $y, 0xF4F7FF, 10)
   If @error Then
      MouseClick("left", $var[0], $var[1], 1, 10)
      ExitLoop
   EndIf
Next
 
Автор
D

DR_ALF

Новичок
Сообщения
16
Репутация
0
Belfigor, почему то у меня только так заработал

Код:
$x1 = 818
$x2 = 1030
$y = 398

For $x2 = 1030 To $x1 Step -1
   $var = PixelSearch($x1, $y, $x2, $y, 0x009a9085, 50)
   If Not @error Then
      MouseClick("left", $var[0], $var[1], 1, 10)
      ExitLoop
   EndIf
Next


На выставленные значения shade-variation(отличие компоненты цвета) от 10 до 40 вообще не отрабатывает, а похоже устанавливает @error равным 1, если пиксель указанного цвета не найден и скрипт выходит без отработки. Приходится выставлять больше 50, из-за этого наверно точность попадания клика не очень получается. Значения $x1, $x2, $y выставил в соответствии с разрешением своего монитора.
Мне интересно как работает PixelSearch, сканирует справа на лево только одну строчку пикселей или же как луч в электронно лучевой трубке монитора пробегает каждую строку со смещение на одну вниз. Как например задать ей отсканировать весь экран от и до, при разрешении 1600 на 900 точек?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Я плохо вчитался в сообщение, но смею предположить что проблема в том что вместо:
Код:
If @error Then

стоит
Код:
If Not @error Then
 
Автор
D

DR_ALF

Новичок
Сообщения
16
Репутация
0
Заработало как надо! Нарисовал в Paint красный квадрат на белом фоне, сохранил изображение. Открыл на просмотр, увеличил масштаб, чтоб можно было двигать квадрат по горизонтали и вертикали и программой Pixi контролировал правильность отрабатывания скрипта на найденных им координатах. Belfigor спасибо за пример. В нем впринципе все работает, вот исправленные кусочки:
Код:
For $x2 = 200 To $x1 Step -6
Код:
If Not @error Then
Правда и в этом случае скан по экрану идет горизонтальной узкой полоской, из за чего получается сложно попасть на пиксель. Я добавил девиацию(вверх-вниз). Комментарии делал на основе своих знаний радиоэлектроники, и небольшого опыта программирования в CodeSys. Мне интересно было разобраться. Но предполагаю, что так она и работает PixelSearch. Если я где-то не прав, пусть меня поправят знающие люди.

Код:
; Найти чисто красный пиксель в выделенной области
WinSetState("красный квадрат", "", @SW_MAXIMIZE)
WinWaitActive("красный квадрат")
;									    ___Top____
;									   |		  |
;Наглядная работа сканера: Stop граница|100<---200|граница Start
;									   |__________|
;										  Bottom
;На экране с помощью переменных $x_Start, $x_Stop, $y_Top, $y_Bottom создается выделенная область, своего рода песочница, где нужно искать пиксель.
;и динамически попиксельно снизу вверх, и справа налево функция PixelSearch считывает данные из выделенной области. 
;В данном случае с нижеприведенными параметрами, прямоугольник-ограниченная область поиска создается в верхнем левом углу экрана компьютера.
;Если по мере работы скрипта в этой выделенной области оказывается искомый пиксель, 
;на экран выводится сообщение о его координатах.
$x_Start = 200; Параметр начала горизонтального сканирования <---200
$x_Stop = 100; Параметр конечной точки горизонтального сканирования 100<---
$y_Top = 50; Верх (размах по вертикали)
$y_Bottom = 90; Низ (размах по вертикали)

For $x_Start = 200 To $x_Stop Step -1 ;вычитающий счетчик, изменяет по мере функционирования переменную $x_Start для работы функции PixelSearch
   $var = PixelSearch($x_Stop, $y_Top, $x_Start, $y_Bottom, 0xFF0000);функция поиска нужного цвета
If Not @error Then;если нет ошибок и искомый пиксель найден, передаем двухэлементный массив с его координатами в переменные ($var[0] = x, $var[1] = y). 
   ;mouseMove($coord[0] & "," & $coord[1],3);наведение курсора мышки без клика(для настройи)
    MouseClick("left", $var[0], $var[1], 1, 10);клик левой кнопкой мыши по найденной области
   ;MsgBox(0, "X и Y равны:", $var[0] & "," & $var[1]);вывод на экран сообщения с координатами найденного пикселя 
 ExitLoop;выход из цикла
   EndIf
Next


Осталось добавить в мой первый скрипт этот или еще предложенные ---Zak--- и Dellroc кусочки кода и все должно заработать.
Думаю тему можно считать решенной, всем еще раз спасибо за помощь!
 
Верх