Как стать автором
Обновить

Комментарии 18

НЛО прилетело и опубликовало эту надпись здесь
Задумка статьи интересная, спасибо!

За такое нужно руки отрывать в 2к19
global $tg_bot_token;
Всегда пожалуйста.
Если своим сообщением вы хотите сделать мир лучше, то правильно было бы сразу привести примет верного подхода в данном случае.
А так выглядит как хвастовство: «Смотрите какой-то говнокодер, не то что я! :)»
Не думал, что нужно пояснять такие очевидные вещи.

function Send_Out($user_id, $text, $is_end = true)
{
  global $tg_bot_token;
  if (strlen($user_id) < 1 || strlen($text) < 1) {return;}
  $json = file_get_contents('https://api.telegram.org/bot' . $tg_bot_token . '/sendMessage?chat_id=' . $user_id . '&text=' . $text);
}


Этот код можно решить в несколько путей:

1. В функции добавить еще один входной параметр в функцию:
function Send_Out($tg_bot_token, $user_id, $text, $is_end = true)
{
  if (strlen($user_id) < 1 || strlen($text) < 1) {return;}
  $json = file_get_contents('https://api.telegram.org/bot' . $tg_bot_token . '/sendMessage?chat_id=' . $user_id . '&text=' . $text);
}


2. Использовать классы и создать класс похожего типа:
class TelegramClient 
{
    private $botToken;
    
    function __construct(string $botToken) 
    {
        $this->botToken = $botToken;
    }
    
    public function sendMessage(int $userId, string $message, bool $isEnd = true): void
    {
        if ($userId < 1 || mb_strlen($message) < 1) {
            throw new TelegramClientException(...);
        }
        $json = file_get_contents('https://api.telegram.org/bot' . $tg_bot_token . '/sendMessage?chat_id=' . $user_id . '&text=' . $text);
    }
}

Запросы на сервер не нужно отправлять через file_get_contents, лучше использовать Guzzle.
А можно все завернуть в классы и сделать так:

  include_once 'webhook_class.php';

  $tg_bot_token = "_____YOUR_BOT_TOKEN_____";

  $Telegram_Cli = new Telegram_Cli_Class($tg_bot_token);

  $Webhook = new Webhook_Class();

  $Webhook->Set_Type('telegram');
  $Webhook->Get_Data();
  $Webhook->Parse_Data();
  $Webhook->Parse_Tokens();
  if ($Webhook->is_Out())
  {
    $Telegram_Cli->Send($Webhook->user_id, $Webhook->out_msg);
  }
}

Готовые примеры для чего это может быть полезно, где-то есть посмотреть?
В открытом виде нет, используется для управление домашней автоматикой, к аккаунту пользователя привязывается id от Алисы и от Telegram. Команды управление получаются одинаковые.
Код примитивный, кто умеет красиво и сам разберется за час.
Он не примитивный, он ужасный.
Вы выложили это в паблик, теперь кто-то не опытный возьмет с этого пример, поэтому такое не приветствуется.
Не знаю что Вы… до парня на счет кода. Как смог так написал. (Я уверен, что если сделаете более читаемый код, он не откажется и опубликует и его.)
Благодарю за статью, ты заинтересовал меня в возможностях «Алисы».

Да что вы прикопались к коду?
Нормальный первоапрельский код.


Ну а если серьёзно, KillerAngel, не используйте глобальные переменные.
Почитайте про чистые функции и почему нужно стремиться писать именно чистые функции.
Почитайте про ООП, с помощью него можно лучше структурировать код.
И не забывайте про многобайтовые кодировки, вы же с PHP работаете (mb_strlen, например).

А я и не использую, ну почти.
Про ООП читал.
Про кодировки — да, когда срезал всю шелуху, упустил strlen

Все переделал, теперь все вот так, что один что другой скрипт:
  include_once 'webhook_class.php';

  $Yandex_Alice_Cli = new Yandex_Alice_Cli_Class();

  $Webhook = new Webhook_Class();

  $Webhook->Set_Type('yandex_alice');
  $Webhook->Get_Data();
  $Webhook->Parse_Data();
  $Webhook->Parse_Tokens();
  if ($Webhook->is_Out())
  {
    $Yandex_Alice_Cli->Set_Sess_Id($Webhook->data_msg_sess_id);
    $Yandex_Alice_Cli->Send($Webhook->user_id, $Webhook->out_msg);
  }

Это, конечно, лучше чем было, но ведь есть PSR и код оформлять желательно в соответствии с ним
Согласен
Идея хорошая, кому не нравится, сделайте лучше.

А вообще, у меня была подобная проблема, когда я писал единого бота для VK&Discord&LINE.

Однако, там я решил эту проблему, написав несколько «драйверов», которые формировали единый JSON-массив и отправляли его в RabbitMQ, а на стороне считывания уже работал с этими стандартизированными данными. Так что, вам есть к чему стремиться.
Так это был только обрезанный костяк. Суть статьи — идея, ну и ее простейшая реализация, чтобы можно было описать каждый ход и он был понятен всем. А там где это используется есть и проверки и обработчик который работает с базой через свои классы-адаптеры.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории