Документация
VeriDoc WEB API

RECOGNITION_URL=https://www.verigram.kz/ru/veridoc/

YOUR_USER='your_username'

YOUR_PASS='your_password'

DOCUMENT_TYPE=1    # for identity card documents


response=$(curl $RECOGNITION_URL \

  -F username=$YOUR_USER \

  -F password=$YOUR_PASS \

  -F "image=@/path/to/image" \

  -F image_id=1 -F doc_type=$DOCUMENT_TYPE \

  -F biggerImage=true)


echo $response


LOGIN_URL=https://www.verigram.kz/ru/veridoc/login/

RECOGNITION_URL=https://www.verigram.kz/ru/veridoc/

YOUR_USER='username'

YOUR_PASS='password'

COOKIES=cookies.txt

DOCUMENT_TYPE=1    # for identity card documents


CURL_BIN="curl -s -c $COOKIES -b $COOKIES -e $LOGIN_URL"


$CURL_BIN $LOGIN_URL > /dev/null

DJANGO_TOKEN="csrfmiddlewaretoken=$(grep csrftoken $COOKIES | sed 's/^.*csrftoken\s*//')"


$CURL_BIN -d "$DJANGO_TOKEN&username=$YOUR_USER&password=$YOUR_PASS" \

$LOGIN_URL


echo "Request started ..."

response=$(curl \

-b $COOKIES $RECOGNITION_URL \

-F "image=@/path/to/image" -F image_id=1 -F doc_type=$DOCUMENT_TYPE \

-F biggerImage=true)

echo $response

               

  • "image=@/path/to/image" - путь к изображению на локальном компьютере.

  • image_id – номер распознаваемого изображения (всегда равен 1).

  • doc_type – номер типа документа (1 - удостоверение личности, 17 - водительские права, 20 - техпаспорт автомобиля, 28 - МРЗ зона).

  • biggerImage – флаг для обозначения полного распознавания (всегда true).

  • username – имя пользователя.

  • password – пароль для этого пользователя.


Successful response:

HTTP/1.1 200 OK

{

"last_name": "ИВАНОВ", // All uppercase

"first_name": "ИВАН",

"middle_name": "ИВАНОВИЧ",

"birth_date": "31011999", // DDMMYYYY

"iin": "990131600046",

"face_picture": "...",    // base64 encoded jpeg image

"signature_picture": "..." // base64 encoded jpeg image

}


Unsuccessful response:

HTTP/1.1 400

{

"error": "..." // error message

}



Successful response:

HTTP/1.1 200 OK

{

"id_number": "037462607",

"birth_place": "АЛМАТЫ",

"nationality": "КАЗАХ",

"issuer": "МВД РЕСПУБЛИКИ КАЗАХСТАН",

"issue_date": "20012015",

"due_date": "19012025"

}



{

"id_number": "ASNE00З81З96",

"registration_number": "7ЗЗYHAO2", 

"brand": "BKИVV52ЗI",

"issue_date": "2014",

"category": "B, C, B1",

"vin_number": "VVBALPЗ100AC5012З2", 

"body": "VVBALPЗ100AC5012З2", 

"chassis": "",

"manufacturer": "Зарубежное", 

"color": "Белый Металлик", "engine_capacity": "24153", "max_weight": "2200", "weight_without_load": "1800"

}


Обратная сторона


{

"last_name": "Литтиг/Littig",

 "first_name": "Игорь Владимирович/Igor", 

"state": "Алматы", 

"district": "Ауэзовский Район", 

"locality": "г.Алматы", 

"street": "Таугуль-1", 

"house": "67", 

"apartment": "31", 

"issue_date": "26.02.2016", 

"id_number": "AS № 00328907"

}


Водительское удостоверение


{

"last_name": "ИВАНОВ", // All uppercase

"first_name": "ИВАН",

"middle_name": "ИВАНОВИЧ",

"birth_date": "31011999", // DDMMYYYY

"birth_place": "Алматы",

"issue_date": "20012015",

"due_date": "19012025",

“dia”:”ІІД АЛМАТЫ Қ.$DIA OF ALMATY”

"iin": "990131600046",

“id_number”:”AN № 789065”,

"face_picture": "...",    // base64 encoded jpeg image

}


Приложение 1

Пример запроса на языке C#:


