Задать вопрос
@AleksSEO
Накрутка поведенческих факторов в Яндексе

Как исправить проблему с публикацией фото по api в одноклассниках?

Всем привет. Помогите разобраться с публикацией в ОК.
Есть такой 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/jpeg\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,
    ],
];

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

// Отладочный вывод ответа сервера
echo "Ответ сервера после загрузки фотографии:\n";
print_r($upload_result);

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

// Получаем первый ключ из массива photos
$photo_key = array_key_first($upload_result['photos']);
if (!$photo_key) {
    die("Не удалось извлечь ключ фотографии из ответа сервера.");
}

// Получаем токен фотографии
$photo_token = $upload_result['photos'][$photo_key]['token'];
if (!$photo_token) {
    die("Не удалось извлечь токен фотографии из ответа сервера.");
}

// Получаем ID фотографии с помощью photosV2.commit
$commit_url = "https://api.ok.ru/api/photosV2/commit";
$commit_params = [
    "application_key" => $application_key,
    "format" => "json",
    "method" => "photosV2.commit",
    "gid" => $group_id,
    "photo_id" => $photo_token, // Используем токен как photo_id
    "access_token" => $access_token
];

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

$commit_url .= '?' . http_build_query($commit_params);
$commit_response = json_decode(file_get_contents($commit_url), true);

// Отладочный вывод ответа сервера
echo "Ответ сервера после подтверждения фотографии:\n";
print_r($commit_response);

if (!isset($commit_response['photos'][0]['id'])) {
    die("Не удалось получить ID фотографии. Ответ сервера: " . print_r($commit_response, true));
}

$photo_id = $commit_response['photos'][0]['id'];

// Формируем JSON для публикации
$post_data = [
    "media" => [
        [
            "type" => "text",
            "text" => $message
        ],
        [
            "type" => "photo",
            "list" => [
                [
                    "id" => $photo_id
                ]
            ]
        ]
    ]
];

// Кодируем JSON без экранирования Unicode и слешей
$attachment = json_encode($post_data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

// Подписываем запрос
$request_params = [
    "application_key" => $application_key,
    "format" => "json",
    "method" => "mediatopic.post",
    "gid" => $group_id,
    "type" => "GROUP_THEME",
    "attachment" => $attachment
];

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

// Отправляем запрос
$url = "https://api.ok.ru/fb.do";
$options = [
    "http" => [
        "header"  => "Content-type: application/x-www-form-urlencoded",
        "method"  => "POST",
        "content" => http_build_query($request_params),
    ],
];

$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);

// Выводим ответ
echo $response;

?>


В итоге он выдает такой ответ:
Ответ сервера после загрузки фотографии: Array ( [photos] => Array ( [тут код] => Array ( [token] => тут код ) ) ) Ответ сервера после подтверждения фотографии: Array ( [error_code] => 100 [error_msg] => PARAM : Parameter 'token' must be specified [error_data] => 1 [error_field] => token ) Не удалось получить ID фотографии. Ответ сервера: Array ( [error_code] => 100 [error_msg] => PARAM : Parameter 'token' must be specified [error_data] => 1 [error_field] => token )


Подскажите, как исправить?
  • Вопрос задан
  • 28 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@kalapanga
Недавно же был подобный вопрос...
Parameter 'token' must be specified
В тексте ошибки однозначно написано - в запросе должен быть параметр "token". Где в Вашем запросе такой параметр?
"photo_id" => $photo_token, // Используем токен как photo_id
Это с чего вдруг? Как раз полученный токен загруженной фотографии и нужно передать в параметре "token".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы