Некоторое время назад Facebook стал использовать решение основанное на NFS для хранения фотографий пользователей. Оно помогает справляться с напором в около 220 миллионов новых файлов занимающих 25TB каждую неделю и в часы пик раздающее более 550 тысяч изображений в секунду [1]. Максимальное количество файлов загружаемых в один альбом было увеличено с 60 до 200 на радость пользователям.
Наличие настроек приватности и то обстоятельство, что свободное место на Picasa благополучно было съедено шедеврами прошлых лет, подтолкнуло меня и некоторых знакомых к попытке использования Facebook в качестве фотохранилища.
Практика, однако, выявила некоторые неудобства сервиса, самым досадным из которых оказалась невозможность удаления альбома после загрузки в него множества фотографий. Всем, кого затронула эта проблема и кому любопытен очередной пример использования замечательного кроссплатформенного инструмента визуальной автоматизации Sikuli посвящается эта статья.
Replication scenario был таким:
Bug Report был отправлен более месяца тому назад, и на момент написания статьи еще не потерял своей актуальности, судя по опыту других пользователей.
Единственным найденным методом удаления фотографий из альбома в вышеописанном состоянии оказалось использование ссылки «Delete This Photo» в окне просмотра. Удалять вручную 200 фотографий таким образом — занятие не из веселых.
Хорошие статьи zodiak [2] и KL7 [3] вдохновили на использование Sikuli.
Кратко Sikuli можно описать как визуальную технологию для автоматизации графических пользовательских интерфейсов с использованием изображений (снимков экрана). Текущая реализация Sikuli включает Sikuli Script — API визальных сценариев для Jython и Sikuli IDE — интегрированную среду разработки для написания скриптов с использованием скриншотов. С помощью Sikuli Script можно автоматизировать все что вы видите на экране без использования внутренних API. Можно программно контролировать web страницы, приложения запущенные в Windows/Linux/Mac OS X и даже приложения iPhone запущенные в эмуляторе.
Неожиданно простой скрипт автоматизации действий был «собран» и отлажен в Sikuli GUI в течение 15 минут, большая часть из которых ушла на ознакомление с документацией и поиски оптимальных визуальных паттернов уникально характеризующих элементы web страниц Facebook.

