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

+9
1.48K

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

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

Еще от автора

Капча на сайт или разделы сайта
Если нужно, закрыть весь сайт или некоторые его разделы каптчей.
Пинг поисковых систем для первой ветки
Небольшая интеграция инструментов для пингования, чтобы сделать его чуть удобнее
Генератор карты сайта в формате txt на лету без крона
Вообще то где то тут уже есть вполне рабочие генераторы карты для первой ветки, но этот вариант тоже имеет право быть.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.