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

Недавно понадобилось для одного проекта сделать автоматическую публикацию материалов в основные социальные сети: вконтакте, 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

Андрей Рябин: Спасибо ребятам за документацию + конкурс (модуль редактор для контент менеджеров)

:)
Сложно делать примеры интеграции редактора блоков для типовых решений, особенно когда у тебя их нет.

В этот раз мне на помощь пришли два Павла и написали как они добавляли редактор к каталогам товаров

Аспро-Оптимус
https://bitbucket.org/andrey_ryabin/sprint.editor/wiki/Example1-AsproOptimus

Битроник 2
https://bitbucket.org/andrey_ryabin/sprint.editor/wiki/Example2-Bitronic


Мне очень понравилась такая помощь и я объявляю конкурс

Сделайте пример интеграции редактора (например демоверсии) для вашего проекта и получите новую лицензцию на модуль!




Маркетплейс
http://marketplace.1c-bitrix.ru/solutions/sprint.editor/

Документация
https://bitbucket.org/andrey_ryabin/sprint.editor/wiki/Home

Автор :

Дмитрий Медведев: Повышение минимальной версии PHP до 5.6

С 1 января 2018 года минимальные требования для БУС и КП повышаются до PHP 5.6. Это значит, что сайты и порталы с устаревшими версиями перестанут получать обновления до тех пор, пока не обновят PHP до версий 5.6, 7.0 или 7.1. В ближайшее время в системе обновлений всех сайтов появится соответствующее предупреждение.

Более подробно: https://dev.1c-bitrix.ru/community/blogs/orm/bitrix-minimal-php-version-to-56.php

Автор :

AndreyChursin: Всегда хотелось узнать, действительно мнение разработчиков CMS Bitrix (но не диких гиков, которые код целиком переписывают…)

Всегда хотелось узнать, действительно мнение разработчиков CMS Bitrix (но не диких гиков, которые код целиком переписывают...)

Автор :

Михаил Вашуков: Прошу помощи, нужно на перехватить весь html код, всех компонентов перед выдачей посетителю, с целью его обработки определенным php скриптом и потом выдать. Подскажите, пожалуйста, как это лучше реализовать?

Прошу помощи, нужно на перехватить весь html код, всех компонентов перед выдачей посетителю, с целью его обработки определенным php скриптом и потом выдать. Подскажите, пожалуйста, как это лучше реализовать?

Автор :

Станислав Шашалевич: Жулики, мошенники, пираты: bitrix-webstudio.ru

Здравствуйте, уважаемые партнеры 1С-Битрикс. К сожалению, мы вынуждены продолжить цикл статей о нерадивых партнерах, а фактически о мошенниках, которые дискредитируют Битрикс-сообщество.

Итак, обо всем по порядку.

В июле месяце к нам обратился клиент, который сообщил, что один "партнер» продает наше решение МиссШоп по цене 49 000 руб., хотя официальная цена – 199 900 руб. То есть фактически цена дешевле в 4 раза!!! Из этого можно сразу сделать вывод, что эти ребята не покупают решение по партнерской цене, а просто фактически ломают его и внедряют клиентам.

Мы решили внимательно ознакомиться с их сайтом http://bitrix-webstudio.ru/ и вот что выяснили:

1. На их сайте представлены и другие решения со скидками: Аспро, Кузница, Альфа, Ромза и тд. Повторюсь, что самый большой демпинг цен был, конечно, по нашему интернет-магазину МиссШоп – аж в 4 раза! Вот скрины цен на продукты Марктеплейс, представленные на их сайте, на случай, если эти ребята одумаются и сделают цены правильными. Думаем, Вы найдете здесь и свой продукт, но по заниженной цене:
http://joxi.ru/GrqOpMSQEv7L2z

http://joxi.ru/p27MP8So7Pw5r7

http://joxi.ru/zANEW0iBo3MN29

http://joxi.ru/MAjYq0U4gpbB2e

Скрины сделаны в июле месяце, то есть до августовской акции.

2. В портфолио обнаружили проект, который уже разработан на основе нашего МиссШоп. То есть у них уже существует опыт взлома и внедрения нашего (думаем, не только нашего) типового интернет-магазина стильных вещей.

