Бот-Кассир На Pywinauto Или Автоматизация Графического Интерфейса Для Платежного Шлюза

Я работаю в небольшом израильском стартапе, наш продукт — платформа для заказа еды из ресторанов, кафе и магазинов.

В отличие от десятков подобных сервисов, мы монополисты на студенческом рынке США.

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

pywinauto .

Во-первых, почему мы работаем только в университетах? Многие идеи часто выглядят хорошо только в перспективе.

Например, та же идея доставки еды.

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

Пока в приложении мало ресторанов, это бессмысленно; и пока пользователей мало, рестораны не спешат интегрировать новое приложение в свой рабочий процесс.

Обычно в этот момент все умирает. Эта ситуация не уникальна для приложений для заказа еды.

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

Например, Вейз.

Теперь это приложение, которое знает обо всех пробках, авариях и полиции на дороге, но начиналось оно как бесплатное GPS-приложение, которым мог бы воспользоваться каждый.

Есть и другие решения, и об одном из них я расскажу на нашем примере.

Столкнувшись с этой проблемой, нас ждала та же участь.

Мы достаточно безуспешно пытались проникнуть на рынок Сан-Франциско, полный подобных решений, и, прежде чем тихо умереть, решили попробовать еще одну идею.

Он заключался в том, чтобы договориться не со всеми ресторанами, а только с определенной платформой, имеющей рычаги влияния на местный бизнес.

Выбор пал на университеты.

Предлагая процент от дохода и обслуживание для студентов, мы были отличным предложением для университета; проблемы местных ресторанов, связанные с интеграцией нового приложения в их бизнес-процесс, их не интересовали; для них мы были прямой и косвенной выгодой.

Они потребовали от предприятий на территории кампуса использовать наше приложение.

Мы интегрировались во все рестораны кампуса — наше приложение стало очень удобным для студентов: они могли заказывать обед во время лекций и не ждать заказа на переменах.

Мы мгновенно захватываем большую часть кампуса, и вирусный эффект очень велик.

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

В какой-то момент у нас возникла проблема.

Дело в том, что в Америке очень сложно получить кредитную карту, а у большинства студентов ее нет. С другой стороны, студенческие билеты выдаются в виде пластиковых карт с магнитной полосой и являются средством оплаты внутри кампуса.

Университет присуждает им что-то вроде стипендии.

Эти средства более структурированы: есть отдельные части, которые можно тратить свободно, а есть средства только на еду.

И эти карты принимаются только на территории кампуса.

Нам, как компании, которая работает со студентами, конечно же хотелось обслуживать эти карты.

Но это не так просто.

Компания, выпускающая эти карты, не является банком.

Рынок обслуживания студенческих билетов практически монополизирован и разделен между тремя компаниями из сотен университетов по всей Америке.

Одна из таких компаний попыталась запустить сервис, аналогичный нашему, и, проиграв конкуренцию, в лучших традициях песчаных платформ «обиделась» и отказалась вести с нами какое-либо сотрудничество.

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

Это очень удобно для всевозможных киосков и колбасных магазинов.

Но Queuing API не обязан предоставляться по контракту, и нам его открывать не захотели.

Мне пришлось работать с тем, что у меня было.

В результате мы нашли довольно необычное решение для платежного шлюза, который в первые несколько месяцев существования достаточно успешно работает в 6 университетах: были проведены десятки тысяч транзакций на сотни тысяч долларов, а в последующие В течение учебного года данное решение будет масштабировано на несколько десятков американских университетов с оборотом средств в десятки миллионов долларов.



Как это работает?

О нашем решении.

Должен отметить, что нам было очень важно найти решение, которое было бы абсолютно законным.

Например, обратное проектирование является незаконным; перехват трафика и имитация фронтенда этого кассового терминала тоже могут быть проблематичными, но автоматизация кликов по десктопному приложению абсолютно легальна.

В кампусе нам выделяют виртуальную машину на Windows с установленным десктопным кассовым приложением.

Там же установлена связка Flask + Tornado. Когда пользователь делает заказ с телефона, на виртуальную машину отправляется запрос со всеми необходимыми параметрами: суммой, номером студенческого билета и т.д. Дальнейшее использование pywinauto вводим сумму, номер карты, все необходимые параметры (там достаточно сложная логика в плане скидок, бесплатных обедов в определенное время суток и т. д.).

Проводим транзакцию, проверяем результат и возвращаем ответ серверу.

Обработка одной транзакции изначально занимала около 20 секунд, но со временем сократилась до 3. В ходе профилирования были выявлены некоторые особенности библиотеки.

Вызовы Application().

Connect() для подключения к приложению имеют множество различных параметров, и, например, идентификация приложения или окна по имени_класса происходит в 20 раз быстрее, чем по названию_re (регулярному выражению заголовка окна).

Второй неожиданностью было то, что если окно еще не открылось, то вызов Connect() занимает много времени (до нескольких секунд), прежде чем выдать исключение.

Его не следует вызывать, не будучи уверенным, что окно уже открыто; лучше найти эвристическую модель, которая позволит понять, что звонок будет успешным.

В моем случае при открытии нового окна основная форма заявки перестала быть «активной»; это можно было поймать, вызвав form.WaitNot('active'), после чего после возврата можно смело вызывать Connect().

Еще одна проблема, с которой мы столкнулись: автоматизация через Win32 API не работает без открытой сессии пользователя на машине.

Это общая проблема всех подобных инструментов.

Например, в библиотеке pywinauto Методы ClickInput и TypeKeys не работают, если сеанс заблокирован или соединение RDP закрыто.

Это было мое первое знакомство с автоматизацией GUI и Win32 API, поэтому решение проблемы могло занять много времени.

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

василий врябов .

Выражаю ему глубокую благодарность за подробные консультации.

Мы нашли решение всех проблем; в принципе многие вопросы решались альтернативными звонками.

Например, когда мы столкнулись с нестандартным виджетом переключения вкладок в приложении, который не реагировал ни на один стандартный вызов, решение было найдено путем анализа сообщений Windows в Spy++ и отправки тех же сообщений с помощью метода PostMessage в pywinauto .

Библиотека активно развивается и, как показала практика, достаточно стабильна, чтобы ее можно было использовать даже в продакшене для реализации платежного шлюза.

Практически все проблемы, связанные с уменьшением функционала при отсутствии сессии, будут решены в следующем релизе (0.6.0), который готовится к выпуску в этом году (ветка UIA на GitHub).

Например, метод send_chars позволит вам успешно отправить практически любую комбинацию символов в неактивное или даже свернутое окно.

И самое главное, в ветке МАУ есть поддержка технологии Microsoft UI Automation (для WinForms, WPF, StoreApps, Qt и браузеров), но это тема отдельной статьи.

Если вы считаете, что реализация платежного шлюза путем автоматизации GUI – это не верх сюрреализма, то могу добавить, что в одном из университетов Техаса действуют очень строгие ограничения на доступ к внутренней сети, поэтому разверните, отладьте и обновите модуль, который обрабатывает десятки тысяч платежей, которые люди происходят в скайпе — «Теперь напиши git fetch» — и все в таком духе.

Кстати, наш аптайм > 99,6%.

Спасибо pywinauto ).

Теги: #pywinauto #win32 api #автоматизация #открытый код #платёжные системы #python #программирование #разработка для Windows

Вместе с данным постом часто просматривают: