Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Дальше чем Hello World! на Python у меня так и не получилось продвинуться... Хочется творить, создавать что-то полезное, но все, более продвинутые коллеги вокруг утверждают, что раньше чем через год активных проб и ошибок ничего путного из-под моей клавиатуры не выйдет.
Эта статья для тех, кто думает, что не сможет и поэтому даже не пробует.
"Если долго сидеть на берегу реки, то можно увидеть как мимо проплывёт труп твоего врага" (Шон Коннери, фильм "Восходящее солнце", 1993).
Вуаля, GPT-4 (ChatGPT или GPT кому как нравится) доступен через bing.com/new (потребуется учетная запись в Microsoft и, возможно, немного подождать, зато, никакого гемора с VPN и переполнением очереди в chat.openai.com/chat).
Задача
Проба пера была на простеньком скрипте для Google Docs (тут), теперь проблема следующая - при написании длинного текста в переводчике, ты не знаешь, насколько результат (переведенный текст) отражает изначально заложенную мысль. Чтобы случайно не ругнуться матом, например, во Вьетнаме, я всегда переводил результат перевода обратно с вьетнамского на русский. Соответственно, если в тексте попадалась ошибка, приходилось переписывать предложение на русском, переводить на вьетнамский и опять делать проверку. Все известные мне переводчики не обладают функцией мгновенного обратного перевода, значит, придётся его сделать.
Далее привожу диалог с GPT практически без купюр (мои запросы здесь оформлены как цитаты, ответы GPT - как код), во время диалога код был существенно доработан, финальная версия в конце статьи!
Глава первая. Начало
создай код для интерент страницы переводчика, используя инструкции https://cloud.yandex.ru/docs/translate
<html>
<head>
<title>Переводчик</title>
</head>
<body>
<h1>Переводчик</h1>
<form action="translate.php" method="post">
<p>Введите текст для перевода:</p>
<textarea name="text" rows="10" cols="50"></textarea>
<p>Выберите язык перевода:</p>
<select name="language">
<option value="en-ru">Английский - Русский</option>
<option value="ru-en">Русский - Английский</option>
<option value="fr-ru">Французский - Русский</option>
<option value="ru-fr">Русский - Французский</option>
<option value="de-ru">Немецкий - Русский</option>
<option value="ru-de">Русский - Немецкий</option>
</select>
<p><input type="submit" value="Перевести"></p>
</form>
</body>
</html>
<?php
// Получаем текст и язык перевода из формы
$text = $_POST['text'];
$language = $_POST['language'];
// Проверяем, что текст не пустой
if ($text == "") {
echo "Пожалуйста, введите текст для перевода.";
exit;
}
// Получаем IAM-токен и идентификатор каталога из файла config.php
require_once 'config.php';
// Формируем URL для запроса к API Яндекс.Переводчика
$url = 'https://translate.api.cloud.yandex.net/translate/v2/translate';
// Формируем заголовки для запроса
$headers = [
'Content-Type: application/json',
"Authorization: Bearer $IAM_TOKEN"
];
// Формируем данные для запроса
$post_data = [
"targetLanguageCode" => $language,
"texts" => [$text],
"folderId" => $folder_id,
];
// Кодируем данные в формат JSON
$data_json = json_encode($post_data);
// Инициализируем cURL
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
// Выполняем запрос и получаем ответ
$result = curl_exec($curl);
// Закрываем cURL
curl_close($curl);
// Декодируем ответ из формата JSON
$result_json = json_decode($result, true);
// Проверяем, что ответ содержит переведенный текст
if (isset($result_json['translations'][0]['text'])) {
// Выводим переведенный текст на экран
echo "<h1>Перевод</h1>";
echo "<p>" . $result_json['translations'][0]['text'] . "</p>";
} else {
// Выводим сообщение об ошибке
echo "<h1>Ошибка</h1>";
echo "<p>" . $result_json['message'] . "</p>";
}
?>
Как я понял, нужно создать два файла, один из которых в формате HTML, а второй в формате PHP. Как я откуда-то помню, первый HTML-файл должен называться index.html, а название PHP-файла читаем в HTML-коде в 7 строке. Код ссылается на некий файл config.php. Как он может выглядеть, я представления не имею, поэтому, спросим об этом GPT.
создай пример файла config.php
<?php
// Замените эти значения на свои
$IAM_TOKEN = '<IAM-токен>';
$folder_id = '<идентификатор каталога>';
?>
Глава следующая. Перипетия с авторизацией
Собственно вот тут https://cloud.yandex.ru/docs/translate/operations/translate Яндексом подробно описано как получать токены и даже есть примеры для CLI (Интерфейс командной строки), Python и PHP. Сложность в том, что не понятно по какому пути нужно пойти, чтобы было быстро просто и без всяких там интерпретаторов, виртуальных машин и вот этого всего. Я хотел отправить код с HTML-страницы вместе с API-ключом, но нет же...
Сразу после получения IAM-токена, получите API-ключ (Яндекс предупреждает, что это менее секьюрно, зато не нужно настраивать автоматическое обновление IAM-токена каждые 12 часов) тут https://cloud.yandex.ru/docs/iam/operations/api-key/create. Далее меняем строку 21 в файле translate.php "Authorization: Bearer $IAM_TOKEN"на "Authorization: Api-Key <API-ключ>" или ссылку на него в соседнем файле $API_key.
Глава еще одна. Кодировка
текст на странице выводится в таком виде "Петеводчик" как поправить?
Тут GPT выдал 4 варианта, как поправить, но лучший я нашел сам на stackoverflow и добавил его в HTML-файл после тэга <head> (подсказка была в самом редакторе файлов).
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
Глава об ошибочном понимании ИИ существующей действительности
На самом деле это уже вторая попытка сделать переводчик на сайте, первая с полным функционалом была написана по старым инструкциям Яндекса, поэтому в данной версии хотелось просто убедиться, что API-shmAPI работает... Оно так-то работает, но выдаёт ошибку при исполнении кода
при выполнении кода, выводится "unsupported target_language_code: en-ru" как исправить?
Далее небольшой спор с ИИ, привожу для понимания его несовершенства (использует старые инструкции) и демонстрации пути обхода (спойлер - читаем инструкцию на Яндексе, делаем как там написано).
Возможно, проблема в том, что вы используете неправильный код языка для параметра target_language_code. Вы должны использовать пару кодов языков ( "откуда" - "куда"), разделенных дефисом. Например, en-ru означает перевод с английского на русский. Вы также можете использовать только код целевого языка (например, ru). В этом случае сервис попытается определить исходный язык автоматически1.
Чтобы исправить ошибку, вы можете попробовать следующее:
Проверьте, что вы указали правильный код языка в параметре target_language_code. Вы можете получить список поддерживаемых языков с помощью метода getLangs2.
Проверьте, что вы указали правильный ключ API в параметре key. Вы можете получить бесплатный ключ API на сайте Яндекс.Облака1.
Проверьте, что вы указали правильный идентификатор каталога в параметре folderId. Вы можете найти его в своем личном кабинете1.
что нужно исправить в коде, если следующий пример считать верным? далее код с вкладки PHP на странице https://cloud.yandex.ru/docs/translate/operations/translate
В коде не нужно ничего исправлять, если следующий пример считать верным.
Этот код отправляет запрос к API Яндекс.Переводчика и получает ответ в формате JSON.
В ответе должен быть перевод слов "Hello" и "World" с английского на русский язык.
Пример ответа:
{
"translations": [
{
"text": "Привет",
"detectedLanguageCode": "en"
},
{
"text": "Мир",
"detectedLanguageCode": "en"
}
]
}
targetLanguageCode указывается не парой языков, например, en-ru, а кодом одного языка, например ru
Нет, targetLanguageCode может указываться как парой языков, так и кодом одного языка.
Если вы указываете пару языков, например en-ru, то вы задаете направление перевода с английского на русский.
Если вы указываете код одного языка, например ru, то вы задаете целевой язык перевода, а исходный язык будет определен автоматически.
почему тогда сайт выдаёт "unsupported target_language_code: ru-en"?
Возможно, сайт выдает эту ошибку, потому что вы указываете код языка в неправильном формате.
Вы должны использовать дефис (-), а не тире (–) для разделения кодов языков.
Например, en-ru, а не en–ru. Также убедитесь, что вы используете правильные коды языков.
Вы можете получить список поддерживаемых языков с помощью метода getLangs1.
<К сожалению, для этой беседы достигнуто ограничение.>
<Нажмите кнопку "метла", чтобы очистить это и продолжить общение.>
Да, у Bing тоже есть свои недостатки (максимум 20 запросов на один диалог), пришлось самому догадаться заменить ru-en на ru, а en-ru - на en. Невеликое достижение, но после этого всё заработало и я "...почил в день седьмой от всех дел Своих, которые делал" (Быт. 2:2).
Эпилог
Вашему вниманию предлагаются финальные версии файлов, которые нужно разместить в отдельной папке (поддомене) вашего сайта. Хоcтинг сайта, видимо, должен поддерживать PHP, но это не точно. Кстати, все комментарии тоже дело рук GPT.
Файл index.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Переводчик</title>
</head>
<body>
<h1>Переводчик Yandex</h1>
<form action="translate.php" method="post">
<p>Введите текст для перевода:</p>
<textarea name="text" rows="1" cols="50"></textarea>
<p>Выберите язык перевода:</p>
<select name="language">
<option value="en">en</option>
<option value="ru">ru</option>
</select>
<p><input type="submit" value="Перевести"></p>
</form>
</body>
</html>
Файл config.php
<?php
// Замените эти значения на свои
$API_key = 'AQVNw5-----------------------EiFWg';
$folder_id = 'b1go---------l4ps';
?>
Файл translate.php
<?php
// Получаем текст и язык перевода из формы
$text = $_POST['text'];
$language = $_POST['language'];
// Проверяем, что текст не пустой
if ($text == "") {
echo "Пожалуйста, введите текст для перевода.";
exit;
}
// Получаем API-key и идентификатор каталога из файла config.php
require_once 'config.php';
// Формируем URL для запроса к API Яндекс.Переводчика
$url = 'https://translate.api.cloud.yandex.net/translate/v2/translate';
// Формируем заголовки для запроса
$headers = [
'Content-Type: application/json',
"Authorization: Api-Key $API_key"
];
// Формируем данные для запроса
$post_data = [
"targetLanguageCode" => $language,
"texts" => [$text],
"folderId" => $folder_id,
];
// Кодируем данные в формат JSON
$data_json = json_encode($post_data);
// Инициализируем cURL
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
// Выполняем запрос и получаем ответ
$result = curl_exec($curl);
// Закрываем cURL
curl_close($curl);
// Декодируем ответ из формата JSON
$result_json = json_decode($result, true);
// Проверяем, что ответ содержит переведенный текст
if (isset($result_json['translations'][0]['text'])) {
// Выводим переведенный текст на экран
echo "<h1>Перевод</h1>";
echo "<p>" . $result_json['translations'][0]['text'] . "</p>";
} else {
// Выводим сообщение об ошибке
echo "<h1>Ошибка</h1>";
echo "<p>" . $result_json['message'] . "</p>";
}
?>
Визуализация результата
Планы на будущее
сделать перевод после нажатия кнопки пробел или enter
получить результат перевода на экране ввода исходного текста
добавить окошко с обратным переводом на русский
добавить три окошка справа: текст на английском, перевод на русский, обратный перевод на английский
Спасибо за внимание" Следите за обновлениями!
Пробуйте что‑то своё! GPT поможет.