3. На главной странице висел лейбл "Золотой партнер», но, к сожалению, ссылка на карточку партнера отсутствовала.

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

Идем дальше. Простое ознакомление с сайтом нас не остановило, и мы решили продвинуться дальше, чтобы вывести этих ребят на чистую воду.План был простой: созвон от имени клиента и просьба о скидке как на Битрикс, так и на МиссШоп. Цель: получить счет по заниженной цене и отправить все эти данные непосредственно в 1С-Битрикс, который уже завершит начатое нами дело. И вот что из этого вышло.

Звоним по номеру, указанному в контактах: +7 (499) 390-19-04. Трубку сначала не берут. Через минут 20 перезвонил некто Алексей, который готов был ответить на все наши вопросы. Мы рассказали, что хотим интернет-магазин одежды и нам понравился МиссШоп, а цены у них самые демократичные. Мы даже ненавязчиво попытались узнать, почему цены у них ниже, но, к сожалению, Алексей ушел от ответа и просто сказал, что лучше вышлет нам на почту КП. Мы согласились.

И вот как выглядело КП от Алексея: http://joxi.ru/GrqOpMSQEa4J2z


====quote====
Здравствуйте!

Уважаемый Владислав, в продолжение разговора да действительно можем предложить Вам шаблон: http://miss-shop.sotbit.ru

за 49000 руб, к нему Вам потребуется лицензия 1С-Битрикс Управление сайтом "Малый бизнес" 35900 руб / "Бизнес" 72900 руб, при покупке лицензии у нас рады предлосжить скидку 10% от фиксированной стоимости т е "Малый бизнес" - 32310 руб / "Бизнес" - 65610 руб
Это наилучшее из готовых решений на Битрикс по тематике интернет-магазин одежды.

=============
Нам даже не пришлось просить скидку на Битрикс. Они нам сами с удовольствием предоставили 10% скидку. Наверное, это было самое интересное в их КП. Ну и, конечно, потешили наше самолюбие и сказали, что МиссШоп – наилучшее из решений по тематике одежды.

Еще одна ремарка: продажа лицензий Битрикс по цене, отличной от официальной, строго запрещена согласно партнерскому договору. За выявление подобных фактов грозит лишение партнерского статуса. Именно поэтому мы были рады предоставленной скидке на Битрикс в размере 10%.

Далее мы сразу еще раз созвонились с Алексеем и уже уточнили, а в каком виде мы получим продукты: ключи, купоны, диски или как вообще? На что Алексей ответил, что они нам просто сами все установят. Никаких ключей и прочего не будет, но они все сделают в лучшем виде. А это и понятно, ведь по цене в 4 раза ниже МиссШоп они могут установить лишь самостоятельно, предварительно взломав его.

После этого мы сделали небольшую паузу, чтобы не спугнуть ребят. Лишь через пару дней мы запросили у них договор и счет на поставку Бизнеса и МиссШоп. Мы думали, что может быть проще выставить счет на ПО? Думали, что сейчас получим от них быстро договор и дело в шляпе. Но, оказалось, все не так просто.

Договор и счет мы получили, но не на ПО, а фактически на услугу по разработке сайта. То есть мы платили за услугу, а не за продукты. Про Битрикс и МиссШоп было указано вскользь лишь в одном месте. Но ни цен на эти продукты, ни обычной спецификации на продукты предоставлено не было. Да и вообще договор ужасный и явно подготовлен непрофессионалами.

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

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

Реквизиты мошенника:


Общество с ограниченной ответственностью "ТД БИЗНЕС ФОРМАТ"

ИНН 5031050184

КПП 503101001

ОГРН 1025003914374

ОКПО 59366972

Адрес: 142403, Московская обл, р-н Ногинский, г Ногинск, пер. Пожарный 1

Телефоны: +7 (499) 390-19-04, +7 (967) 196-02-71

Сайт: bitrix-webstudio.ru

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

