Известный факт: мультиспектральные сканеры — одно из самых надежных средств для защиты от мошенников при оказании финансовых и других услуг. Они уже давно установлены в пограничных службах, используются в ФНС и других организациях. Тем не менее, случаи, когда мошенники по фальшивым документам, например, открывают счета в банках, не редки. 

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

Сканеры (в том числе мультиспектральные) не являются самодостаточными устройствами, требуя подключения к рабочим станциям и интеграции с информационной системой, естественно посредством API. И если для традиционных сканеров существуют стандарты (WIA, TWAIN, SANE и т.п.), что позволяет использовать их по принципу “купил-подключил-пользуешься”, то с мультиспектральными сканерами оказывается все сложнее - у каждого производителя свой драйвер и свое API. Обычно с каждым сканером поставляется SDK, внутри которого представлена инструкция по интеграции на некоторых популярных языках программирования. Это предложение содержит сразу несколько “вибрирующих” моментов:

  • Слова “интеграции” и “программирования” твердо подводят нас к мысли, что придется (долго) программировать, прежде чем удастся запустить сканер… А может быть даже потребуется привлекать для этой задачи отдельно взятого программиста…

  • Фрагмент “на некоторых популярных языках” вообще порождает сомнения в том, что удастся найти внутри SDK такой способ интеграции, который поддерживается целевой информационной системой…

Интероперабельность API и причем тут REST?

Оказывается, что API - программный инструмент, который предназначается для обеспечения легкой функциональной совместимости различных программных модулей, на практике не всегда такой легкий и такой совместимый (интероперабельный). Более того, когда приступаешь к процессу интеграции, то наталкиваешься на дополнительную кучу “подводных” камней (проблем):

  • проблемы совместимости стандартов экспорта функций и других программных сущностей;

  • проблемы несоответствия форматов входных и выходных данных;

  • вопросы обеспечения безопасности данных и т. п.

Во всем мире разработчики долго стремились создать универсальный и удобный API, который позволял бы различным системам легко взаимодействовать друг с другом. Эти усилия включали разработку различных стандартов и технологий, таких как COM (Component Object Model), CORBA (Common Object Request Broker Architecture) и SOAP (Simple Object Access Protocol). Однако ни одна из этих технологий не смогла предложить идеальный баланс простоты, гибкости и производительности.

В начале 2000-х годов Рой Филдинг, один из соавторов спецификации HTTP, предложил новый подход к созданию API в своей диссертации, озаглавленной "Architectural Styles and the Design of Network-based Software Architectures". Он описал архитектурный стиль, известный как Representational State Transfer (REST), который основывался на принципах простоты, масштабируемости и использования стандартных HTTP-методов.

Не будем в этой статье сильно вдаваться в основные принципы REST, а только лишь концептуально перечислим почему REST API стал столь популярным.

  1. Интероперабельность. REST API обеспечивает взаимодействие различных систем независимо от используемых технологий и языков программирования.

  2. Производительность. REST API использует легковесный протокол передачи данных, что обеспечивает эффективное функционирование приложений даже при большом количестве запросов.

  3. Гибкость и масштабируемость. REST API поддерживает создание масштабируемых и гибких систем, которые могут быстро адаптироваться к изменениям в бизнес-логике и требованиям клиентов.

  4. Безопасность. REST API позволяет при необходимости внедрять различные механизмы безопасности, включая аутентификацию, авторизацию и шифрование данных, что обеспечивает защиту от несанкционированного доступа.

  5. Простота. REST API предоставляет удобный и интуитивно понятный интерфейс для работы с данными, что значительно облегчает процесс разработки и интеграции приложений.

А что по поводу распространенности REST API?

Благодаря своей простоте (действительно, вызвать через REST API функцию не сложнее, чем вбить в адресную строку браузера адрес сайта) REST API стал де-факто стандартом во всех популярных информационных системах.

Платформа 1С

Платформа содержит обширный инструментарий по отправке HTTP запроса и парсинга JSON-результата. Как и все в 1С, наименование соответствующих классов очень “говорящие”.

СтруктураURI = СтруктураURI(ПолныйАдресРесурса); 
HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост, СтруктураURI.Порт); 
HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере); 
Результат =  HTTPСоединение.Получить(HTTPЗапрос);
...
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоРезультата);
...

JavaScript (базовый язык большинства систем)

JavaScript предлагает несколько методов для взаимодействия с REST API, но самым популярным и широко используемым является метод fetch(). В данном контексте fetch() представляет собой функцию, которая позволяет осуществлять асинхронные HTTP-запросы к серверу и работать с REST API.

/*jshint esversion: 6 */

fetch('https://api.example.com/items')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Ошибка:', error));
...

В этом коде вызывается fetch() с URL-адресом REST API, затем обрабатывается ответ от сервера и преобразуется в JSON, и затем выводится полученные данные.

Python с его ежедневно растущей популярностью

Чтобы сделать GET запрос достаточно импортировать requests и выполнить requests.get

import requests
r =  requests.get('https://xkcd.com/353/')
...

No-code интеграция с помощью RPA

Самое интересное, как раз то, ради чего задумывалась статья. Мы уже увидели, что больших талантов и объемных листингов кода программиста не надо, чтобы интегрировать внешнюю функциональность с помощью REST API. Но оказывается, что можно вообще без написания кода! И делается это с помощью RPA (Robotic Process Automation) систем, которые последнее время становятся штатным инструментом фактически любой современной операционной системы.

RPA-системы с помощью программных роботов не только имитируют действия человека, работая с пользовательскими интерфейсами программ, но и умеют вызывать REST API функции с последующим парсингом JSON-результата. Для этого у RPA-систем есть специальные действия. На примере Microsoft Power Automate (входит в состав современных версий Microsoft Windows) это “Вызвать веб-службу” и “Преобразовать JSON в настраиваемый объект”.

