Skip to content

Auto-confirm awaiting appointments on q.midpass.ru

Notifications You must be signed in to change notification settings

gugglegum/midpass

Repository files navigation

MidPass

Скрипт для автоматического подтверждения заявки в листе ожидания записи в российское консульство на получение загранпаспорта для граждан РФ за границей.

Оглавление

  1. Установка
    1. Использование в странах, отличных от Грузии
  2. Использование
    1. А меня не заблокируют?
    2. Скриншот
    3. Видео
  3. Предыстория
  4. Как ломалась CAPTCHA
  5. Реализация
    1. Почему каптча решается только 1 раз?
  6. Приложение 1. ID стран и учреждений для config.txt

Установка

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

  1. Скачать из раздела "Releases" архив midpass-1.0.4-win.zip (для Windows) или midpass-1.0.4-linux.tar.gz (для Linux).
  2. Распаковать в любую папку.
  3. Открыть файл config.txt и вставить в соответствующие поля свой email и пароль, под которым вы зарегистрированы на сайте q.midpass.ru. Если вы находитесь в Грузии, то больше вам ничего трогать не нужно.

Использование в странах, отличных от Грузии

Если вы находитесь не в Грузии, то дополнительно вам необходимо изменить значения полей COUNTRY_ID (страна), SERVICE_PROVIDER_ID (учреждение), а также TIMEZONE. Коды стран и учреждений можно найти в Приложении 1 в конце этого файла.

Список основных таймзон здесь. Обычно для небольших стран таймзона представляет собой вид "Регион/Столица" на английском. Например, для Армении это Asia/Yerevan, для Кипра это Asia/Nicosia, для Сербии это Europe/Belgrade. Вы можете попробовать просто угадать вашу таймзону и если вы укажете несуществующую таймозну, то скрипт просто завершится ошибкой. Таймзона лучше часового пояса, т.к. учитывает переход на летнее время и законодательные изменения. Таймзона нужна для корректного определения момента, когда открывается новый 24-часовой интервал подтверждения заявки на сайте, и она должна совпадать с часовым поясом на вашем компьютере. Но в целом, ничего страшного не случится, если временная зона будет несоответствующей вашему локальному времени — скрипт всё равно будет работать.

Использование

Просто каждый день запускать файл confirm-queue.cmd. Откроется чёрное окно консоли, в котором будет отображаться ход процесса подтверждения, обычно занимает около 10 секунд. По окончанию окно будет ожидать нажатия любой клавиши для завершения. Вся выводимая в окне информация автоматически сохраняется в файле logs/confirm-queue.log с датой и временем в начале каждой строки. Так можно будет следить за ходом выполнения, скоростью движения в очереди.

При запуске скрипт запрашивает каптчу, решает её, отправляет форму авторизации, получает в ответ сессионную куку, с этой кукой запрашивает от API список заявок в листе ожидания, смотрит в каждой заявке на поле canConfirm и если оно TRUE, то отправляет запрос на подтверждение заявки, проверяет результат, разлогинивается. Скрипт не будет пытаться подтверждать одну и ту же заявку дважды в течение одного дня.

Кроме того, поскольку предполагается, что скрипт будет запускаться не вручную, а через Планировщик заданий Windows или какой-то аналог cron, например, раз в час, в скрипте предусмотрено сохранение данных о времени последних успешных подтверждений заявок в файле temp/confirm-queue.json. Таким образом, если в рамках текущего 24-часового интервала все заявки уже подтверждены, скрипт не будет впустую логиниться на сайт и проверять список заявок. Это сделано, чтобы снизить число обращений к серверу и не привлекать лишний раз внимание частыми регулярными обращениями. Чтобы при запуске скрипта через Планировщик заданий не появлялось каждый раз чёрное окно консоли, вместо php.exe нужно использовать php-win.exe. Тогда работа скрипта будет полностью незаметной, а о его работе можно будет узнать из лог-файла.

А меня не заблокируют?

Сайт q.midpass.ru уже содержит в себе защиту от роботов, которая выявляет подозрительные запросы, блокирует вход на 1 час и высылает новый пароль на email. Правда, под действие этой защиты в основном попадают обычные люди, которые честно подтверждают всё вручную. Открытый в браузере сайт фоном отправляет запросы на сервер. Предположительно эти запросы и вызывают блокировку. Также рекомендуется явным образом разлогиниваться перед закрытием вкладки. А скрипт наоборот выполняет минимальное кол-во запросов к серверу и не триггерит блокировщик: зашёл, подтвердил, вышёл. Возможно, эта защита от роботов рассчитана в основном на какое-то централизованное подтверждение множества аккаунтов с одного IP адреса. За 3 недели испытаний скрипта у меня не было ни одной блокировки.

