В прошлом посте я демонстрировал схему автопостинга сообщений из ленты активности сайта на канал в Telegram.
Здесь реверс — движение в другую сторону.
В моём случае функция оказалась бесполезной, попробовал, настроил, побаловался, убрал. На канале телеграм я публикую чаще чем на сайте в итоге лента сайта получается нагружена виджетами с постами телеграм, что мне категорически не нравится, поэтому пока я убрал эту возможность у себя, возможно — в будущем в каком то другом виде. Тем не менее, я хотел бы описать сам принцип.
Перед началом делаем бэкап базы данных и изменяемых файлов, а лучше вообще — тестируем на тестовом сайте)
1. Создайте канал и бота в телеграме, добавьте бота админом на свой канал.
2. Создаём php файл, например mybot.php
Вставляем в него этот код (я там прокомментировал основные моменты):
<?php // echo '200 ok'; //подключаем СMS include(PATH.'/core/cms.php'); cmsCore::getInstance(); $inDB = cmsDatabase::getInstance(); //немного найстроек $mytgID = '';//мой ид в телеграм $tgcUsername = '';//@username канала в телеграм $tgcName = '';//название канала в телеграм $botToken = '';//токен вашего бота $path = "https://api.telegram.org/".$botToken; //если на вебхук пришло сообщение с содержимым нового поста на канале, начинаем работать if($update["channel_post"]['message_id'] && $update["channel_post"]['sender_chat']['title'] == $tgcName){ //готовим данные для ленты активности 'pubdate'=>$pdat, 'user_id'=>0, //пользователь сайта с id 0, то есть гость, можно создать специального пользователя и указать его ид '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>',//стандартный виджет поста телеграм с указанием нужного поста 'published'=>1, 'action_id'=>366 //идентификатор события в таблице cms_actions, сначала нужно зайти в php admin и создать это событие, начните копировать другое уже имеющееся событие и при копировании укажите свои данные - название события, и т п, потом полученный идентификатор укажите здесь ); //пишем массив в базу данных в таблицу с логами ленты активности $insertlogid = $inDB->insert('cms_actions_log', $insertlog); //получаем в телеграм идентификатор только что созданной записи в ленте активности и задаем команду для удаления этой записи из ленты прямо из приложения, через своего бота, чтобы не лезть в админку, на всякий случай $todeletefromfeed = 'Добавлено в ленту на сайте:%0A'; $todeletefromfeed .= 'https://t.me/'.$tgcUsername.'/'.$update["channel_post"]['message_id'].'%0A%0A'; $todeletefromfeed .= 'Удалить с сайта: /del'.$insertlogid; } //при получении команды на удаление записи из ленты активности, удаляем её if($update["message"]["chat"]["id"] == $mytgID){ $inDB->delete('cms_actions_log', " id = '{$command}'", 1); } }
Кладём этот файл в корень сайта.
3. И теперь активируем вебхук в настройках бота
для этого нужно в браузере открыть ссылку вида
https://api.telegram.org/ЗДЕСЬВАШТОКЕН/setWebhook?url=ПолныйАдресДоФайлаНаВашемСайтеHTTPS
Я пишу события из телеграм канала от имени гостя. По умолчанию, в шаблоне всегда должно выводиться имя пользователя и ссылка на профиль. Исправить это можно размещая такие посты от имени специального пользователя или исправив шаблон, добавив туда условие
Например вместо
<a href="{$action.user_url}" class="action_user">{$action.user_nickname}</a>
то же самое но с проверкой на наличие имени пользователя
{if $action.user_nickname}<a href="{$action.user_url}" class="action_user">{$action.user_nickname}</a>{/if}
Если интересно посмотреть демо, на моем сайте unila ru в ленте актиновности на второй или третьей странице есть пара виджетов с постами телеграм, добавленные туда таким образом.