Как решить проблему с публикацией фотографий через API в Одноклассниках?

Здравствуйте! Помогите, пожалуйста, разобраться с процессом публикации в Одноклассниках. У меня есть следующий PHP скрипт: 

<pre><code class="php">&lt;?php

// Конфигурация
$access_token = '';
$application_key = '';
$session_secret_key = '';
$group_id = '';
$message = 'Привет! Тестируем публикацию с фотографией.';
$photo_path = 'images1.png';

// Проверяем, существует ли файл фотографии
if (!file_exists($photo_path)) {
    die("Файл фотографии не найден: $photo_path");
}

// Загрузка фотографии на сервер Одноклассников
$upload_url = "https://api.ok.ru/api/photosV2/getUploadUrl";
$upload_params = [
    "application_key" =&gt; $application_key,
    "format" =&gt; "json",
    "method" =&gt; "photosV2.getUploadUrl",
    "gid" =&gt; $group_id,
    "access_token" =&gt; $access_token
];

ksort($upload_params);
$sig = '';
foreach ($upload_params as $key =&gt; $value) {
    $sig .= "$key=$value";
}
$sig .= $session_secret_key;
$upload_params["sig"] = md5($sig);

$upload_url .= '?' . http_build_query($upload_params);
$upload_response = json_decode(file_get_contents($upload_url), true);

if (!isset($upload_response['upload_url'])) {
    die("Не удалось получить URL для загрузки фотографии. Ответ сервера: " . print_r($upload_response, true));
}

$upload_url = $upload_response['upload_url'];
$photo_data = file_get_contents($photo_path);
$photo_name = basename($photo_path);

$boundary = uniqid();
$delimiter = '-------------' . $boundary;

$post_data = "--" . $delimiter . "\r\n"
    . "Content-Disposition: form-data; name=\"photo\"; filename=\"" . $photo_name . "\"\r\n"
    . "Content-Type: image/jpeg\r\n\r\n"
    . $photo_data . "\r\n"
    . "--" . $delimiter . "--\r\n";

$upload_options = [
    "http" =&gt; [
        
  • 15 февраля 2025 г. 22:14
Ответы на вопрос 2
Код, который вы привели, начинается с загрузки фотографии на сервер Одноклассников, но его код не завершен. Также в коде есть несколько моментов, которые могли бы вызвать проблемы. Я помогу вам завершить его и внесу некоторые исправления.

### Основные моменты для исправления:

1. **Контент-тип**: Убедитесь, что используете правильный MIME-тип для загружаемого изображения (например, image/png для PNG-файлов).
2. **Отправка photo_data**: Проверьте, что изображение действительно загружается. Если присутствует ошибка, необходимо убедиться, что загружается корректный контент.
3. **HTTP-контекст для загрузки**: В PHP для отправки файлов нужно использовать `stream_context_create`.

Вот исправленный и завершенный код:

```php
<?php

// Конфигурация
$access_token = '';
$application_key = '';
$session_secret_key = '';
$group_id = '';
$message = 'Привет! Тестируем публикацию с фотографией.';
$photo_path = 'images1.png';

// Проверяем, существует ли файл фотографии
if (!file_exists($photo_path)) {
    die("Файл фотографии не найден: $photo_path");
}

// Загрузка фотографии на сервер Одноклассников
$upload_url = "https://api.ok.ru/api/photosV2/getUploadUrl";
$upload_params = [
    "application_key" => $application_key,
    "format" => "json",
    "method" => "photosV2.getUploadUrl",
    "gid" => $group_id,
    "access_token" => $access_token
];

ksort($upload_params);
$sig = '';
foreach ($upload_params as $key => $value) {
    $sig .= "$key=$value";
}
$sig .= $session_secret_key;
$upload_params["sig"] = md5($sig);

$upload_url .= '?' . http_build_query($upload_params);
$upload_response = json_decode(file_get_contents($upload_url), true);

if (!isset($upload_response['upload_url'])) {
    die("Не удалось получить URL для загрузки фотографии. Ответ сервера: " . print_r($upload_response, true));
}

$upload_url = $upload_response['upload_url'];
$photo_data = file_get_contents($photo_path);
$photo_name = basename($photo_path);

$boundary = uniqid();
$delimiter = '-------------' . $boundary;

$post_data = "--" . $delimiter . "\r\n"
    . "Content-Disposition: form-data; name=\"photo\"; filename=\"" . $photo_name . "\"\r\n"
    . "Content-Type: image/png\r\n\r\n"  // Убедитесь, что этот тип соответствует вашему файлу
    . $photo_data . "\r\n"
    . "--" . $delimiter . "--\r\n";

$upload_options = [
    "http" => [
        "header" => [
            "Content-Type: multipart/form-data; boundary=" . $delimiter,
        ],
        "method" => "POST",
        "content" => $post_data,
    ],
];

$context = stream_context_create($upload_options);
$upload_result = file_get_contents($upload_url, false, $context);
$upload_result = json_decode($upload_result, true);

if (!isset($upload_result['photo_id'])) {
    die("Не удалось загрузить фотографию. Ответ сервера: " . print_r($upload_result, true));
}

// Публикация сообщения с фотографией
$post_params = [
    "application_key" => $application_key,
    "format" => "json",
    "method" => "photosV2.postPhoto",
    "gid" => $group_id,
    "pid" => $upload_result['photo_id'],
    "message" => $message,
    "access_token" => $access_token
];

ksort($post_params);
$sig = '';
foreach ($post_params as $key => $value) {
    $sig .= "$key=$value";
}
$sig .= $session_secret_key;
$post_params["sig"] = md5($sig);

$post_url = "https://api.ok.ru/api/photosV2.postPhoto?" . http_build_query($post_params);
$post_response = file_get_contents($post_url);
$post_result = json_decode($post_response, true);

if (!$post_result || isset($post_result['error'])) {
    die("Ошибка при публикации фотографии. Ответ сервера: " . print_r($post_result, true));
}

echo "Фотография успешно опубликована!";
?>
```

### Краткие пояснения к коду:

1. **Проверка существования файла**: Убедились, что файл изображения существует перед попыткой загрузки.
2. **Получение URL
Недавно же был подобный вопрос... 
Parameter 'token' must be specified
В тексте ошибки однозначно написано - в запросе должен быть параметр "token". Где в Вашем запросе такой параметр?
"photo_id" => $photo_token, // Используем токен как photo_id
Это с чего вдруг? Как раз полученный токен загруженной фотографии и нужно передать в параметре "token".
Похожие вопросы