Также надеемся, что подобная история станет уроком для всех пользователей платформы 1С-Битрикс. Приобретая явно дешевый продукт, Вы рискуете, в первую очередь, своим проектом и своими же деньгами. Если бы клиент действительно приобрел МиссШоп у этих ребята по такой цене, то получил бы непонятный продукт без возможности обновлений и оказания техподдержки. К тому же, клиент бы даже не предполагал, что ему продают заведомо нелицензионный продукт. И какого было бы его удивление, когда все это вскрылось. Поэтому, дорогие наши клиенты, если Вам предлагают что-то дешевле официальной цены, то лучше предварительно тщательно проверьте продавца, который занижает цену. Также рекомендуем обратиться к непосредственному разработчику решения и уточнить у него ценовую политику по данному решению.

А для нас с Вами, дорогие партнеры и разработчики, это пример того, что подобных мошенников можно выявлять и выводить на чистую воду. Всех, конечно, не выведешь, но пытаться надо. И вообще, обо всех случаях пиратства просим сообщать непосредственно в 1С-Битрикс и Битрикс сообщество, чтобы все были в курсе и знали "своих героев", то есть пиратов, в лицо.

Всем удачных продаж в августе!) Даже мошенникам. Им это особенно необходимо. Других вариантов для заработка у них нет)


Автор :

Евгений Микулич: Очередной баг в битрикс? Или немного хайпа

Итак немного вводных данных:
- есть 1 файл в корне .profile.menu.php, который формирует меню для всех видов пользователей, для авторизованных и для неавторизованных ====code====

<?
if (AppPage::in(['/cart/', '/order/'])){
    $aMenuLinks = [
        [
            "Корзина",
            "/cart/",
            Array(),
            Array(),
            ""
        ],
        [
            "Заказ",
            "/order/",
            Array(),
            Array(),
            ""
        ]
    ];
}

if ($USER->isAuthorized() && !AppPage::in(['/cart/', '/order/'])){
    $aMenuLinks = [
        Array(
            "Личные данные",
            "/personal/",
            Array(),
            Array(),
            "$USER->IsAuthorized()"
        ),
        Array(
            "Изменение пароля",
            "/personal/change_password/",
            Array(),
            Array(),
            "$USER->IsAuthorized()"
        ),
        Array(
            "Мои заказы",
            "/personal/orders/",
            Array(),
            Array(),
            "$USER->IsAuthorized()"
        ),
        Array(
            "Избранное",
            "/personal/favorite/",
            Array(),
            Array(),
            "$USER->IsAuthorized()"
        ),
        Array(
            "Бонусная программа",
            "/personal/bonus/",
            Array(),
            Array(),
            "$USER->IsAuthorized()"
        ),
        Array(
            "Обратная связь",
            "/personal/feedback/",
            Array(),
            Array(),
            "$USER->IsAuthorized()"
        )
    ];
}

