Автопостинг с канала в Telegram в ленту активности сайта (Первая ветка)

+8
265

В прошлом посте я демонстрировал схему автопостинга сообщений из ленты активности сайта на канал в Telegram.

Здесь реверс — движение в другую сторону.

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

Перед началом делаем бэкап базы данных и изменяемых файлов, а лучше вообще — тестируем на тестовом сайте)

1. Создайте канал и бота в телеграме, добавьте бота админом на свой канал. 

2. Создаём php файл, например mybot.php

Вставляем в него этот код (я там прокомментировал основные моменты):

  1. <?php
  2. //
  3. echo '200 ok';
  4. //подключаем СMS
  5. define('PATH', dirname(__FILE__));
  6. define("VALID_CMS", 1);
  7. include(PATH.'/core/cms.php');
  8. cmsCore::getInstance();
  9. $inDB = cmsDatabase::getInstance();
  10.  
  11. //немного найстроек
  12. $mytgID = '';//мой ид в телеграм
  13. $tgcUsername = '';//@username канала в телеграм
  14. $tgcName = '';//название канала в телеграм
  15. $botToken = '';//токен вашего бота
  16.  
  17. $path = "https://api.telegram.org/".$botToken;
  18. $update = json_decode(file_get_contents("php://input"), TRUE);
  19.  
  20. //если на вебхук пришло сообщение с содержимым нового поста на канале, начинаем работать
  21. if($update["channel_post"]['message_id'] && $update["channel_post"]['sender_chat']['title'] == $tgcName){
  22.  
  23. //готовим данные для ленты активности
  24. $pdat = date("Y-m-d H:i:s");
  25. $insertlog = array(
  26. 'pubdate'=>$pdat,
  27. 'user_id'=>0, //пользователь сайта с id 0, то есть гость, можно создать специального пользователя и указать его ид
  28. 'description'=>'<script async src="https://telegram.org/js/telegram-widget.js?15" data-telegram-post="'.$tgcUsername.'/'.$update["channel_post"]['message_id'].'" data-width="100%"></script>',//стандартный виджет поста телеграм с указанием нужного поста
  29. 'published'=>1,
  30. 'action_id'=>366 //идентификатор события в таблице cms_actions, сначала нужно зайти в php admin и создать это событие, начните копировать другое уже имеющееся событие и при копировании укажите свои данные - название события, и т п, потом полученный идентификатор укажите здесь
  31. );
  32.  
  33. //пишем массив в базу данных в таблицу с логами ленты активности
  34. $insertlogid = $inDB->insert('cms_actions_log', $insertlog);
  35.  
  36. //получаем в телеграм идентификатор только что созданной записи в ленте активности и задаем команду для удаления этой записи из ленты прямо из приложения, через своего бота, чтобы не лезть в админку, на всякий случай
  37. $todeletefromfeed = 'Добавлено в ленту на сайте:%0A';
  38. $todeletefromfeed .= 'https://t.me/'.$tgcUsername.'/'.$update["channel_post"]['message_id'].'%0A%0A';
  39. $todeletefromfeed .= 'Удалить с сайта: /del'.$insertlogid;
  40.  
  41. file_get_contents($path."/sendmessage?chat_id=".$mytgID."&text=".$todeletefromfeed);
  42.  
  43. }
  44.  
  45. //при получении команды на удаление записи из ленты активности, удаляем её
  46. if (strpos($update["message"]["text"], "/del") === 0) {
  47. if($update["message"]["chat"]["id"] == $mytgID){
  48. $command = substr($update["message"]["text"], 4);
  49. $command = trim($command);
  50. $inDB->delete('cms_actions_log', " id = '{$command}'", 1);
  51. }
  52. }
  53.  

Кладём этот файл в корень сайта.

3. И теперь активируем вебхук в настройках бота

для этого нужно в браузере открыть ссылку вида

  1. https://api.telegram.org/ЗДЕСЬВАШТОКЕН/setWebhook?url=ПолныйАдресДоФайлаНаВашемСайтеHTTPS

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

Например вместо 

  1. <a href="{$action.user_url}" class="action_user">{$action.user_nickname}</a>

то же самое но с проверкой на наличие имени пользователя

  1. {if $action.user_nickname}<a href="{$action.user_url}" class="action_user">{$action.user_nickname}</a>{/if}

Если интересно посмотреть демо, на моем сайте unila ru в ленте актиновности на второй или третьей странице есть пара виджетов с постами телеграм, добавленные туда таким образом. 

Нет комментариев. Ваш будет первым!

Еще от автора

Автопостинг из ленты активности сайта на канал в телеграм для первой ветки
Заметил на форуме вопрос про автопостинг в телеграм для второй ветки.
Изменения в компоненте «баннеры»: количество, внешний вид, формат ссылки
Немного изменил компонент баннеры. Вместо одного баннера, теперь выводится два подряд.
Разное содержимое sitemap.xml для каждого из зеркал при мультиязычности сайта
В прошлом посте, который был посвящён организации мультиязычности сайта на Instant 1* посредством поддоменов смотрящих в один и тот же каталог на хост
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.