public void reqVeri(string img) {

    // Create a http request to the server endpoint that will pick up the

    // file and file description.

    HttpWebRequest requestToServerEndpoint =

    (HttpWebRequest)WebRequest.Create("https://www.verigram.kz/ru/veridoc/");

    string boundaryString = "----SomeRandomText";

    string fileUrl = @"C:\Address\To\Document.jpg";

    // Set the http request header \\

    requestToServerEndpoint.Method = WebRequestMethods.Http.Post;

    requestToServerEndpoint.ContentType = "multipart/form-data; boundary=" + boundaryString;

    requestToServerEndpoint.KeepAlive = true;

    requestToServerEndpoint.Credentials = System.Net.CredentialCache.DefaultCredentials;

    // Use a MemoryStream to form the post data request,

    // so that we can get the content-length attribute.

    MemoryStream postDataStream = new MemoryStream();

    StreamWriter postDataWriter = new StreamWriter(postDataStream);

   

    // Include value from the myFileDescription text area in the post data

    postDataWriter.Write("\r\n--" + boundaryString + "\r\n");

    postDataWriter.Write("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}",

    "username",

    "ВАШ ЛОГИН");

    postDataWriter.Write("\r\n--" + boundaryString + "\r\n");

    postDataWriter.Write("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}",

    "password",

    "ВАШ ПАРОЛЬ");

    postDataWriter.Write("\r\n--" + boundaryString + "\r\n");

    postDataWriter.Write("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}",

    "image_id",

    1);

    postDataWriter.Write("\r\n--" + boundaryString + "\r\n");

    postDataWriter.Write("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}",

    "biggerImage",

    true);

    postDataWriter.Write("\r\n--" + boundaryString + "\r\n");

    postDataWriter.Write("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}",

    "doc_type",

    "1"); // change doc_type to needed number

    // Include the file in the post data

    postDataWriter.Write("\r\n--" + boundaryString + "\r\n");

    postDataWriter.Write("Content-Disposition: form-data;"

    + "name=\"{0}\";"

    + "filename=\"{1}\""

    + "\r\nContent-Type: {2}\r\n\r\n",

    "image",

    Path.GetFileName(fileUrl),

    Path.GetExtension(fileUrl));

    postDataWriter.Flush();

    // Read the file

    FileStream fileStream = new FileStream(fileUrl, FileMode.Open, FileAccess.Read);

    byte[] buffer = new byte[1024];

    int bytesRead = 0;

    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)

    {

        postDataStream.Write(buffer, 0, bytesRead);

    }

    fileStream.Close();

    postDataWriter.Write("\r\n--" + boundaryString + "--\r\n");

    postDataWriter.Flush();

   

    requestToServerEndpoint.ContentLength = postDataStream.Length;

   

    using (Stream s = requestToServerEndpoint.GetRequestStream())

    {

        postDataStream.WriteTo(s);

    }

    postDataStream.Close();

   

    WebResponse response = requestToServerEndpoint.GetResponse();

    StreamReader responseReader = new StreamReader(response.GetResponseStream());

    string replyFromServer = responseReader.ReadToEnd();

}



Пример запроса на языке JavaScript на веб странице:


<!DOCTYPE html>

<html>

<head>

  <meta charset="utf-8">

  <title>Test</title>

</head>

<body>

  <form class="input-group" id="img2b64">

      <input id="inputFileToLoad" type="file" onchange="encodeImageFileAsURL();" />

  </form>


  <p id="result"><p>


  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js&quot;&gt;&lt;/script&gt;

  <script type="text/javascript">

      function encodeImageFileAsURL(cb) {

          return function(){

              var file = this.files[0];

              var reader  = new FileReader();

              reader.onloadend = function () {

                  cb(reader.result);

              }

              reader.readAsDataURL(file);

          }

      }


      $('#inputFileToLoad').change(encodeImageFileAsURL(sendRequestToVeridoc));


      function sendRequestToVeridoc(imageData) {

          const blobBin = atob(imageData.split(',')[1]);

          const array = [];

          for (let j = 0; j < blobBin.length; j += 1) {

              array.push(blobBin.charCodeAt(j));

          }

          const jpegFileBlob = new Blob([new Uint8Array(array)], {

              type: 'image/jpeg',

          });


          var form = new FormData();

          form.append('image', jpegFileBlob, 'upload.jpeg');

          form.append("username", "ВАШ ЛОГИН");

          form.append("password", "ВАШ ПАРОЛЬ");

          form.append("image_id", "1");

          form.append("biggerImage", "true");

          form.append("doc_type", "1"); // change doc_type to needed


          $.ajax({

              type: 'POST',

              data: form,

              contentType: 'multipart/form-data',

              url: 'https://verigram.kz/en/veridoc/',

              contentType: false,

              processData: false,

              success: function(data) {

                  console.log(data);

                  $('#result').text(JSON.stringify(data));

              },

              error: function(data) {

                  console.log('error');

                  $('#result').text('Error occurred');

              }

          })

      }

   </script>