if (!$USER->isAuthorized() && !AppPage::in(['/cart/', '/order/'])){
    $aMenuLinks = [
        Array(
            "Регистрация",
            "/register/",
            Array(),
            Array(),
            ""
        ),
        Array(
            "Вход в аккаунт",
            "/auth/",
            Array(),
            Array(),
            ""
        ),
        Array(
            "Восстановить пароль",
            "/auth/?forgot_password=yes",
            Array(),
            Array(),
            ""
        ),
        Array(
            "Избранное",
            "/personal/favorite/",
            Array(),
            Array(),
            ""
        ),
    ];
}
============= - есть страница корзины, которая ничем не отличается для обоих видов пользователей там лишь 2 ссылки на корзину и на заказ, и есть страницы персонального раздела
- под авторизованным пользователем я вижу 2 ссылки на корзину и заказ, вод неавторизованным, я вижу 2 ссылки, но ведут они на регистрацию и авторизацию (хотя вести должны туда же)
- Параметры компонента bitrix.menu ====code====
'ROOT_MENU_TYPE' => 'profile',
"MAX_LEVEL" => "1",
"CHILD_MENU_TYPE" => "",
"USE_EXT" => "N",
"DELAY" => "Y",
=============
Почему такое поведение?
А вот почему/ Тут лежит файл с обработкой меню, в котором зашит кеш для меню '/bitrix/modules/main/classes/general/menu.php', в котором ====code====
$bCacheIsAllowed = CACHED_menu!==false && !$USER->IsAuthorized() && $this->MenuExtDir == '';
if($bCacheIsAllowed)
{
   $cache_id = $_SERVER["DOCUMENT_ROOT"].",".$this->MenuDir.",,".$this->type;
   if($CACHE_MANAGER->Read(CACHED_menu, $cache_id, "menu"))
   {
      $arMenuCache = $CACHE_MANAGER->Get($cache_id);
      $bCached = true;
   }
}
============= Далее переменная bCached используется для формирования меню. bCacheIsAllowed - есть ключ авторизации пользователя, а в формировании кеша этого ключа нет, из за чего далее ====code====
foreach($this->arMenu as $iMenuItem=>$MenuItem)
{
   $TEXT = $MenuItem[0];

   if($bCached)
   {
      $LINK = $arMenuCache[$iMenuItem]["LINK"];
   }
   else
   {
      //if the link is relative let's transform it to absolute
      if(!preg_match("'^(([A-Za-z]+://)|mailto:|jav * ascript:|#)'i", $MenuItem[1]))
      {
         $LINK = Rel2Abs($this->MenuDir, $MenuItem[1]);
      }
      else
      {
         $LINK = $MenuItem[1];
      }
      $arMenuCache[$iMenuItem]["LINK"] = $LINK;
   }
============= Текст берётся из $MenuItem а ссылка из $arMenuCache, происходит это на методе в компоненте ====code====
$menu->RecalcMenu($arParams["ALLOW_MULTI_SELECT"], $arParams["CACHE_SELECTED_ITEMS"])
=============
До него меню формируется верно, после него происходит наложение закешированного меню, на собранное уже до этого ранее меню и заменяются ссылки, а названия остаются.

Не очень баг, так как исправить безкостыльно не представляется возможным ,кроме формирования нового файла меню, что как бы раздражает, так как всё у меня лежит в одном месте.

Автор :

Валерий Чебан: Еще один способ бороться с DDoS-атаками: модуль для апатча mod_evasive2

CoqkE.jpg
DDoSSS!!! SOS!!!



Есть модуль, который позволяет автоотлавливать дос-ботов, или наглых парсеров, одним словом бороться с DDoS.

Конфигурируем Апатч, включаем модуль,

1/ редактируем файл httpd.conf:

====code====
LoadModule evasive2_module modules/mod_evasive2.so

<IfModule evasive2_module>
    DOSDisplayToken Off
    DOSHashTableSize 3097
    DOSPageCount 2
    DOSSiteCount 50
    DOSPageInterval 1
    DOSSiteInterval 1
    DOSBlockingPeriod 10
    DOSLogDir "<Your-dir>Apache/logs"
    DOSWhitelist 127.0.0.1
    DOSWhitelist 192.168.1.*
</IfModule>
=============

В итоге поганцы отлавливаются и блокируются:

2017-07-23_04-05-47.png

2/
Имеем еще одну защиту нашего апатча от DDoS-атак.

Интересно было бы, если кто-то еще поделился своим опытом использования модуля,
в принципе, при наличии прямых рук легко прикручивается к апатчу на bitrix VM.

Либо может еще есть удобные какие-то способы у вас.

[для врезки вправо]

На последок для выявления перегруза слотов апатча, команды через SSH:

4/
вывести список самых активных посетителей
====code====
cat /var/log/httpd/access_log | awk ' {print $1}' | sort | uniq -c | sort -n | tail -n 10
=============

5/
Инфо по посетителю 5.255.253.63:
====code====
cat /var/log/httpd/access_log | grep 5.255.253.63 | head -1
=============

Автор :

Задойный Алексей: Опрос — используете ли вы на бою GIT?

У всех разные процессы деплоя. Я вполне допускаю, что кто-то использует git только в IDE для того чтобы пушить на боевой сервер, либо на сервер сборки, откуда например вебхуками код уйдёт на бой. Впрочем даже в последнем случае наверное иногда возникает потребность зайти на бой по ssh и сделать в системе контроля версий НЕЧТО (откатиться, например).

Так вот, мой опрос именно про то, используете ли вы GIT именно на боевом сервере.
Ну и если используете, то какие обычно операции выполняете.
Если какие-то операции выполняются редко, но регулярно (например, раз в месяц), то интересно было бы узнать в комментариях что это за такие особые сценарии

Автор :
1 2 3 4 5
Страница 3 из 5