Скриншот приведен из-за своебразности синтаксиса Sikuli, включающего графику в исходниках.
Обратите внимание на 11 строку в которой имеется верхняя часть рамки картинки и пустое место слева, присутствующее только на фотографиях альбома, расположенных слева. Следует отметить, что поиск и распознавание паттернов на экране Sikuli осуществляет начиная с верхнего левого угла, таким образом в нашем случае в альбоме выбирается первая верхняя картинка слева.
Функция щелчка мыши на найденном изображение click() осуществляет нажатие в геометрическом центре заданной области. Увеличивая площадь искомого паттерна в скрипте можно снизить вероятность ошибочных распознований на схожих элементах интерфейса.
Документация также подсказывает, что для увеличения быстродействия скрипта можно ипользовать точную настройку параметра MinTargetSize:
Английские титры вставлены ради людей не владеющих великим и могучим.
Скачать скрипт можно тут.
NB! Скорее всего, придется изменить имя браузера, сочетания клавиш и время ожидания между коммандами под вашу среду.
Интересно, из GUI скрипты на диск сохраняются в папках или zip-архивах (при экспорте в исполняемый формат) с вложенными *.png картинками, исходником на python и html-страницей со встроенным CSS для подсветки кода, при открытии которой в броузере отображается код со вложенной графикой.
Sikuli позволил решить проблему, возможно, не самым элегантным, но достаточно эффективным образом, при этом сохранив время и вдохновив на написание настоящей статьи.
Узнать больше, скачать и установить Sikuli для Linux, Windows и Mac OS X можно на официальном сайте проекта http://sikuli.org.
Наличие настроек приватности и то обстоятельство, что свободное место на Picasa благополучно было съедено шедеврами прошлых лет, подтолкнуло меня и некоторых знакомых к попытке использования Facebook в качестве фотохранилища.
Практика, однако, выявила некоторые неудобства сервиса, самым досадным из которых оказалась невозможность удаления альбома после загрузки в него множества фотографий. Всем, кого затронула эта проблема и кому любопытен очередной пример использования замечательного кроссплатформенного инструмента визуальной автоматизации Sikuli посвящается эта статья.
Суть проблемы
Replication scenario был таким:
- Используя форму загрузки с помощью drag-and-drop вбрасываем фотографии в новый альбом в количестве превышающем 200.
- После загрузки двух сотен фотографий процесс прерывается сообщением об ошибке.
- Попытка удалить альбом через «Edit Album»-«Delete Album» завершается ошибкой.
- Удаление фотографии через «Edit Album»-«Edit Photos»-«Delete»-«Save changes» также не работает.
Bug Report был отправлен более месяца тому назад, и на момент написания статьи еще не потерял своей актуальности, судя по опыту других пользователей.
Поиск решения и реализация
Единственным найденным методом удаления фотографий из альбома в вышеописанном состоянии оказалось использование ссылки «Delete This Photo» в окне просмотра. Удалять вручную 200 фотографий таким образом — занятие не из веселых.
Хорошие статьи zodiak [2] и KL7 [3] вдохновили на использование Sikuli.
Кратко Sikuli можно описать как визуальную технологию для автоматизации графических пользовательских интерфейсов с использованием изображений (снимков экрана). Текущая реализация Sikuli включает Sikuli Script — API визальных сценариев для Jython и Sikuli IDE — интегрированную среду разработки для написания скриптов с использованием скриншотов. С помощью Sikuli Script можно автоматизировать все что вы видите на экране без использования внутренних API. Можно программно контролировать web страницы, приложения запущенные в Windows/Linux/Mac OS X и даже приложения iPhone запущенные в эмуляторе.
Неожиданно простой скрипт автоматизации действий был «собран» и отлажен в Sikuli GUI в течение 15 минут, большая часть из которых ушла на ознакомление с документацией и поиски оптимальных визуальных паттернов уникально характеризующих элементы web страниц Facebook.

Скриншот приведен из-за своебразности синтаксиса Sikuli, включающего графику в исходниках.
Обратите внимание на 11 строку в которой имеется верхняя часть рамки картинки и пустое место слева, присутствующее только на фотографиях альбома, расположенных слева. Следует отметить, что поиск и распознавание паттернов на экране Sikuli осуществляет начиная с верхнего левого угла, таким образом в нашем случае в альбоме выбирается первая верхняя картинка слева.
Функция щелчка мыши на найденном изображение click() осуществляет нажатие в геометрическом центре заданной области. Увеличивая площадь искомого паттерна в скрипте можно снизить вероятность ошибочных распознований на схожих элементах интерфейса.
Документация также подсказывает, что для увеличения быстродействия скрипта можно ипользовать точную настройку параметра MinTargetSize:
from org.sikuli.script.natives import Vision
Vision.setParameter("MinTargetSize", 6) # Меньшее значение, например, 6 - увеличивает скорость обработки.
Vision.setParameter("MinTargetSize", 18) # Большее значиение, например 18 - увеличивает надежность.
Демонстрация работы
Английские титры вставлены ради людей не владеющих великим и могучим.
Скачать скрипт можно тут.
NB! Скорее всего, придется изменить имя браузера, сочетания клавиш и время ожидания между коммандами под вашу среду.
Интересно, из GUI скрипты на диск сохраняются в папках или zip-архивах (при экспорте в исполняемый формат) с вложенными *.png картинками, исходником на python и html-страницей со встроенным CSS для подсветки кода, при открытии которой в броузере отображается код со вложенной графикой.
Заключение
Sikuli позволил решить проблему, возможно, не самым элегантным, но достаточно эффективным образом, при этом сохранив время и вдохновив на написание настоящей статьи.
Узнать больше, скачать и установить Sikuli для Linux, Windows и Mac OS X можно на официальном сайте проекта http://sikuli.org.