Также для цели маскировки, скрипт притворяется браузером Google Chrome версии 121 под Windows 10, отправляет все те же самые заголовки и куки, которые отправляет настоящий браузер. Поэтому единственный способ выявить работу скрипта на стороне сервера — это малые задержки между запросами (их можно добавить) и отсутствие скачивания сопутствующих HTML, CSS, JS файлов и картинок. Но этот способ выявления довольно ненадёжный, т.к. существуют кэширующие прокси и могут быть различные браузерные расширения, усиливающие кэширование.

Скриншот

Preview

Видео

Демонстрационное видео работы скрипта: https://disk.yandex.ru/i/IiZOWZjfQwu4UQ

Предыстория

С 2022 года я живу в Грузии. Переезд был спешным, обновить загранпаспорт не успел, переехал с истекающим через полгода загранпаспортом. Из-за наплыва эмигрантов в Грузии (и во многих других странах), чтобы попасть на подачу документов на загранпаспорт, нужно сперва отстоять электронную очередь (лист ожидания) на сайте q.midpass.ru. Начинать приходится примерно с 3200-3600 места в очереди. Причём, нужно не просто один раз встать в эту очередь, но и каждый день подтверждать актуальность своей заявки. При регулярном подтверждении заявки происходит движение к началу очереди. Те, кто подтверждают чаще, двигаются по очереди быстрее, но нельзя подтверждать чаще, чем 1 раз в сутки. Таким образом создаётся конкурентная среда, в которой те люди, которым нужно сильнее (которые чаще подтверждают), получат запись раньше тех, кому нужно не очень сильно (кто забывает подтверждать). При завершении очереди сайт предоставляет случайный слот в виде даты и времени, который нужно подтвердить в течение 24 часов или отказаться, попав обратно в очередь примерно на 400-е место.

В 2022 я ставил себе напоминания и будильники, честно подтверждал заявку каждый день в течение 3 месяцев, и в итоге благополучно получил свой паспорт. Но в 2024 я решил, что было бы неплохо получить второй загранпаспорт на случай, если один вдруг потеряется (или отберут). Благо предыдущий загранпаспорт уже закончился, и закон позволяет иметь 2 загранпаспорта. Я снова встал в лист ожидания и начал подтверждать по будильнику каждый день. Возможность подтверждения разблокируется каждую ночь в 3:00 по МСК.

В феврале 2024 из-за трудностей на работе у меня внезапно стало много свободного времени. Чтобы провести его с пользой, я решил попробовать автоматизировать этот утомительный процесс ежедневного подтверждения. Я давно обратил внимание на то, что CAPTCHA на этом сайте очень простая: буквенно-цифровой код появляется на картинке в одном и том же месте, одним и тем же шрифтом, одного и того же цвета. Первый символ всегда буква, затем всегда 5 цифр. Эта каптча буквально просится, чтобы её взломали! Сложность создают лишь цветные круги, случайно наложенные поверх символов, которые создают шум.

Примеры каптч:

CAPTCHA example CAPTCHA example CAPTCHA example CAPTCHA example CAPTCHA example CAPTCHA example

Как ломалась CAPTCHA

Это были одни из самых эмоционально насыщенных для меня дней, а точнее 2 дня, в которые я активно занимался R&D. Я мало ел, не гулял, не играл, а запоем пробовал самые безумные гипотезы, борясь за точность и крича от радости при повышении точности на каждые 0.1%.

Я начал с небольшой тестовой выборки в 10 каптч, на которых реализовал базовый алгоритм. Алгоритм перебирает алфавит, создаёт картинку каждой буквы и затем попиксельно сравнивает её с соответствующим местом в картинке с каптчей, находя суммарную разницу между пикселями. Разницу между пикселями я представил как разницу двух векторов в трехмерном пространстве RGB (кортеж из 3 чисел от 0 до 255). Разница находилась по теореме Пифагора. Потом я увеличил тестовую выборку до 100 каптч и сделал автоматический тест всей выборки, чтобы быстро понимать какие изменения ведут к улучшению, а какие к ухудшению. Все 100 каптч пришлось решить вручную. Точность решения оказалась в районе 88% — это был результат первого дня.

Второй день я посвятил повышению точности алгоритма. Я увеличил тестовую выборку до 999 каптч. Из них 100 каптч я смог решить вручную, но понял, что решить оставшиеся 799 каптч для меня слишком тяжело и нужна какая-то автоматизация на этом этапе. Поскольку у меня уже был алгоритм, который в 88% правильно решал каптчу, я использовал его, чтобы решить оставшиеся 799 каптч. Сначала я вручную проверял правильность каптч. Проверять и исправлять нечастые ошибки было гораздо быстрее, чем решать полностью самому. Но и это было недостаточно быстро, плюс оставалась вероятность пропустить ошибку. Тогда я сформировал большую картинку со всеми каптчами в виде сетки, поверх которых я нарисовал распознанные символы белым шрифтом. При правильном распознании каптчи её символы практически стирались, вместо них была лишь небольшая остаточная теневая обводка (вызванная скорее всего размытием от JPEG). И на большой картинке визуально сразу подсвечивались неправильно распознанные символы. Плюс на большой картинке гораздо легче смотреть сразу много каптч, чем листать картинку за картинкой. Так я получил 999 распознанных каптч.

Чтобы дальше повышать точность, нужно было решить проблему со шрифтом. Я перепробовал все основные шрифты. Ближе всего подходил шрифт Tahoma, но всё же некоторые символы накладывались не идеально. Например, у 4-ки горизонтальная линия была чуть ниже, чем надо. Были проблемы с буквами "m", "n", "r", "h". Тогда я решил, что вместо шрифта можно использовать заготовленные картинки с символами, взятыми из самих картинок с каптчами. Нужно было только выбрать максимально чистые символы, не зашумлённые цветными кругами. Поскольку, при переборе символов, я вычислял суммарную разницу пикселей каждого символа, мне не составило труда среди 999 каптч найти идеальные картинки всех букв и цифр. Всех, кроме буквы "z" — этот символ нигде не встречается. Похоже, что разработчики неправильно поставили условие для диапазона и один символ пропустили. Картинки символов лежат в assets/captcha/chars. Переход на картинки букв повысил точность до 93%.

Далее я снизил чувствительность алгоритма к шуму (к цветным кругам), занизив разницу для цветных пикселей. Также чтобы повысить точность различения похожих букв таких как "n" и "h", "r" и "n", "y" и "v" отличающихся одним лишь хвостиком я усилил разницу, если в исходной картинке буквы есть серый пиксель (цвет символа), а в картинке каптчи белый пиксель, или наоборот. Ещё была проблема с буквами разной ширины, из-за которой узкая буква "r" в ряде случаев именно из-за своего малого размера давала меньшую среднепиксельную разницу в условиях шума, чем "n" и "m". Пришлось повысить ценность широких букв над узкими при той же разнице. Это решило проблему. Пробовал ещё делать предварительную очистку картинки каптчи от JPEG-шума, заменяя пиксели близкие к белому на белый. Но эта идея принесла лишь ухудшение точности.

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

Класс решателя каптчи (\App\CaptchaSolver\CaptchaSolverQMidPass) нарочно выглядит несколько грязновато. В нём много закомментированных участков кода, присутствуют элементы плохих практик в лице публичных свойств (вместо геттеров), неинформативных названий методов colorDiff1() и colorDiff2(). Потому что на этапе экспериментов важнее как можно быстрее проверить гипотезу, получить результат, а не вылизывать заранее код, который возможно вообще не пригодится. Тем самым я хотел запечатлеть условно "творческий беспорядок" и момент, на котором было найдено финальное решение, до его приведения в порядок.

Реализация

Скрипт написан на языке PHP 8.0. Для простоты и легковесности, скрипт не использует никакие фреймворки. Скрипт лишь использует несколько Composer пакетов:

  • guzzlehttp/guzzle — HTTP-клиент;
  • symfony/console — вспомогательный компонент для консольных команд (с его помощью в консоли выводится цветной текст и текстовая таблица с данными по заявкам в листе ожидания);
  • monolog/monolog — логгер, используется для вывода сообщений как в консоль, так и в лог-файл;
  • nesbot/carbon — расширение класса DateTime, предоставляющее чуть больше возможностей и удобства;
  • vlucas/phpdotenv — считывает переменные окружения из файла config.txt и добавляет в текущее окружение;
  • luracast/config — предоставляет доступ к конфигам, которые в свою очередь используют переменные окружения;
  • gugglegum/retry-helper — это мой пакет, позволяющий элегантно повторять попытки выполнения действия при ошибках (с логгером, с увеличивающимися случайными задержками между попытками, с коллбэками, позволяющими гибко управлять поведением), используется для повторов в случае какой-либо ошибки сетевого уровня, ошибок на стороне сервера или при неправильном решении каптчи, но мгновенно завершает работу при фатальных ошибках типа неверного пароля или 400-ых ошибок HTTP.

