Разное

Разработка простого Telegram-бота (часть 2), интеграция с 1С-Битрикс: Управление сайтом

В прошлой статье мы посмотрели как возможно сделать Telegram-бота на python с очень простым функционалом. Сейчас мы пойдем немного дальше и подумаем над тем как этого простого бота можно интегрировать с СУС «1С-Битрикс: Управление сайтом».

Не будем далеко отступать от Telegram-бота из прошлой статьи. Лишь постараемся добавить в него следующий функционал. При отправке сообщения в чате это сообщение будем фиксировать в качестве элемента информационного блока Битрикс. Напомню код бота из предыдущей статьи.

import telebot

bot = telebot.TeleBot('ЗДЕСЬ_ВВОДИМ_TOKEN')

@bot.message_handler(content_types=["text"])
def handle_text(message):
    bot.send_message(message.chat.id, 'Ваше сообщение: ' + message.text)

bot.polling(none_stop=True, interval=0)

Поскольку общение с Telegram у нас построено на python, а Битрикс работает на php, то в качестве интерфейса взаимодействия выберем SOAP (есть и другие варианты, о них попробую написать в следующей статье).

Со стороны Битрикс есть специальный модуль для организация такого рода взаимодействия — «Веб-сервисы». Со стороны python в качестве модуля SOAP-клиента выберем zeep.

Начнем с создания инфраструктуры со стороны 1С-Битрикс. Для этого создадим информационный блок для хранения записей, которые будут приходить от SOAP-клиента на python.

Далее необходимо в Битрикс создать ряд файлов для работы SOAP. Не забудем включить также и модуль «Веб-сервисы»!

Создаем папку компонента в своем пространстве имен. Например /bitrix/components/demo/webservice.addmes/

В этой папке нужно создать следующие файлы:

.parameters.php

<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

$arComponentParameters = array(
   "GROUPS" => array(),
   "PARAMETERS" => array(),
   );
?>

.description.php

<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

$arComponentDescription = array(
   "NAME" => "Веб-сервис добавления сообщений от Telegram-бота",
   "DESCRIPTION" => "Веб-сервис добавления сообщений от Telegram-бота",
   "CACHE_PATH" => "Y",
   "PATH" => array(
      "ID" => "service",
      "CHILD" => array(
         "ID" => "webservice",
         "NAME" => "Веб-сервис добавления сообщений от Telegram-бота"
      )
   ),
);
?>

component.php

<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

if(!CModule::IncludeModule("webservice") || !CModule::IncludeModule("iblock"))
   return;
   
class CAddMesWS extends IWebService
{
   static public function GetWebServiceDesc() 
   {
      $wsdesc = new CWebServiceDesc();
      $wsdesc->wsname = "bitrix.webservice.addmes";
      $wsdesc->wsclassname = "CAddMesWS"; // название класса
      $wsdesc->wsdlauto = true;
      $wsdesc->wsendpoint = CWebService::GetDefaultEndpoint();
      $wsdesc->wstargetns = CWebService::GetDefaultTargetNS();

      $wsdesc->classTypes = array();
      $wsdesc->structTypes = Array();
      $wsdesc->classes = array(
		   "CAddMesWS"=> array(
			  "AddItem" => array(
				 "type"      => "public",
				 "input"      => array(
					"TEXT" => array("varType" => "string"),
					),
				 "output"   => array(
					"id" => array("varType" => "integer")
				 ),
				 "httpauth" => "Y"
			  ),
		   )
		);

      return $wsdesc;
   }
   
   public static function AddItem($TEXT) 
  {
	   $iblock_permission = CIBlock::GetPermission(920);   
	   if ($iblock_permission < "W")
	   {
		  $GLOBALS["USER"]->RequiredHTTPAuthBasic();
		  return new CSOAPFault('Server Error', 'Unable to authorize user.');
	   }
	   $arFields = Array(
			 "IBLOCK_ID"=>IBLOCK_ID,
			 "NAME"=>$TEXT
		  );
	   $ib_element = new CIBlockElement();
	   $result = $ib_element->Add($arFields);
	   if($result>0)
		  return Array("id"=>$result);

	   return new CSOAPFault( 'Server Error', 'Error: '.$ib_element->LAST_ERROR );
	}
}

$arParams["WEBSERVICE_NAME"] = "bitrix.webservice.addmes";
$arParams["WEBSERVICE_CLASS"] = "CAddMesWS";
$arParams["WEBSERVICE_MODULE"] = "";

// передаем в компонент описание веб-сервиса
$APPLICATION->IncludeComponent(
   "bitrix:webservice.server",
   "",
   $arParams
   );

die();
?>

Затем в корне сайта создаем файл-интерфейс для доступа к SOAP извне.

ws_addmes.php

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
?>
<?$APPLICATION->IncludeComponent(
	"dv:webservice.addmes",
	"",
	Array(
	)
);?> 
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Если зайти по адресу http://домен/ws_addmes.php в браузере, то мы увидим список доступных методов SOAP и можем даже их протестировать. Мы описывали лишь один метод, так что увидим только метод AddItem с одним параметром «TEXT».

Далее обратимся к клиенту на python. Для начала нам требуется установить zeep. Это выполняется командой sudo apt install python3-zeep. Вероятнее всего тут проблем не возникнет.

Далее модифицируем скрипт telegram-бота.

import telebot
from requests import Session
from requests.auth import HTTPBasicAuth
from zeep import Client
from zeep.transports import Transport

bot = telebot.TeleBot('ЗДЕСЬ_ВВОДИМ_TOKEN')
 
session = Session()
session.auth = HTTPBasicAuth('логин', 'пароль')
client = Client('http://домен/ws_addmes.php?wsdl', transport=Transport(session=session))


@bot.message_handler(content_types=["text"])
def handle_text(message):
    bot.send_message(message.chat.id, 'Вы написали: ' + message.text)
    client.service.AddItem(TEXT=message.text)

bot.polling(none_stop=True, interval=0)

Жирным отмечено те строки, которые добавлены по сравнению с прошлой версией кода. Обратите внимание, что в конце адреса url soap добавляется параметр «?wsdl» : http://домен/ws_addmes.php?wsdl . Это важно, лишь в таком случае ответ отдается в xml. В другом случае вы получите ошибку такого вида: «zeep.exceptions.XMLSyntaxError: Invalid XML content received (Input is not proper UTF-8, indicate encoding !».

Отставить комментарий

Ваш электронный адрес не будет опубликован.Обязательные для заполнения поля отмечены *

два + десять =