Эту статью я опубликовал в далеком 2015 году и она морально устарела. Правда не знаю в какой момент, но код в примере перестал работать. Чтобы использовать её в новом проекте мне пришлось его доработать. Теперь код снова работает. В моем случае он трудится и публикует новости местных СМИ в группу.
Давно уже озаботился данным вопросом и сколько не гуглил натыкался всегда на одно и тоже: «Нельзя постить в группу с помощью API».
Я понял что это тупик. Начал изобретать велосипед на QT WebView. Все вроде работало, но иногда происходили сбои. От этого, хитрозавернутого, способа пришлось отказался и вернуться к ручному добавлению контента в группу.
Не то, чтобы я прям следил за новостями API одноклассников, но изредка все-таки заглядывал в надежде увидеть там возможность публикации постов в группу. И о чудо! Они решили все таки разрешить публикацию контента в группу с помощью REST API. .Но для этого нужно получить соответствующие права доступа, в частности GROUP_CONTENT.
Содержание
Создание приложения
Для начала нам потребуется создать приложение в одноклассниках, нам понадобится приложение для OAuth авторизации. После регистрации приложения нам необходимо получить права GROUP_CONTENT которые позволят осуществлять постинг в группу в одноклассниках. Для этого нам необходимо написать письмо на адрес api-support@ok.ru, в письме необходимо указать ID приложения, указать требуемые права доступа и пояснить для каких целей они вам необходимы.
Обратите внимание: вы можете не получить ответ на ваше письмо (как это было у меня), поэтому проверяйте настройки своего приложения, там должны появиться требуемые права доступа
Для того, что бы попасть в настройки своего приложения необходимо указать секретный ключ приложения, который вы получили в письме после регистрации приложения.
Мне необходимы были права GROUP_CONTENT и VALUABLE_ACCESS, в письме я объяснил что VALUABLE_ACCESS мне необходимы для публикации объявления поданного пользователем на его странице, а GROUP_CONTENT необходим для публикации объявлений в группе моего сайта. Честно говоря я не совсем понимаю зачем мейловцы ограничивают возможности своего API.
Получаем ключи для запроса к API
Как только наше приложение получает права на публикацию в группу, нам необходимо получить access_token, для этого необходимо в самом низу в блоке «Access token» ткнуть на кнопку «Получить».
Копируем полученные ключи.
Обратите внимание на то, что после добавления дополнительных прав доступа приложения access_token работать перестанет, его необходимо будет получить заново.
Теперь мы можем отправлять запросы на публикацию постов, я в своей группе публикую ссылки на объявления со своего сайта/
Рабочий пример по этой ссылке.
Публикация постов в группе
<?php
function get_url( $url, $type="GET", $params=array(), $timeout=30 ) {
if ( $ch = curl_init() ) {
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_HEADER, false );
if ( $type == "POST" ) {
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_POSTFIELDS, urldecode( http_build_query( $params ) ) );
}
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_setopt( $ch, CURLOPT_USERAGENT, 'PHPBot' );
$data = curl_exec( $ch );
curl_close( $ch );
return $data;
} else {
return "{}";
}
}
function arr_in_str( $array ) {
ksort( $array );
$string = "";
foreach( $array as $key=>$val ) {
if ( is_array( $val ) ) {
$string .= $key."=".arr_in_str( $val );
} else {
$string .= $key . "=" . $val;
}
}
return $string;
}
$ok_access_token = "";//Наш вечный токен
$ok_private_key = "";//Секретный ключ приложения
$ok_public_key = "";//Публичный ключ приложения
$ok_session_key = "";//Секретный ключ сессии
$media = array( "media" => array(
array( "type"=> "text","text"=> "Текст поста" ),
array( "type"=> "link","url"=> "https://yandex.ru" )//Таким образом можете удалятьб или добавлять разные блоки в пост
)
);
$params = array(
"application_key"=>$ok_public_key,
"method"=>"mediatopic.post",
"gid"=>"52990304649",//ID нашей группы
"type"=>"GROUP_THEME",
"attachment"=>'{"media": [{"type": "link","url": "https://www.google.com"}]}',//Вместо https://www.google.com естественно надо подставить нашу ссылку
"format"=>"json"
);
$sig = md5( arr_in_str( $params ) . $ok_session_key ); //подписываем запрос секретным ключом
$params["access_token"] = $ok_access_token; //Добавляем наш токен
$params["sig"] = $sig; //Добавляем полученный хеш
$result = json_decode( get_url( "https://api.ok.ru/fb.do", "POST", $params ), true ); //Отправляем пост
//Если парсер не смог открыть нашу ссылку (иногда он это делает со второй попытки), то мы получим ошибку 5000, просто отправим запрос ещё разок, этого хватит
if ( isset( $result['error_code'] ) && $result['error_code'] == 5000 ) {
get_url( "https://api.ok.ru/fb.do", "POST", $params );
}
/*
Если хотите чтобы пост был отправлен гарантировано, то есть смысл попробовать примерно такую конструкцию
do {
$result = json_decode( get_url( "https://api.ok.ru/fb.do", "POST", $params ), true ); //Отправляем пост
} while ( isset( $result['error_code'] ) && $result['error_code'] == 5000 );
Цикл будет повторяться пока сервер возвращает ошибку 5000 при успешной отправке или получении ошибки отличной от 5000 цикл сработает один раз.
*/
Для отправки других типов постов вам потребуется незначительно изменить список параметров, какие параметры и для каких типов постов вы можете посмотреть на этой странице.
Если у вас возникли вопросы, то пишите удобным для вас способом (вибер, ватсап, вк и т.д.), постараюсь ответить оперативно.
Пример применения
Первым применением этого скрипта произошло на моем сайте объявлений давным давно. На данный момент этого сайта нет. Зато есть группы, в которые собираются новости с местных СМИ. В группу ВК они попадают из сформированного RSS, который потом скармливается группе(ссылка указывается в настройках. В итоге получился такой примитивный агрегатор.
Давно задумался доработать скрипт и дополнить его отправкой в группу в одноклассниках. Тем более что опыт в этой области уже имеется, да и скрипт почти готовый есть. Теперь новости автоматически уходят и в одноклассники. Можно ради интереса прикрутить ещё и твиттер.