</body>

</html>



VeriDoc Mobile SDK



Работа на Android

Для встраивания в мобильные приложения на базе Android программа Veridoc
распространяется в виде .aar библиотеки. Библиотека в основное приложение встраивается в
качестве модуля и зависимость устанавливается стандартным способом, описанным в
официальной документации Android:
1. Добавьте скомпилированный файл AAR (или JAR):
  • Нажмите «Файл» -> «Создать» -> «Новый модуль».
  • Нажмите «Импорт пакетов .JAR / .AAR» и нажмите «Далее».
  • Введите местоположение скомпилированного файла AAR и нажмите «Готово».

2. Импортируйте библиотечный модуль в свой проект (источник библиотеки станет
частью вашего проекта):
  • Нажмите «Файл» -> «Создать» -> «Импортировать модуль».
  • Введите местоположение каталога библиотечного модуля и нажмите «Готово».

3. Убедитесь, что библиотека указана в верхней части файла settings.gradle:

include ':app', ':veridoc-module'


4. Откройте файл build.gradle модуля приложения и добавьте новую строку в блок
зависимостей, как показано в следующем фрагменте:

dependencies {
...
implementation "com.google.android.gms:play-services-tasks:17.2.0"
implementation project(":veridoc-module")
...
}
5. Кликните по кнопке «Синхронизировать проект» с файлами «Gradle»
В данной версии андроид библиотеки VeriDoc, перед использованием модуля нужна начальная
инициализация. Для этого нужно вызвать статическую функцию инициализации до того как
откроется Activity содержащее библиотеку VeriDoc. Пример вызова функции инициализации
( VeridocInitializer.init(); ) показан ниже:
import android.content.Intent; import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import androidx.appcompat.app.AppCompatActivity;
import kz.verigram.veridoc.sdk.model.DocumentType;
import kz.verigram.veridoc.sdk.VeridocInitializer;

public class DocumentSelectionActivity extends AppCompatActivity {

                       private Button mIdButton;

                       @Override
                        protected void onCreate(Bundle savedInstanceState) {
                                       super.onCreate(savedInstanceState);
                                       setContentView(R.layout.activity_document_selection);

                                       mIdButton = findViewById(R.id.idButton);

                                       mIdButton.setOnClickListener(new View.OnClickListener() {

                                                     @Override
                                                      public void onClick(View view) {
                                                              startMainActivity();
                                                      }
                                       });

                        }

                        private void startMainActivity() {
                                      VeridocInitializer.init();

                                       Intent intent = new Intent(DocumentSelectionActivity.this,
MainActivity.class);
                                        startActivity(intent);
                        }
}


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

   Пример использования библиотеки с Activity:

##################################################################
## activity_main.xml #################################################
##################################################################
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&quot;
     xmlns:tools="http://schemas.android.com/tools&quot;
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".MainActivity">
<kz.verigram.veridoc.sdk.ui.CameraCaptureComponent
     android:id="@+id/camera_capture_component"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@android:color/black" />
</RelativeLayout>
###########################################################################
## MainActivity.java ###########################################################
###########################################################################
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import java.util.HashMap;
import java.util.ArrayList;

import kz.verigram.veridoc.sdk.dependency.ICameraCaptureListener;

import kz.verigram.veridoc.sdk.model.DocumentType;
import kz.verigram.veridoc.sdk.model.Language;
import kz.verigram.veridoc.sdk.model.RecognitionMode;
import kz.verigram.veridoc.sdk.model.RecognitionWarning;
import kz.verigram.veridoc.sdk.ui.CameraCaptureComponent;

public class MainActivity extends AppCompatActivity
{
    CameraCaptureComponent mCameraCaptureComponent;

    // Для хранения результата распознавания
    public static HashMap<String, String> recognition_result;
    public static ArrayList<RecognitionWarning> recognition_warnings;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Получение ссылки на компонент
        mCameraCaptureComponent = findViewById(R.id.camera_capture_component);

        // Режим распознавания (двусторонний режим работает только для удостоверений и ВНЖ)

    mCameraCaptureComponent.setRecognitionMode(RecognitionMode.TWO_SIDED_DOCUMENT);

        // Тип искомого документа
        mCameraCaptureComponent.setDocumentType(DocumentType.IDENTITY_DOCUMENT);
        // Для установки определенного языка интерфейса
        mCameraCaptureComponent.setLanguage(Language.RU);

