Пишу о программировании, книгах, науке и жизни

Скрипт автопостинга в группу Одноклассников

9 мая 2016, 0:14

Создание приложения

A. Зарегистрироваться в Однокласниках
B. Привязать к аккаунту электронную почту
C. Получить права разработчика
D. Создать своё приложение

Е. Заполняем анкету, как заполнять описано здесь. Тип приложения выбираем External, указываем ссылки на иконки, статус приложения — Недоступное, права пока не трогаем.
F. После успешного добавления приложения на почту упадет письмо с идентификатором и ключами приложения.

Получение необходимых прав

После регистрации приложения нам необходимо получить права GROUP_CONTENT которые позволят осуществлять постинг в группу в одноклассниках. Для этого нам необходимо написать письмо на адрес api-support@ok.ru, в письме необходимо указать ID приложения, указать требуемые права доступа и пояснить для каких целей они вам необходимы.

Для автопостинга в группы необходимы права GROUP_CONTENT и VALUABLE_ACCESS.
В письме укажите что VALUABLE_ACCESS необходим для публикации объявления поданного пользователем на его странице, а GROUP_CONTENT необходим для публикации объявлений в группе вашего сайта.

Внимание! Вы можете не получить ответ на ваше письмо, поэтому проверяйте настройки своего приложения, там должны появиться требуемые права доступа.

Для того, что бы попасть в настройки своего приложения необходимо зайти на страницу приложения, в самом низу будет ссылка Изменить настройки приложения, далее нужно указать секретный ключ приложения из письма, которое автоматические пришло после регистрации.

Публикация постов

После того, как необходимые права получены (мне выдали на следующий день), заходим в настройки приложения, проверяем права и нажимаем кнопку получения токена:

Если вы решили потом поменять права, то нужно будет заново сгенерировать access_token

Я буду публиковать картинку и текст к ней в группе.
Cписок всех параметров метода mediatopic.post и типов вложений есть по ссылке.

Скрипт автопостинга

Если у вас версия PHP 5.5 и выше, то замените этот кусок кода:

$params = array(
    "pic1" => "@picture.jpg",
);

На этот:

$params = array(
    "pic1" => new \CURLFile('picture.jpg'),
);

Приведённый ниже код работает до версии PHP 5.4 включительно.

<?php

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

// Запрос
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 "{}";
    }
}

// Массив аргументов в строку
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. Получим адрес для загрузки 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];

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

// Предполагается, что картинка располагается в каталоге со скриптом
$params = array(
    "pic1" => "@picture.jpg",
);

// Отправляем картинку на сервер, подписывать не нужно
$step2 = json_decode( getUrl( $step1['upload_url'], "POST", $params, 30, true), true);

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

// Токен загруженной фотки
$token = $step2['photos'][$photo_id]['token'];

// Заменим переносы строк, чтоб не вываливалась ошибка аттача
$message_json = str_replace("\n", "\\n", $message);

// 3. Запостим в группу
$attachment = '{
                    "media": [
                        {
                            "type": "text",
                            "text": "'.$message_json.'"
                        },
                        {
                            "type": "photo",
                            "list": [
                                {
                                    "id": "'.$token.'"
                                }
                            ]
                        }
                    ]
                }';

$params = array(
    "application_key"   =>  $ok_public_key,
    "method"            =>  "mediatopic.post",
    "gid"               =>  $ok_group_id,
    "type"              =>  "GROUP_THEME",
    "attachment"        =>  $attachment,
    "format"            =>  "json",
);

// Подпишем
$sig = md5( arInStr($params) . md5("{$ok_access_token}{$ok_private_key}") );

$params['access_token'] = $ok_access_token;
$params['sig']          = $sig;

$step3 = json_decode( getUrl("https://api.ok.ru/fb.do", "POST", $params, 30, false, false ), true);

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

// Успешно
echo 'OK';

?>

Ссылки

Добавление нового приложения
Постинг в группу в одноклассниках автоматически с сайта

Поделиться
Запинить
Популярное