Search code examples
phptelegram

How do I send a message to Telegram on PHP?


How optimal is this code for sending a letter to my bot in telegram? Is it possible to make the code more optimal?

!How to get a chat ID: https://api.telegram.org/bot/getUpdates

Send to the browser address bar: https://api.telegram.org/bot470129572:HFApoAHFVN37852983HDFON385cNOhvs/getUpdates

@return {"ok":true,"result":[{"update_id":653246792, "message":{"message_id":1,"from":{"id":023752053 !It is chatID: 023752053

<?php

$chatID = '023752053';
$token = '470129572:HFApoAHFVN37852983HDFON385cNOhvs';

/**
  * Formatting options https://core.telegram.org/bots/api#formatting-options
  */
$message = '';
foreach(json_decode($fd) as $key => $value) {
  $message .= '<b>' . $key . '</b>: ' . $value;
  $message .= '
';
}

$data = [
  'text' => $message,
  'chat_id'=>$chatID,
  'parse_mode' => 'HTML',
];

/**
  * sendMessage https://core.telegram.org/bots/api#sendmessage
  */
$url = "https://api.telegram.org/bot" . $token . "/sendMessage";
$url .= '?'.http_build_query($data);
$ch = curl_init();
$optArray = array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array($ch, $optArray);
$result = curl_exec($ch);
curl_close($ch);

$result = json_decode($result, JSON_PRETTY_PRINT);

if ($result['ok']) {
  $result = json_encode(array('success'=>$result['ok']));
}
else {
  $result = json_encode(array('error'=>$result));
}

return $result;

I do not know if it is possible to improve this code for sending a message to telegram bot via php?


Solution

  • Your code looks good! I can't find any error.

    But you can try some small changes for better practice:

    Instead of using data to the query string in the URL, use CURLOPT_POSTFIELDS to send data as a POST request. Is more secure and I thing it is the preferred method for the Telegram API.

    Other good Idea is create error handling for cURL to catch connection issues or HTTP errors.

    Another thing is, I can see that your function does more than just send a message, right? It is formatting messages and handles the response. It might be more maintainable to separate these concerns into individual functions.

    I think thats it.

    Oh! you must be careful with how you manage your bot token.

    I can give you an example:

        <?php
    
    function YourTelegramMessageFunction($chatID, $message, $token) {
        $url = "https://api.telegram.org/bot" . $token . "/sendMessage";
        $data = ['chat_id' => $chatID, 'text' => $message, 'parse_mode' => 'HTML'];
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
        $response = curl_exec($ch);
    
    
        // here you can Handle cURL error
        if (curl_errno($ch)) {
            $error_msg = curl_error($ch);
            curl_close($ch);
            return json_encode(array('error' => $error_msg));
        }
    
        $http_code_message = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($http_code_message >= 200 && $http_code_message < 300) {
            $result = json_decode($response, true);
            if ($result['ok']) {
                $result = json_encode(array('success' => $result['ok']));
            } else {
                $result = json_encode(array('error' => $result));
            }
        } else {
            // And here you can Handle HTTP error
            $result = json_encode(array('error' => 'HTTP error ' . $http_code_message));
        }
    
        curl_close($ch);
        return $result;
    }
    
    $chatID = 'the id'; // change for a correct ID
    $token  = 'the toke,'; // change for a correct Token
    $message = 'the message'; // change with the current message formatting logic
    
    echo YourTelegramMessageFunction($chatID, $message, $token);