N
N
Nikita Abramov2020-02-12 16:49:05
PHP
Nikita Abramov, 2020-02-12 16:49:05

Odnoklassniki API: uploading photos to photosV2.commit php album occurs Error 104?

// Параметры
$ok_access_token    = "";  // Наш вечный токен
$ok_private_key     = "";  // Секретный ключ приложения
$ok_public_key      = "";  // Публичный ключ приложения
$ok_group_id        = "";  // ID нашей группы


// Запрос
function getUrl($url, $type = "GET", $params = array(), $timeout = 30, $image = false, $decode = true,)
{
    if ($ch = curl_init())
    {
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, false);

        if ($type == "POST")
        {
            curl_setopt($ch, CURLOPT_POST, true);

            // Картинка
            if ($image) {
                curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
            }
            // Обычный запрос
            elseif($decode) {

                    pre(curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode(http_build_query($params))));

            }
            // Текст
            else {
                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
            }
        }

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12');
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

        $data = curl_exec($ch);

        curl_close($ch);

        // Еще разок, если API завис
        if (isset($data['error_code']) && $data['error_code'] == 5000) {
            $data = getUrl($url, $type, $params, $timeout, $image, $decode);
        }

        return $data;

    }
    else {
        return "{}";
    }
}

// Массив аргументов в строку
function arInStr($array)
{
    ksort($array);

    $string = "";

    foreach($array as $key => $val) {
        if (is_array($val)) {
            $string .= $key."=".arInStr($val);
        } else {
            $string .= $key."=".$val;
        }
    }
    return $string;
}

// Получим адрес для загрузки 1 фото
$params = array(
    "application_key"   =>  $ok_public_key,
    "method"            => "photosV2.getUploadUrl",
    "count"             => 1,  // количество фото для загрузки
    "gid"               => $ok_group_id,
    "format"            =>  "json"
);

// Подпишем запрос
$sig = md5( arInStr($params) . md5("{$ok_access_token}{$ok_private_key}") );
$params['access_token'] = $ok_access_token;
$params['sig']          = $sig;

// Выполним
$step1 = json_decode(getUrl("https://api.ok.ru/fb.do", "POST", $params), true);


// Если ошибка
if (isset($step1['error_code'])) {
    // Обработка ошибки
    exit();
}

// Идентификатор для загрузки фото
$photo_id = $step1['photo_ids'][0];

// Закачаем фотку

// Предполагается, что картинка располагается в каталоге со скриптом
$params = array(
    "pic1" => new \CURLFile(__DIR__ .'/e2cd131a01dea207300c9972de79b573.png'),
);

// Отправляем картинку на сервер, подписывать не нужно
$step2 = json_decode( getUrl( $step1['upload_url'], "POST", $params, 30, true), true);
$params = [
    "application_key"   =>  $ok_public_key,
    "format"            =>  "json",
    "method"  => "photosV2.commit",
    'photo_id' => $photo_id,
    'token' => $step2['photos'][$photo_id]['token'],
];

$sig = md5( arInStr($params)  . md5($ok_access_token.$ok_private_key));
$params['sig']          = $sig;
$params['access_token'] = $ok_access_token;

pre($step2);

// Выполним
$step3 = json_decode(getUrl("https://api.ok.ru/fb.do", "POST", $params), true);
print_r($step3);


Error 104 occurs, but the bottom line is that it happens and does not appear very rarely, requests for 80 - 1 pass normally and the photo is added. Error 104 - Mol is not correctly formed SIG

Answer the question

In order to leave comments, you need to log in

1 answer(s)
N
Nikita Abramov, 2020-02-17
@Ganzo

All figured out

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question