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

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

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

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

На сайте отсутствует реклама

Автор не получает прямой выгоды. Если считаете что материал полезен, поддержите проект

Номер карты

Заранее спасибо!

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

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

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

8 комментариев к “Постинг в группу в одноклассниках и вконтакте автоматически с сайта”

  1. Здравствуйте!
    Во-первых, спасибо за статью. Постинг заработал. Но не совсем так, как мне нужно.
    Если код «»attachment»=>'{«media»: [{«type»: «link»,»url»: «https://www.google.com»}]}'» оставить без изменений, то публикуется ссылка на Goggle, все в порядке. Но мне нужно опубликовать ссылку такого вида: http://sire.ru/index.php?option=com_content&view=article&id=2616:spisok&catid=74&Itemid=101
    Я добавил строку print_r ($result);
    Выдается ошибка:
    Array ( [error_code] => 104 [error_msg] => PARAM_SIGNATURE : Invalid signature ********, calculated by string Itemid=101″}]}application_key=*********attachment={«media»: [{«type»: «link»,»url»: «http://site.ru/index.php?option=com_contentcatid=74format=jsongid=********id=2616:spisokmethod=mediatopic.posttype=GROUP_THEMEview=article********SECRET KEY******* [error_data] => )
    Я так понимаю, дают ошибку символы «&» в строке адреса.

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

      Здравствуйте! Так вместо ссылки на гугл надо вставлять переменную с тем, что хотите опубликовать.Что касаемо ошибки, то ничего сказать не могу. В документации я ничего по этому поводу не нашел. Пробуйте удалять этот символ, если прокатит, то это довольно странно

  2. Вставка переменной вообще не работает. Выдает ошибку. Напишите, пожалуйста, как у Вас этот кусок кода организован.

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

      Ну вот кусок из моего старого сайта, на котором использовался этот код
      $params = array(
      "application_key"=>$config->okPubKey,
      "method"=>"mediatopic.post",
      "gid"=>"529907655649465",
      "type"=>"GROUP_THEME",
      "attachment"=>'{"media": [{"type": "link","url": "http://www.bazarbratsk.ru/'.$data['ads_url'].'"}]}',
      "format"=>"json"
      );

  3. Я так понимаю, что $data[‘ads_url’] это элемент массива. Я подставляю просто переменную, ошибка остается. Если ссылка без & то все нормально, постит без ошибок. А как только с & то выдает ошибку сигнатуры 104. У меня все ссылки с &. Пока не понял как исправить. Энкодинг пробовал. Гуглил.
    Если вдруг, есть какая-то мысль, подскажите, пожалуйста.

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

      Ну элемент массива тоже переменная, точнее значение переменной. Как вариант, можно написать в поддержку и может они либо исправят, если это ошибка с их стороны, либо чего посоветуют. Можно сделать через htaccess добавление этиъх символов или использовать свой укорачиватель ссылок. Вариантов масса как избавится от этих символов.

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

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *