Как создать цифровой дешифровочный перстень с помощью PHP, FilePreviews.io и Twilio MMS

Автор: | 30.07.2026

За последние несколько месяцев я пересматривал одно из моих любимых телешоу, Alias, на Netflix. Для тех из вас, кто не знаком с этой телевизионной классикой, Alias рассказывает о спецагенте ЦРУ Сидни Бристоу, которая путешествует по миру, разгадывая тайны и побеждая плохих парней. Если вы такой же, как я, вы, вероятно, всегда хотели раскрыть в себе Сидни Бристоу и стать крутым шпионом ЦРУ. Сегодня я покажу вам, как использовать PHP, FilePreviews.io и Twilio MMS, чтобы на шаг приблизиться к этой мечте. Мы создадим приложение, которое позволит вам сфотографировать текст, зашифрованный шифром Цезаря, отправить его на номер телефона и получить ответ с расшифрованным текстом. Если вы спешите спасти мир, вы можете найти готовый код для нашего приложения на GitHub.

— PHP

— Аккаунт Twilio и номер Twilio с поддержкой MMS

— Аккаунт FilePreviews.io — мы будем использовать этот API для выполнения OCR на наших изображениях.

Хотите попробовать прямо сейчас? Скачайте это изображение текста, зашифрованного шифром Цезаря, и отправьте его на номер (646) 791-3807.

Для обнаружения текста на наших изображениях мы будем использовать OCR (оптическое распознавание символов). OCR — очень сложная задача. Когда я сталкиваюсь со сложными проблемами, я стараюсь найти API, чтобы упростить их. Тут на помощь приходит FilePreviews.io. FilePreviews делает много классных вещей с файлами, но самое важное для нас — он позволяет отправить изображение и возвращает результаты OCR для этого изображения. Именно тот инструмент, который нам нужен в нашем шпионском арсенале.

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

Хотя FilePreviews не имеет PHP-библиотеки-помощника, у него есть REST API, с которым мы можем взаимодействовать с помощью cURL. Давайте откроем новый файл под названием `incoming.php`

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

Мы устанавливаем `filepreview_url`, который будем использовать при выполнении запроса к API, и данные, которые мы передадим в наш запрос. Наши данные — это массив из трех элементов:

— `url` — URL изображения, которое мы хотим передать в API. Сейчас мы отправляем образец зашифрованного изображения.

— `metadata` — массив, содержащий метаданные, которые нам нужны об этом файле; в данном случае нам нужен только `ocr`

— `api_key` — замените это вашим API-ключом FilePreviews для только что созданного приложения.

Теперь, когда у нас есть переменные, давайте напишем код, который выполнит POST-запрос к API, чтобы получить нужную нам информацию:

Как я упоминал ранее, мы используем библиотеку PHP cURL для выполнения запроса к API FilePreviews. После инициализации запроса с `filepreview_url` мы используем функцию `curl_setopt` для установки некоторых опций, специфичных для нашего запроса. `CURLOPT_RETURNTRANSFER` указывает cURL возвращать результаты запроса (вместо просто `TRUE` при успехе, что является значением по умолчанию). Следующие три опции указывают cURL выполнить POST-запрос с Content-type `application/json` и отправить JSON-закодированную копию данных, которые мы установили ранее.

Теперь, когда у нас есть настройка, давайте напишем код для выполнения запроса и проверки успешности ответа:

Откройте браузер и загрузите ваш файл `incoming.php`. Вы должны увидеть слово «yay!». Теперь мы можем вернуться в нашу панель FilePreviews и нажать на наше приложение, чтобы увидеть историю наших успешных запросов. Мы поработаем над извлечением OCR-контента немного позже, но теперь, когда мы успешно отправляем запросы в FilePreviews, давайте сделаем вещи немного более динамичными.

Шпион часто не имеет времени для обновления жестко закодированного URL-адреса в PHP-файле. Давайте обновим наш код, чтобы получать зашифрованное изображение из входящего Twilio MMS. Сначала нам нужно настроить URL-адрес запроса сообщений Twilio. Зайдите в свой аккаунт Twilio, выберите номер, который вы хотите использовать для этого приложения, и добавьте полный URL-адрес вашего файла `incoming.php`. Twilio нуждается в общедоступном URL-адресе, чтобы иметь возможность обращаться к нему. Если вы сейчас работаете локально, вы можете развернуть свой код на своем любимом сервере или использовать ngrok, чтобы сделать ваш localhost доступным извне. Если вы раньше не пользовались ngrok, вы можете начать с наших руководств для разных платформ или с руководства для Windows.

Когда пользователь отправляет MMS на ваш номер телефона Twilio, Twilio сделает запрос по указанному вами URL-адресу, чтобы предоставить вам информацию о сообщении. Теперь, когда наша конфигурация настроена, давайте обновим наш файл `incoming.php`, чтобы использовать эту информацию при отправке запроса в FilePreviews.

