Автопубликация материалов в социальную сеть одноклассники

Недавно понадобилось для одного проекта сделать автоматическую публикацию материалов в основные социальные сети: вконтакте, facebook, twitter и одноклассники.

С первыми 3-мя проблем не возникло, т.к. есть хороший модуль с гибкой настройкой http://marketplace.1c-bitrix.ru/solutions/vettich.autoposting/

Для публикации в одноклассники и другие социальные сети у разработчика есть платная версия модуля http://marketplace.1c-bitrix.ru/solutions/vettich.autopostingplus/
Но, судя по обсуждениям и реакции разработчика на вопросы, данный модуль длительное время не обновлялся и публикация в одноклассники не работает. Длительное ожидание ответа от разработчика и ручная публикация ссылок в группе в одноклассниках, заставили подумать о собственном решении данного вопроса.

Покопался в интернете и нашел несколько полезных статей:

http://shtyrlyaev.ru/all/skript-avtopostinga-v-gruppu-odnoklassnikov/ - о том как создать приложение и произвести необходимые настройки.
http://dampi.ru/posting-v-gruppu-v-odnoklassnikah-avtomaticheski-s-sayta - непосредственно сам код для публикации.

Задача следующая:
После добавления материала в инфоблок по событию OnAfterIBlockElementAdd проверять на соответствие разрешенному IBLOCK_ID и производить публикацию.

Сам код необходимо разместить в файле /bitrix/php_interface/init.php: ====code====

AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("AutoPostingOK", "Posting"));

Class AutoPostingOK
{
   const OK_ACCESS_TOKEN    = "";  // Наш вечный токен
   const OK_PRIVATE_KEY     = "";  // Секретный ключ приложения
   const OK_PUBLIC_KEY      = "";  // Публичный ключ приложения
   const OK_GROUP_ID        = "";  // 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 = AutoPostingOK::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;
   }
   
   function Posting(&$arFields)
   {
      define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/upload/posting_ok.txt");//путь для записи log-файла
      $POSTING_IBLOCK = Array(1,2);//ID инфоблоков, для которых надо публиковать материалы
      
      if($_SERVER["HTTPS"])
         $PROTOCOL = 'https';
      else
         $PROTOCOL = 'http';
      
      
      if(in_array($arFields["IBLOCK_ID"], $POSTING_IBLOCK) && $arFields["RESULT"]==true)
      {
         $ok_access_token = AutoPostingOK::OK_ACCESS_TOKEN;
         $ok_private_key = AutoPostingOK::OK_PRIVATE_KEY;
         
         CModule::IncludeModule("iblock");
         $res = CIBlockElement::GetByID($arFields["ID"]);
         if($ar_res = $res->GetNext())
         {
            $arFields["DETAIL_PAGE_URL"] = $ar_res["DETAIL_PAGE_URL"];
         }
         
         $params = array(
            "application_key"   =>  AutoPostingOK::OK_PUBLIC_KEY,
            "method"            =>  "mediatopic.post",
            "gid"               =>  AutoPostingOK::OK_GROUP_ID,
            "type"              =>  "GROUP_THEME",
            "attachment"      =>   '{"media": [{"type": "link","url": "'.$PROTOCOL.'://'.$_SERVER["SERVER_NAME"].$arFields["DETAIL_PAGE_URL"].'"}]}',
            "format"=>"json"
         );
         
         $sig = md5(AutoPostingOK::arInStr($params).md5("{$ok_access_token}{$ok_private_key}"));
         $params["access_token"]=$ok_access_token;
         $params["sig"]=$sig;
         
         $result = json_decode(AutoPostingOK::getUrl("https://api.ok.ru/fb.do", "POST", $params), true);
         
         if (isset($result['error_code']) && $result['error_code'] == 5000) {
            AutoPostingOK::getUrl("https://api.ok.ru/fb.do", "POST", $params);
         }
         
         if (isset($result['error_code'])) {
            AddMessage2Log("Публикация элемента ID:{$arFields["ID"]} прошла с ошибкой: ".$result['error_code'].'. Текст ошибки: '.$result['error_code'].'. Ошибка данных: '.$result['error_data'], "iblock");
         }
      }
   }
} 
============= Обязательно укажите значение констант: OK_ACCESS_TOKEN, OK_PRIVATE_KEY, OK_PUBLIC_KEY, OK_GROUP_ID.
Укажите, элементы каких инфоблоков необходимо публиковать в одноклассники. Переменная $POSTING_IBLOCK.
Отчет об ошибках будет падать в файл /upload/posting_ok.txt

Публикация происходит успешно, ошибок не вываливает. Всем удачи!

Автор : bi3ks

Статус заказа в Одноклассниках

Автоматические оповещения ваших пользователей об изменениях статуса заказа через сообщения вашего сообщества в Одноклассниках.
Оповещения об изменении статусов заказа через сообщества в Одноклассниках, могут стать дополнительным удобством для Ваших пользователей и даже заменить оповещения через СМС сообщения. В отличии от оповещения через СМС, у пользователей появляется возможность для обратной связи с Вами через сообщения в Одноклассниках, что позволит улучшить сервис и быстрее реагировать на возникающие проблемы.
Преимущества оповещений через Одноклассники:
  • Низкая цена оповещений, по сравнению с СМС.
  • Возможность получения обратной связи через сообщения в Одноклассниках.
  • Оповещения через Одноклассники сочетают в себе доступность почтовой рассылки с эффективностью СМС сообщений.


Категория: Для интернет-магазина, Подписки и рассылки, Работа с заказами, Поддержка клиентов
Бесплатный модуль
Разработчик: Happy Santa

Категории : Новости Marketplace
Автор : bi3ks