Всем привет. Помогите разобраться с публикацией в ОК.
Есть такой 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 )
Подскажите, как исправить?