Мы извлекаем `MediaUrl0` из данных POST. Это будет первый медиафайл, который пользователь включил в свое MMS-сообщение. В нашем случае это будет URL-адрес изображения с зашифрованным кодом. Мы также извлекаем номер `From`. Мы хотим отслеживать его, чтобы знать, кому отправлять обновление, когда мы наконец взломаем код.

Как только у нас появятся эти две части информации, мы обновим данные, которые отправляем в FilePreviews. Мы заменим жестко закодированный URL-адрес, который мы использовали ранее, на URL-адрес, указывающий на наш медиафайл. Дополнительно мы добавим новый элемент данных в наш запрос под названием `data`. Это пользовательские пары ключ-значение, которые FilePreviews будет ассоциировать с нашим запросом.

OCR на этом изображении может занять несколько минут, поэтому сейчас мы просто добавим SMS-ответ, чтобы пользователь знал, что мы усердно работаем над взломом кода. Для этого мы будем использовать TwiML. TwiML — это набор инструкций (в виде XML), которые вы можете использовать, чтобы сказать Twilio, что делать, когда он получает телефонный звонок или текстовое сообщение. Давайте обновим наш файл `incoming.php`, чтобы он возвращал TwiML при получении запроса.

Мы будем использовать PHP-библиотеку-помощник Twilio для генерации TwiML, поэтому сначала установим ее с помощью composer.

Давайте обновим наш файл `incoming.php`, чтобы он автоматически загружал любые библиотеки, которые мы требуем с помощью composer.

Ранее в нашем файле `incoming.php` мы просто выводили простые строки в зависимости от успеха или неудачи нашего запроса к API. Давайте заменим этот код, чтобы вместо этого отправлять соответствующий TwiML, уведомляющий пользователя о том, что происходит.

Попробуйте! Отправьте MMS на номер вашего цифрового дешифровального перстня и подождите, пока не получите ответ. Если этого не произойдет, зайдите в Twilio App Monitor, чтобы найти полезную информацию, которая поможет вам отладить. Теперь давайте приступим к получению ответа OCR и его расшифровке.

FilePreviews предоставляет нам возможность установить URL обратного вызова, который будет активироваться по завершении обработки изображения. Давайте отредактируем наше приложение «Цифровой дешифровочный перстень», чтобы URL обратного вызова указывал на `outgoing.php` на нашем сервере.

Когда FilePreviews передает информацию о нашем изображении на наш URL обратного вызова, он отправляет ее в виде JSON Web Token. Мы будем использовать библиотеку `firebase/php-jwt` для парсинга этого токена. Установим ее с помощью composer:

Теперь давайте займемся созданием нашего файла `outgoing.php`:

Сначала мы убеждаемся, что все библиотеки, которые мы потребовали с помощью composer, будут автоматически загружены. Затем мы вызываем `file_get_contents` на `php://input`, чтобы прочитать необработанные POST-данные, отправленные в этот запрос. Затем мы декодируем данные с помощью нашей JWT-библиотеки и нашего секретного ключа FilePreviews. Обязательно замените свой секретный ключ на ключ в вашей панели FilePreviews. Это даст нам объект, из которого мы сможем извлечь наш OCR-текст.

Теперь, когда у нас есть текст, нам нужно взломать шифр Цезаря. Я не смог найти библиотеку для этого в PHP, но коллега из Twilio Роб Спектр создал отличную библиотеку на Python для этого. Конечно, мы уже пишем это на PHP и не хотим использовать библиотеку Python. Не волнуйтесь, я провел эти выходные, портируя отличную библиотеку шифра Цезаря Роба на PHP. Добавим ее с помощью composer:

Теперь мы можем добавить это в конец нашего файла `outgoing.php`, чтобы использовать эту библиотеку для взлома нашего кода:

Мы снова используем PHP-библиотеку-помощник Twilio. На этот раз мы используем функцию `sendMessage` для отправки текстового сообщения с нашим расшифрованным текстом. Эта функция принимает 3 параметра:

— Номер отправителя — номер, с которого вы хотите отправить сообщение. В данном случае ваш номер телефона Twilio.

— Номер получателя — помните, ранее мы передали номер человека, отправившего изображение, в API FilePreviews? Мы можем получить доступ к этому номеру в данных, которые они передали в JWT.

— Текст сообщения — тело нашего текстового сообщения. В данном случае — расшифрованный текст.

Теперь мы можем выполнять OCR на шифре Цезаря, используя Twilio MMS + Filepreviews.io, а затем декодировать его с помощью PHP. Сделайте снимок и попробуйте:

Пожалуйста, убедитесь, что вы используете свои новообретенные шпионские таланты во благо, а не во зло. Бонусные очки — можете ли вы обновить код, чтобы кодировать шифры вместо декодирования? Есть вопросы или вы хотите показать, что вы делаете с Twilio MMS? Напишите мне в Twitter или по электронной почте.