Первое действие “Вызвать веб-службу”, как следует из названия, обращается к REST службе и сохраняет ответ в служебной переменной.

Второе действие “Преобразовать JSON в настраиваемый объект” преобразует тело ответа из формата в JSON в переменные, с которыми умеет обращаться RPA-система.

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

Интеграция сканера с помощью REST API

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

Сканер ПС4-02 обеспечивает проверку признаков подлинности российского паспорта сразу в трех диапазонах – оптическом, инфракрасном и ультрафиолетовом, а встроенный искусственный интеллект распознает персональные данные и выявляет подделки, муляжи документов и документы с переклеенной фотографией, проверяя десятки различных признаков подлинности – например, аутентичность бланка, наличие защитных волокон, соответствие используемых шрифтов, корректность машиночитаемой зоны MRZ, признаки фальсификации штампов и печатей и многие другие.

К столь обширному функционалу теперь добавился удобный способ интеграции REST API. Мы реализовали его таким образом, чтобы предоставить клиентам максимально простой вызов основных функций. Так, чтобы получить список подключенных сканеров, достаточно направить следующий GET-запрос:

http://localhost:12345/api/mssrest/scanner/list

А чтобы запустить процесс сканирования, распознавания и проверки подлинности паспорта необходимо отправить следующий POST-запрос (здесь %scannerID% - это идентификатор подключенного сканера):

http://localhost:12345/api/mssrest/scanner/%scannerID%/scan_recognize?mode=anydoc&doc_type=*&ret_scan_res=true

В качестве результата возвращается JSON-документ, содержащий результаты распознавания:

{
  "status": "ok",
  "response": {
    "recog_res": {
      "image_fields": {
        "photo": {
          "attributes": {
            "best_photo_frame_idx": "0",
            "processed_photos_number": "1"
          },
          "confidence": 1,
          "is_rejected": false,
          "quad": "coordinates of the corners of the photo in the image",
          "value": "jpeg photo of the document owner received from the document scan in base64 format"
        }
      },
      "match": {
        "match_results_received": 1,
        "templates": {
          "xxx.passport.biometric:main": {
            "attributes": {
              "DPI": "651",
              "fully_presented": "false",
              "n90CCWrotations": "0"
            },
            "confidence": 1,
            "frame_index": 0,
            "is_rejected": false,
            "template_quad": "coordinates of the corners of the document template in the image",
            "template_size": "document template size",
            "template_transform": "matrix of the projective transformation"
          }
        }
      },
      "props": {
        "name": {
          "attributes": {
            "finger_is_found": "false",
            "mono_score": "-1.5",
            "serif": "false"
          },
          "confidence": 1,
          "is_rejected": false,
          "value": "name of the document owner"
        },
        "birth_date": {
          "attributes": {
            "finger_is_found": "false",
            "mono_score": "-1.5",
            "raw_date_format": "DDMMYYYY"
          },
          "confidence": 1,
          "is_rejected": false,
          "value": "birth date"
        },
        "check_0000000000001": {
          "confidence": 1,
          "is_rejected": false,
          "value": "passed"
        },
        "check_0000000000002": {
          "confidence": 1,
          "is_rejected": false,
          "value": "failed"
        },
        "full_mrz": {
          "attributes": {
            "control_digit_check": "passed",
            "is_rotated": "0",
            "ocrb": "true",
            "serif": "false"
          },
          "confidence": 1,
          "is_rejected": false,
          "value": "full mrz string"
        },
        "mrz_name": {
          "attributes": {
            "should_integrate": "true"
          },
          "confidence": 1,
          "is_rejected": false,
          "value": "name of the owner received from the full mrz string"
        },
        "mrz_birth_date": {
          "attributes": {
            "control_digit_check": "passed",
            "raw_date_format": "YYMMDD"
          },
          "confidence": 1,
          "is_rejected": false,
          "value": "birth date received from the full mrz string"
        }
      },
      "type": "xxx.passport.biometric"
    },
    "scan_res": {
      "ir": "jpeg image of a scanned document in infrared light in base64 string format",
      "uv": "jpeg image of a scanned document in ultraviolet light in base64 string format",
      "vis": "jpeg image of a scanned document in visible light in base64 string format"
    }
  }
}

Собственно, перейдем к интеграции. Сделаем ее без программирования, с помощью Microsoft Power Automate. Рассмотрим модельный случай, когда нам надо отсканировать документ, проверить его на подлинность и сохранить результат (текстовый и изображения страницы документа в трех диапазонах) в Microsoft Word. Технически, у нас получился процесс, состоящий из 20 действий.

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

  1. Получение списка подключенных сканеров

  2. Считывание паспорта

  3. Конвертация и анализ полученных текстовых результатов

  4. Конвертация полученных изображений страницы паспорта

  5. Запуск Microsoft Word

  6. Запись в документ текстовых значений полей документа

  7. Запись в документ решения о подлинности документа

  8. Вставка в документ изображений страницы паспорта

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

Вместо заключения

Чтобы не быть голословным в своих размышлениях о легкости REST API, мы провели модельный эксперимент: попросили нашего директора по продажам (по специальности - экономист) интегрировать наш мультиспектральный сканер со своим MacBook Pro (естественно!). С помощью Shortcuts, краткого Quick Start к нашему REST API, содержащему список основных HTTP-запросов, за два часа он успешно вывел результат распознавания и проверки паспорта подлинности в Pages. Сами понимаете, что теперь ни один клиент не может убедить его в сложности интеграции мультиспектрального сканера.

Комментарии (0)