Точкой входа для всех консольных скриптов является файл console.php, который получает на вход первым аргументом командной строки имя команды, и используя простейший роутер команд, вызывает объект соответствующей команды и передаёт в него простейший DI-контейнер в лице \App\ResourceManager. Роутер команд просто преобразует имя команды вида "do-some-stuff" в имя класса "DoSomeStuffCommand", этого по идее достаточно, но дополнительно в роутере явно перечисляются классы команд. Таким образом задаётся описание для команды "help", плюс статический анализ PhpStorm перестаёт ругаться на то, что классы команд нигде не используются.

Команда для подтверждения заявки называется "confirm-queue", её реализация находится в классе \App\Console\Commands\ConfirmQueueCommand. Скрипт использует \GuzzleHttp\Client для HTTP-запросов и \GuzzleHttp\Cookie\CookieJar для хранения кук. Скрипт корректно обрабатывает возникающие ошибки, и если эти ошибки не перманентные, то выжидает несколько секунд (случайное кол-во) и повторяет попытки (обычно до 5 раз). Не перманентные ошибки — это ошибки сервера (HTTP 5xx), ошибки соединения и ошибка проверки CAPTCHA. А вот ошибки клиента (HTTP 4xx) и неправильный пароль — это перманентные ошибки. После них скрипт уже не повторяет попытки.

Почему каптча решается только 1 раз?

При подтверждении через браузер пользователю нужно 2 раза вводить каптчу: один раз при входе, второй раз при подтверждении заявки. Однако, я обнаружил ошибку в работе сайта, о существовании которой я изначально догадывался. Она позволяет вводить каптчу только 1 раз. Дело в том, что код каптчи хранится в сессии и обновляется при запросе новой каптчи. Но если эту каптчу не запрашивать, то её код остаётся прежним и его можно использовать повторно. Проверка каптчи на сайте не очищает её код в сессии. Что ж, нам же лучше!

