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

[РЕШЕНО] Добавление активной ссылки в ok пост через api метод mediatopic.post используя объект media text и поле text_tokens как?

Добрый день подскажите, каким образом в тексте Поста можно вставить ссылку вида link

Я пробовал вставить так
array('type'=> 'text','text'=> trim($title).'\n\n<a href="'.$link.'">Подробнее..</a>') - но в посте получается текст:
"Заголовок
<a href="">Подробнее...</a>"

А должно:
Заголовок
Подробнее...

Вариант с array('type'=> 'link','url'=> $link, 'description'=>'') - не подходит, так как по ссылке автоматически подгружается фотография, а смысл как раз в том, чтобы вставить просто ссылку без загрузки фото (фото мы грузим через API т.к. оно не подгружается по ссылке).

Вариант с array('type'=> 'text','text'=> trim($title).'\n\nПодробнее: '.$link) - тоже не подходит потому-что ссылка очень длинная и выглядит это ужасно, например "Подробнее: news-rekordnyy-urozhay-novye-rynki-eksporta-i-grandioznye-plany-novosibirskie-agrarii-gotovy-narashchivat-obyemy-proizvodstva/"

Техподдержка api ok отписалась что существует способ оформления ссылок:
при использовании mediatopic.post есть поле media, в нем есть text и далее сам объект AttachmentMediaText. В объекте AttachmentMediaText есть поле text_tokens, которое является списком MediaTextToken. Страница с данным токеном представлена тут: https://apiok.ru/dev/types/mediatopic.MediaTextToken


В общем от документации и тем более от техподдержки ОК никакого толку, поэтому долго-ли, коротко-ли методом научного тыка, удалось понять как реализовать добавление активной ссылки в пост, ниже рабочий пример для WordPress.

В ОК получается пост:
"Заголовок

Краткий текст. Подробнее..."

Алгоритм работы такой: для новости, которую нужно отправить в ОК, в свойствах ставится метка ОкПост - после сохранения или обновления происходит отправка в ОК и удаление метки.

Код функции в /public_html/wp-content/themes/mytheme/functions.php
function send_to_ok($post_id) {

    // Обрабатываем только опубликованные записи
    if (wp_is_post_revision($post_id) || get_post($post_id)->post_status != 'publish' )
        return;
    // Отправляем только записи у которых стоит метка ОкПост
    if(has_tag('ОкПост', $post_id)) {
        $descr= str_replace('[&hellip;]', '...', get_the_excerpt($post_id));
        $post_title = get_the_title($post_id);
        $post_url = get_the_guid($post_id);

        if(comments_open($post_id)) {
                $comment=0;
        }
        else {
            $comment=1;
        }

    $apiUrl = 'https://api.ok.ru/fb.do?';
    //Здесь укажите свои ключи доступа
    $application_id="512***814874";
    $application_key="CLFCL****IHBABABA";
    $application_secret_key="0ED87B******2EEA61AAAEEF";
    $session_key="tkn1QhRXWNZbi******************j7RTR73oI6gVTaE37vH004TF1KP4p6";
    $session_secret_key="402f4c561284*************dcbb88a40e00";
    $group_id="624*******8232";//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) {
                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, '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, $timeout, $image, $decode);
        }
        return $data;
    }
    else {
        return "{}";
    }
}

 /* Загрузка фото */
        $params = [
        'application_key'   => $application_key,
        'session_key'=> $session_key,
        'session_secret_key'=> $session_secret_key,
        'method'            => 'photosV2.getUploadUrl',
        'count'             => 1,  // количество фото для загрузки
        'gid'               => $group_id,
        '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);
        $photo_send_id=$photo_get_id['photo_ids']['0'];
        $upload_url=$photo_get_id['upload_url'];
        $photo=get_attached_file(get_post_thumbnail_id($post_id));
        $paramsP = array('pic1' => curl_file_create($photo));
        $photo_send=json_decode(getUrl($upload_url, "POST", $paramsP, 30, true), true);
        $photo_token = $photo_send['photos'][$photo_send_id]['token'];
/* end photos */

        $media = array('media' =>
            array(
                array('type'=> 'text','text'=> '',
                    'text_tokens'=> array(
                                        array('text'=> html_entity_decode($post_title).PHP_EOL.PHP_EOL.html_entity_decode($descr).' '),
                                        array('text'=> 'Подробнее...', 'link'=>$post_url)
                                        )
                    ),
                array('type'=> 'photo', 'list'=> array(array('id' => $photo_token))),
            ),
            'disableComments'=> $comment
        );

         $paramsArray = [
        'application_key'=> $application_key,
        'session_key'=> $session_key,
        'gid'=> $group_id,
        'type'=> 'GROUP_THEME',
        'attachment'=> json_encode($media),
        'format' => 'json',
        'text_link_preview' => '0',
        '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, 30, false, false ), true);

        if(is_string($status)) {
            //Удаляем метку ОкПост чтобы исключить повторную отправку в ОК
            wp_remove_object_terms($post_id, 'ОкПост', 'post_tag');
        }
        else {
            wp_remove_object_terms($post_id, 'ОкПост', 'post_tag');
        }
    }
}
  • Вопрос задан
  • 305 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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