        // ICameraCaptureListener должна быть передана компоненту до того как вызовется ‘start()’
        mCameraCaptureComponent.setCameraCaptureListener(captureListener);
    }

    private ICameraCaptureListener captureListener = new ICameraCaptureListener()
    {
        // Основной слушатель событий успешного распознавания документа. Результат возвращается в виде
        // словаря, где ключом являются стандартные поля документа (Фамилия, Имя, т.д.) и в значении
        // сохранено распознанное поле.
           @Override
            public void onSuccessCallback(HashMap<String, String> result)
            {
                 recognition_result = result;

                  // получение предупреждений в случае необходимости их обработки
                  recognition_warnings = mCameraCaptureComponent.getRecognitionWarnings();

                  Intent intent = new Intent(getApplicationContext(),
CameraCaptureResultsActivity.class);
                  startActivityForResult(intent, 0);
             }

    // Слушатель событий не успешного распознавания документа или ошибки разрешения на камеру
   @Override
        public void onErrorCallback(HashMap<String, String> result)
        {
            // Do whatever needed with error information and incorrectly recognized data

            recognition_result = result;

            Intent intent = new Intent(getApplicationContext(),
CameraCaptureResultsActivity.class);
            startActivityForResult(intent, 0);
         }

     // Слушатель промежуточных событий распознавания для логирования
    @Override
    public void onLogEventCallback(HashMap<String, String> result)
    {
        // Do whatever needed with log data
        Log.d("VeridocKernelLogs", result.toString());
    }
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Повторить попытку распознавания
mCameraCaptureComponent.retry();
}
   @Override
    protected void onResume() {
        super.onResume();

        // Вызывает инициализацию и начинается процесс распознавания
        mCameraCaptureComponent.start();
    }

    @Override
    protected void onPause() {
        super.onPause();

        // Останавливает процесс распознавания
        mCameraCaptureComponent.stop();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();

        mCameraCaptureComponent.destroy();
    }
}




Работа на iOS
Для встраивания в мобильные приложения на базе iOS программа Veridoc распространяется в
виде .xcframework пакета. Для использования фреймворк пакета (динамический), достаточно
добавить этот пакет в основной проект.

Фреймворк можно подключить в проект приложения следуя по этим шагам (XCode
Version 12.0.0 и выше)
  1. Для удобства использования копируем предоставленный фреймворк пакет (VeridocSDK.xcframework) в папку Frameworks внутри папки проекта приложения.
  2. Открываем XCode проект для приложения.
  3. Заходим в страницу конфигурации General для таргета данного приложения.
  4. Нажимаем кнопку добавления в пункте Frameworks, Libraries, and Embedded Content .
  5. В окне выбора нажимаем на кнопку Add other , внутри выбераем Add files... и указываем на фреймворк пакет, которую мы скопировали в папку Frameworks.
  6. Заходим в страницу конфигурации Build Settings и в пункт Framework Search Paths добавляем $(PROJECT_DIR)/Frameworks .
  7. Для примера использования фреймворка Veridoc, вместе с данной документацией предоставляется демо приложение.

Пример использования фреймворка:

import UIKit
import VeridocSDK

final class Demonstration: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        presentScanner()
    }

         // Call this function to show scanner
         func presentScanner() {
         let scannerViewController = VeridocScannerViewController()
         // Translition check works only for ID cards to compare with mrz_zone code (set
true only TwoSidedDocument recognition mode
          scannerViewController.isTranslitCheckNeeded = true
          // Default value for language is DEFAULT (it means system language)
          scannerViewController.language = .RU // .KZ, .EN, .DEFAULT

         // RecognitionMode
         /*
         1) TwoSidedDocument - only for IdentityDocument
         2) SingleImage - Mrz
         */
          scannerViewController.recognitionMode = .TwoSidedDocument

          // Set which type of document you want to scan:
          /*
          IdentityDocument - kaz Identity Document
          Mrz - Passport (any)
           etc.
          */
         scannerViewController.type = .IdentityDocument

         // VeridocScannerViewControllerDelegate has 4 function
         /*
         1) onSuccessCallback - when scanned successfully
         2) onErrorCallback - when any case of failure
         3) onLogEventCallback - all logs
         4) scannerSuspendedByUserAction - handle close button (X)
         */

         scannerViewController.delegate = self
         scannerViewController.modalPresentationStyle = .overFullScreen
         present(scannerViewController, animated: true, completion: nil)

     }
}

extension Demonstration: VeridocScannerViewControllerDelegate {
    func onSuccessCallback(_ result: [AnyHashable : Any]) {
    // Scanned
    }

   func onErrorCallback(_ result: [AnyHashable : Any]) {
   // Any failure
   }

   func onLogEventCallback(_ result: [AnyHashable : Any]) {
   // All logs
   }

   func scannerSuspendedByUserAction() {
   // Handle Close button
   }

}