Приложение 1. ID стран и учреждений для config.txt

  • Австралия COUNTRY_ID=17ce9580-0390-4119-c8b1-e8c845e02161

    • Аделаида — выездная сессия SERVICE_PROVIDER_ID=8903eba9-9e4f-e0c7-2b0f-d849f136a4b4
    • Брисбен — выездная сессия SERVICE_PROVIDER_ID=3fb4c4a8-81b6-b64e-cd33-501145c21b63
    • Голд Кост — выездная сессия SERVICE_PROVIDER_ID=7ae5893c-9b9e-a3db-bc0d-25102615325e
    • Мельбурн — выездная сессия SERVICE_PROVIDER_ID=f4966291-4398-b66e-89dc-96b838fdd42d
    • Перт — выездная сессия SERVICE_PROVIDER_ID=a6534f70-efe2-f4f6-c7b2-bde00d30fedd
    • Сидней — Генеральное консульство SERVICE_PROVIDER_ID=95e698f3-1689-59db-ca62-30657891a444
    • Хобарт — выездная сессия SERVICE_PROVIDER_ID=43f23fd3-c4ab-6b7a-8991-b9539f266402
  • Азербайджан COUNTRY_ID=ba07e47c-0ce5-73a2-602a-a2e18bb0d45e

    • Баку — Консульский отдел Посольства SERVICE_PROVIDER_ID=6e81fff3-710d-e74b-7e66-c947a922c5e1
  • Алжир COUNTRY_ID=e6916b8c-5fb2-83e7-11f7-feb435fda40c

    • Алжир — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=542320a0-9f14-9e39-678b-856bcd05baf5
  • Армения COUNTRY_ID=8f019c84-30c2-1092-72e1-78909b678ae4

    • Ереван — Консульский отдел Посольства SERVICE_PROVIDER_ID=5f73a3c8-98ed-4aa7-cff8-f67a9c8e7253
  • Бразилия COUNTRY_ID=8fdc9bf3-ba7b-e5da-f18e-b41d31043527

    • Рио-де-Жанейро — Генеральное консульство SERVICE_PROVIDER_ID=910f3155-06a2-5f2d-8f37-f30ffed44a6e
    • Сан-Паулу — Генеральное консульство SERVICE_PROVIDER_ID=68dd2ee4-909b-ed8f-44c6-f6ba0113c30a
  • Великобритания COUNTRY_ID=3486bc5f-1c97-b593-ea18-613ab4647021

    • Лондон — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=4294fdd9-7300-20cb-35a3-2c719e98ea70
  • Гана COUNTRY_ID=b8cf9973-31e0-b6a9-a45a-0e6bd5435edc

    • Аккра — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=c7fa14b3-9022-4cb5-1a3b-e3d1cddd3438
  • Гвинея COUNTRY_ID=5faf0607-b04c-4776-fd36-38e34e901bdc

    • Конакри — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=9017bfb0-8b99-466f-8964-84fc41d8e2ce
  • Германия COUNTRY_ID=ce942619-87f8-bfdc-4ec0-a149c2d13888

    • Бонн — Генеральное консульство SERVICE_PROVIDER_ID=1acc8a95-50f7-e892-d176-db243bc57051
  • Греция COUNTRY_ID=a633937f-484b-bace-ac67-71a668c22ea0

    • Афины — Консульский отдел Посольства SERVICE_PROVIDER_ID=2c6b9672-6239-a7cd-fe3b-cf41ea795798
    • Салоники — Генеральное консульство SERVICE_PROVIDER_ID=6eec6c79-d082-41b3-6647-6e955e29ca0a
  • Грузия COUNTRY_ID=88655495-3b8c-f56d-5337-0f2743a7bfed

    • Тбилиси — Консульская служба Секции интересов РФ SERVICE_PROVIDER_ID=b8af6319-9d8d-5bd9-f896-edb8b97362d0
  • Египет COUNTRY_ID=592705d7-64e9-13b9-2b41-615bc300e4c8

    • Александрия — Генеральное консульство SERVICE_PROVIDER_ID=ed294579-313d-e953-0135-42f750772f8e
  • Казахстан COUNTRY_ID=253ca433-0ff2-93c3-889f-6e7a0824b13e

    • Алма-Ата — Генеральное консульство SERVICE_PROVIDER_ID=51aa59e8-388b-1576-2a5c-cf9d427d56ac
    • Астана — Консульский отдел Посольства SERVICE_PROVIDER_ID=674696fb-6dcd-0970-3320-aff714dab43d
    • Уральск — Генеральное консульство SERVICE_PROVIDER_ID=e05e2059-79f8-4176-8642-ce5e85533470
    • Уральск — Госпрограмма переселения SERVICE_PROVIDER_ID=ade925cd-4328-be07-b76a-9ab96b67037e
    • Усть-Каменогорск — Генеральное консульство SERVICE_PROVIDER_ID=c1380b8d-7e26-f1fd-3da9-3e0989d3eccd
  • Камбоджа COUNTRY_ID=b4e55d3b-a7da-5ba3-50d6-a9acb1a14404

    • Пномпень — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=b3e13694-0235-6d87-85a9-1a432ac6f4b0
  • Катар COUNTRY_ID=15b958b6-9127-965b-0117-edf398cd5220

    • Доха — Консульский отдел Посольства SERVICE_PROVIDER_ID=932c955f-4986-a34e-b44d-42d8e248fba3
  • Кипр COUNTRY_ID=0fda9b2b-bcb6-2639-7f37-7f7fab9708c3

    • Консульский прием в северной части г.Никосии SERVICE_PROVIDER_ID=b213b81a-41dd-63e0-2bb7-917cfe5eebc9
    • Никосия — Консульский отдел Посольства SERVICE_PROVIDER_ID=0bc2518e-4c15-bdb2-53a8-7f8c3f5f7f8f
  • Латвия COUNTRY_ID=868402fa-933a-4ef3-9fc0-5f7d7e1afd96

    • Рига — Консульский отдел Посольства SERVICE_PROVIDER_ID=b35fb373-637c-ae5e-3532-3f5909b4b9d5
  • Ливан COUNTRY_ID=50fe4bcf-86cf-3591-b3c6-931f116dd9f0

    • Бейрут — Консульский отдел Посольства SERVICE_PROVIDER_ID=7d8a7cf2-93f0-26ec-b52c-2f41aff36569
  • Малайзия COUNTRY_ID=e5e5ae41-2665-1f0e-926a-4df668e1b3dc

    • Куала-Лумпур — Консульский отдел Посольства SERVICE_PROVIDER_ID=962e5892-4338-e468-ad02-d8eed71b5c04
  • Мексика COUNTRY_ID=493768a2-8b05-5e82-50e9-7ab9c6296528

    • Мехико — Консульский отдел Посольства SERVICE_PROVIDER_ID=75d512c0-4ff5-a99e-6f33-11766e4ee511
  • Намибия COUNTRY_ID=866c0820-79f0-5b6f-dc21-f21bff838152

    • Виндхук — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=502abaff-72c1-ccc9-ad40-12daeb338e27
  • Нидерланды COUNTRY_ID=8e77f4b7-d541-3aeb-59f6-c19319372850

    • Гаага — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=f37bfb8a-0879-2bd0-1390-6a8abf75591a
  • Объединенные Арабские Эмираты COUNTRY_ID=92ce1a1f-6920-16dd-92d2-79e4437b85c2

    • Дубай — Генеральное консульство SERVICE_PROVIDER_ID=203022ca-37a7-9d54-a167-af8a55b3f535
  • Польша COUNTRY_ID=a7a89eac-5654-1a52-86ec-e91115eb165e

    • Краков — Генеральное консульство SERVICE_PROVIDER_ID=14a56bdd-43e7-cebd-dc69-188637801111
  • Республика Корея COUNTRY_ID=5e97fbc1-e9ab-5371-8a68-a4bf40dd17a9

    • Пусан — Генеральное консульство SERVICE_PROVIDER_ID=f250517f-a0ed-1b13-cd29-ac533089bb3b
    • Сеул — Консульский отдел Посольства SERVICE_PROVIDER_ID=b03336f1-e534-9d27-a17d-14d548face30
  • Сейшельские Острова COUNTRY_ID=4fbce84c-6f24-127a-99fd-6becdbcba60d

    • Виктория — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=979b2032-a46e-b5ca-4420-1a359874012c
  • Сингапур COUNTRY_ID=cb49f794-a8e4-9002-7d16-999463230ee6

    • Сингапур — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=85552a22-c384-86a4-a47b-27277a1c590d
  • Сирия COUNTRY_ID=2987fdfc-15b4-d138-3c08-34ff9016fc08

    • Дамаск — Консульский отдел Посольства SERVICE_PROVIDER_ID=9102ac6c-2c1a-d385-2de0-e3c941bbad46
  • Словакия COUNTRY_ID=d150d9c2-3a15-914d-fa36-90d8e86b6374

    • Братислава — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=a50f0c0c-628e-ca33-3735-c678ccc8706a
  • США COUNTRY_ID=feb5c602-1325-2704-d302-eb228cfbd2cb

    • Вашингтон — Консульский отдел Посольства SERVICE_PROVIDER_ID=d3c76e41-ffbc-45d4-4a13-92584f1f5a3b
    • Нью-Йорк — Генеральное консульство SERVICE_PROVIDER_ID=ea52c900-b992-dc1f-960d-a0e02771622c
  • Турция COUNTRY_ID=ff707965-a508-67a7-8629-db9aa5dc6e63

    • Анкара — Консульский отдел Посольства SERVICE_PROVIDER_ID=8990d896-84e0-69f8-4bcf-9fefe81cb838
  • Франция COUNTRY_ID=87f7e23f-792f-6b4c-7967-863fecc38ee9

    • Марсель — Генеральное консульство SERVICE_PROVIDER_ID=af094fb3-a891-d351-fe96-da47cd7d523a
    • Страсбург — Генеральное консульство SERVICE_PROVIDER_ID=9c9465a1-c3e6-8964-94c4-4f0c9e844079
  • Швейцария COUNTRY_ID=fac88941-3f90-5885-2075-2a3d9d4ebc0f

    • Берн — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=2a1d5cb7-cb86-7dab-fd21-2bd7f61de185
  • Швеция COUNTRY_ID=3a045d48-1419-e4db-9e76-955f5d8d1fc8

    • Стокгольм — Консульский отдел Посольства РФ SERVICE_PROVIDER_ID=b4752550-2e01-4be4-80a0-0805f389fd12
  • Эстония COUNTRY_ID=7310a366-2cd3-fa4a-5e4b-b412deb3fcfd

    • Таллин — Консульский отдел Посольства SERVICE_PROVIDER_ID=6c51d788-ea3c-4913-d89b-88b430ef864e