Share on facebook
Share on twitter
Share on vk
Share on telegram
Share on whatsapp

Эту статью я опубликовал в далеком 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 и session_key
Получение access_token и session_key

Копируем полученные ключи.

Обратите внимание на то, что после добавления дополнительных прав доступа приложения 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, который потом скармливается группе(ссылка указывается в настройках. В итоге получился такой примитивный агрегатор.

Давно задумался доработать скрипт и дополнить его отправкой в группу в одноклассниках. Тем более что опыт в этой области уже имеется, да и скрипт почти готовый есть. Теперь новости автоматически уходят и в одноклассники. Можно ради интереса прикрутить ещё и твиттер.

Вот группа в одноклассниках, о которой идет речь: https://ok.ru/tgbratsk

Share on facebook
Share on twitter
Share on vk
Share on telegram
Share on whatsapp

Бидюков Денис

Эксперт по сайтам

Занимаюсь продвижением личного бренда с помощью сайта и SEO. Если Вы хотите из обычного сантехника, электрика, врача или фотографа стать востребованным и высокооплачиваемым  специалистом, то я с легкостью Вам помогу.