Задать вопрос
Romas34
@Romas34

Публикация в ленту в Одноклассниках с помощью stream.publish?

Пытаюсь опубликовать запись с помощью stream.publish из ActionScript-кода через вызов ExternalInterface. Код взят из примеров. JavaScript-код в js-файле:
/** Публикация в ленту. */
function publish(confirmation_message, text, attachment, links) {
	console.log("try publish:", text);

    // подготовка параметров для публикации
    feedPostingObject = {method: 'stream.publish',
                        message: text,
                     attachment: JSON.stringify(attachment),
                   action_links: JSON.stringify(links)};
    // расчет подписи
    sig = FAPI.Client.calcSignature(feedPostingObject);
    // вызов окна подтверждения
    FAPI.UI.showConfirmation('stream.publish', confirmation_message, sig);
}


Вызов в ActionScript:
ExternalInterface.call("publish", text, text,
                               {"caption":text2,"media":[{"type":"image","src":imgName}]},
                               [{"text":text2,"href":SocialService.instance.getAppUrl()}]);


При этом картинка, заданная imgName, не публикуется. Публикуется только дефолтная иконка приложения. Почему? Этот метод не может публиковать картинки?
  • Вопрос задан
  • 882 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
Vjaka
@Vjaka
Платформа игр (Одноклассники)
А как вы заливаете эту картинку?

Делаете https://apiok.ru/dev/methods/rest/photosV2/photosV...
потом заливаете
потом указываете ссылку на неё в медиатопике?

Про заливку картинок https://apiok.ru/dev/examples/photo_upload
Ответ написан
@FlamelMamel
для хеширования сигнатуры для mediatopic.post нужно какие то кодировки?
Ответ написан
Комментировать
@RuWproSha
Ниже я привожу полностью готовый PHP код для публикации ТЕКСТ + КАРТИНКИ.

Примечание*:
$images - массив с URL картинок вида: ["..path/img/cat.jpg","..path/img/dog.jpg"], его вы сформируете сами. А так же все остальные необходимые переменные ( токен, key и т.д. ) и передавайте в эту функцию ok_wall_post() и все будет работать.

$images = []; // <- массив с URL картинок вида: ["..path/img/cat.jpg","..path/img/dog.jpg"]
$message = 'String'; // <- Message
$user = [] // <-массив с данными пользователя (id, token, и т.д., какие данные у вас хранятся). В этом коде здесь находится token: $user['access_token']
$application_key = 'String' // <- Публичный ключ приложения -- присылается по e-mail после регистрации приложения
$session_secret_key = 'String' // <- Session_secret_key приложения -- присылается по e-mail после регистрации приложения
$application_secret_key = 'String' // <- Секретный ключ приложения -- присылается по e-mail после регистрации приложения

function ok_wall_post($user, $message, $images, $application_key, $application_secret_key, $session_secret_key) {

    function getUrl($url, $type = "GET", $params = array(), $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) {
                    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_USERAGENT, 'PHP Bot');
            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);
            }
            return $data;
        } else {
            return "{}";
        }
    }

$arrPhotos = Array(); // <- Сюда будем складывать массивы с парами Array('id' => $photo_token);

foreach ($images as $image) { // $images - массив с URL картинок вида: ["..path/img/cat.jpg","..path/img/dog.jpg"]
    $params = [
        'application_key'   => $application_key, // Публичный ключ приложения
        'session_secret_key'=> $session_secret_key, // Session_secret_key
        'access_token'      => $user['access_token'], // access_token
        'method'            => 'photosV2.getUploadUrl',
        'format'            =>  'json'
        ];
    
        ksort($params);
        $paramsS='';
        foreach($params as $k=>$v) {
            $paramsS .= $k . "=" . $v;
        }
    
        $sigg = md5($paramsS.$application_secret_key);
    
        $params['sig'] = strtolower($sigg);
    
        $photo_get_id = json_decode(getUrl("https://api.ok.ru/fb.do", "POST", $params), true);
        // echo '<pre>' . json_encode($photo_get_id, JSON_PRETTY_PRINT) . '</pre>';
        $photo_send_id = $photo_get_id['photo_ids']['0'];
        $upload_url = $photo_get_id['upload_url'];
        $paramsP = array('pic1' => curl_file_create($image));
        $photo_send = json_decode(getUrl($upload_url, "POST", $paramsP, true), true);
        // echo '<pre>' . json_encode($photo_send, JSON_PRETTY_PRINT) . '</pre>';
        $photo_token = $photo_send['photos'][$photo_send_id]['token'];
        
        $arrPhotos[] = Array('id' => $photo_token);
        // echo $photo_token . '<br>';

}

$media = array('media' =>
    array(
        array('type'=> 'text','text'=> $message),
        array('type'=> 'photo', 'list'=> $arrPhotos),
    ),
);

$paramsArray = [
    'application_key'=> $application_key,
    'access_token'=> $user['access_token'],
    'type'=> 'USER',
    'attachment'=> json_encode($media),
    'format' => 'json',
    'method' => 'mediatopic.post',
    ];
    ksort($paramsArray);
    $paramsStr='';
    foreach($paramsArray as $k=>$v) {
        $paramsStr .= $k . "=" . $v;
    }
    $sig = md5($paramsStr.$application_secret_key);

    $paramsArray['sig'] = strtolower($sig);

    $status = json_decode(getUrl("https://api.ok.ru/fb.do", "POST", $paramsArray, false, false ), true);
    //? echo $status . '<br>';       <- String
    echo '<pre>' . json_encode($status, JSON_PRETTY_PRINT) . '</pre>';

}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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