Please check the bot token is correct and that you’ve messaged & obtained the chat id from the same bot which is configured.
Chat IDs are unique to each bot for every user and cannot be shared/reused.
I have tried with another bot chat id, i have got same error. The token is
correct cause, i can send text via bot api.
…
You can’t use «another bot» chat id. I just tested this on a fresh project and I can send the notification without issues.
Here’s how it should be:
- Bot A Token is configured.
- You message Bot A.
- You save the chat ID of the user gotten to your Bot A.
- You use that chat ID to send notifications from your Bot A.
Do not mix with different bots.
Also, what version of Laravel and this channel lib you’re using?
I have done the steps appropriately. Laravel 7 and latest version on the
package
…
On Thu, Sep 24, 2020, 6:59 PM Irfaq Syed ***@***.***> wrote:
You can’t use «another bot» chat id. I just tested this on a fresh project
and I can send the notification without issues.
Here’s how it should be:
— Bot A Token is configured.
— You message Bot A.
— You save the chat ID of the user gotten to your Bot A.
— You use that chat ID to send notifications from your Bot A.
Do not mix with different bots.
Also, what version of Laravel and this channel lib you’re using?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<#92 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AKGKSF3QH7EDPXB3NGN5Q3LSHM7DXANCNFSM4RX526UQ>
.
Telegram bots can’t send messages to user, if that user hasn’t started conversation with bot yet, or bot is not present in chat (if it’s a group chat). This issue is not related to the library, this is simply Telegram restriction, so that bots can’t spam users without their permission.
Telegram bots can’t send messages to user, if that user hasn’t started conversation with bot yet, or bot is not present in chat (if it’s a group chat). This issue is not related to the library, this is simply Telegram restriction, so that bots can’t spam users without their permission.
Just use Http request can send messages,but use this package not work
You can use a Telegram bot named @userinfobot to get the ID of a user. Beware, there are many accounts named @userinfobot, use them only if they are a bot.
Telegram bots can’t send messages to user, if that user hasn’t started conversation with bot yet, or bot is not present in chat (if it’s a group chat). This issue is not related to the library, this is simply Telegram restriction, so that bots can’t spam users without their permission.
Just use Http request can send messages,but use this package not work
Same issue.
@gorkau your advice working, sending to user_id works fine.
But I think that package should send messages by user’s login as well
Back to top
Edit this page
Toggle table of contents sidebar
This module contains classes that represent Telegram errors.
Changed in version 20.0: Replaced Unauthorized
by Forbidden
.
- exception telegram.error.BadRequest(message)[source]¶
-
Bases:
telegram.error.NetworkError
Raised when Telegram could not process the request correctly.
- exception telegram.error.ChatMigrated(new_chat_id)[source]¶
-
Bases:
telegram.error.TelegramError
Raised when the requested group chat migrated to supergroup and has a new chat id.
- Parameters:
-
new_chat_id (
int
) – The new chat id of the group.
- new_chat_id[source]¶
-
The new chat id of the group.
- Type:
-
int
- exception telegram.error.Conflict(message)[source]¶
-
Bases:
telegram.error.TelegramError
Raised when a long poll or webhook conflicts with another one.
- exception telegram.error.Forbidden(message)[source]¶
-
Bases:
telegram.error.TelegramError
Raised when the bot has not enough rights to perform the requested action.
Changed in version 20.0: This class was previously named
Unauthorized
.
- exception telegram.error.InvalidToken(message=None)[source]¶
-
Bases:
telegram.error.TelegramError
Raised when the token is invalid.
- Parameters:
-
message (
str
, optional) –Any additional information about the exception.
New in version 20.0.
- exception telegram.error.NetworkError(message)[source]¶
-
Bases:
telegram.error.TelegramError
Base class for exceptions due to networking errors.
- exception telegram.error.PassportDecryptionError(message)[source]¶
-
Bases:
telegram.error.TelegramError
Something went wrong with decryption.
Changed in version 20.0: This class was previously named
TelegramDecryptionError
and was available via
telegram.TelegramDecryptionError
.
- exception telegram.error.RetryAfter(retry_after)[source]¶
-
Bases:
telegram.error.TelegramError
Raised when flood limits where exceeded.
Changed in version 20.0:
retry_after
is now an integer to comply with the Bot API.- Parameters:
-
retry_after (
int
) – Time in seconds, after which the bot can retry the request.
- retry_after[source]¶
-
Time in seconds, after which the bot can retry the request.
- Type:
-
int
- exception telegram.error.TelegramError(message)[source]¶
-
Bases:
Exception
Base class for Telegram errors.
- exception telegram.error.TimedOut(message=None)[source]¶
-
Bases:
telegram.error.NetworkError
Raised when a request took too long to finish.
- Parameters:
-
message (
str
, optional) –Any additional information about the exception.
New in version 20.0.
There will be errors when working with the API, and they must be correctly handled on the client.
An error is characterized by several parameters:
Error Code
Numerical value similar to HTTP status. Contains information on the type of error that occurred: for example, a data input error, privacy error, or server error. This is a required parameter.
Error Type
A string literal in the form of /[A-Z_0-9]+/
, which summarizes the problem. For example, AUTH_KEY_UNREGISTERED
. This is an optional parameter.
Error Database
A full machine-readable JSON list of RPC errors that can be returned by all methods in the API can be found here », what follows is a description of its fields:
errors
— All error messages and codes for each method (object).- Keys: Error codes as strings (numeric strings)
- Values: All error messages for each method (object)
- Keys: Error messages (string)
- Values: An array of methods which may emit this error (array of strings)
descriptions
— Descriptions for every error mentioned inerrors
(and a few other errors not related to a specific method)- Keys: Error messages
- Values: Error descriptions
user_only
— A list of methods that can only be used by users, not bots.
Error messages and error descriptions may contain printf
placeholders in key positions, for now only %d
is used to map durations contained in error messages to error descriptions.
Example:
{
"errors": {
"420": {
"2FA_CONFIRM_WAIT_%d": [
"account.deleteAccount"
],
"SLOWMODE_WAIT_%d": [
"messages.forwardMessages",
"messages.sendInlineBotResult",
"messages.sendMedia",
"messages.sendMessage",
"messages.sendMultiMedia"
]
}
},
"descriptions": {
"2FA_CONFIRM_WAIT_%d": "Since this account is active and protected by a 2FA password, we will delete it in 1 week for security purposes. You can cancel this process at any time, you'll be able to reset your account in %d seconds.",
"SLOWMODE_WAIT_%d": "Slowmode is enabled in this chat: wait %d seconds before sending another message to this chat.",
"FLOOD_WAIT_%d": "Please wait %d seconds before repeating the action."
},
"user_only": {
"account.deleteAccount"
}
}
Error Constructors
There should be a way to handle errors that are returned in rpc_error constructors.
Below is a list of error codes and their meanings:
303 SEE_OTHER
The request must be repeated, but directed to a different data center.
Examples of Errors:
- FILE_MIGRATE_X: the file to be accessed is currently stored in a different data center.
- PHONE_MIGRATE_X: the phone number a user is trying to use for authorization is associated with a different data center.
- NETWORK_MIGRATE_X: the source IP address is associated with a different data center (for registration)
- USER_MIGRATE_X: the user whose identity is being used to execute queries is associated with a different data center (for registration)
In all these cases, the error description’s string literal contains the number of the data center (instead of the X) to which the repeated query must be sent.
More information about redirects between data centers »
400 BAD_REQUEST
The query contains errors. In the event that a request was created using a form and contains user generated data, the user should be notified that the data must be corrected before the query is repeated.
Examples of Errors:
- FIRSTNAME_INVALID: The first name is invalid
- LASTNAME_INVALID: The last name is invalid
- PHONE_NUMBER_INVALID: The phone number is invalid
- PHONE_CODE_HASH_EMPTY: phone_code_hash is missing
- PHONE_CODE_EMPTY: phone_code is missing
- PHONE_CODE_EXPIRED: The confirmation code has expired
- API_ID_INVALID: The api_id/api_hash combination is invalid
- PHONE_NUMBER_OCCUPIED: The phone number is already in use
- PHONE_NUMBER_UNOCCUPIED: The phone number is not yet being used
- USERS_TOO_FEW: Not enough users (to create a chat, for example)
- USERS_TOO_MUCH: The maximum number of users has been exceeded (to create a chat, for example)
- TYPE_CONSTRUCTOR_INVALID: The type constructor is invalid
- FILE_PART_INVALID: The file part number is invalid
- FILE_PARTS_INVALID: The number of file parts is invalid
- FILE_PART_X_MISSING: Part X (where X is a number) of the file is missing from storage
- MD5_CHECKSUM_INVALID: The MD5 checksums do not match
- PHOTO_INVALID_DIMENSIONS: The photo dimensions are invalid
- FIELD_NAME_INVALID: The field with the name FIELD_NAME is invalid
- FIELD_NAME_EMPTY: The field with the name FIELD_NAME is missing
- MSG_WAIT_FAILED: A request that must be completed before processing the current request returned an error
- MSG_WAIT_TIMEOUT: A request that must be completed before processing the current request didn’t finish processing yet
401 UNAUTHORIZED
There was an unauthorized attempt to use functionality available only to authorized users.
Examples of Errors:
- AUTH_KEY_UNREGISTERED: The key is not registered in the system
- AUTH_KEY_INVALID: The key is invalid
- USER_DEACTIVATED: The user has been deleted/deactivated
- SESSION_REVOKED: The authorization has been invalidated, because of the user terminating all sessions
- SESSION_EXPIRED: The authorization has expired
- AUTH_KEY_PERM_EMPTY: The method is unavailable for temporary authorization key, not bound to permanent
403 FORBIDDEN
Privacy violation. For example, an attempt to write a message to someone who has blacklisted the current user.
404 NOT_FOUND
An attempt to invoke a non-existent object, such as a method.
406 NOT_ACCEPTABLE
Similar to 400 BAD_REQUEST, but the app must display the error to the user a bit differently.
Do not display any visible error to the user when receiving the rpc_error
constructor: instead, wait for an updateServiceNotification update, and handle it as usual.
Basically, an updateServiceNotification popup
update will be emitted independently (ie NOT as an Updates constructor inside rpc_result
but as a normal update) immediately after emission of a 406 rpc_error
: the update will contain the actual localized error message to show to the user with a UI popup.
An exception to this is the AUTH_KEY_DUPLICATED
error, which is only emitted if any of the non-media DC detects that an authorized session is sending requests in parallel from two separate TCP connections, from the same or different IP addresses.
Note that parallel connections are still allowed and actually recommended for media DCs.
Also note that by session we mean a logged-in session identified by an authorization constructor, fetchable using account.getAuthorizations, not an MTProto session.
If the client receives an AUTH_KEY_DUPLICATED
error, the session is already invalidated by the server and the user must generate a new auth key and login again.
420 FLOOD
The maximum allowed number of attempts to invoke the given method with the given input parameters has been exceeded. For example, in an attempt to request a large number of text messages (SMS) for the same phone number.
Error Example:
- FLOOD_WAIT_X: A wait of X seconds is required (where X is a number)
500 INTERNAL
An internal server error occurred while a request was being processed; for example, there was a disruption while accessing a database or file storage.
If a client receives a 500 error, or you believe this error should not have occurred, please collect as much information as possible about the query and error and send it to the developers.
Other Error Codes
If a server returns an error with a code other than the ones listed above, it may be considered the same as a 500 error and treated as an internal server error.
Привет! Сегодня поговорим о том, как можно отправить себе сообщение в телеграмме с помощью PHP. Это удобно использовать, когда нужно получить уведомление о каком-то событии, произошедшем на бэкенде. Например, я таким образом получаю уведомления о новых комментариях к урокам.
Первое, что нам нужно сделать — это зарегать в телеге нового бота. Это делается при помощи другого бота, которого зовут @BotFather. Пишем ему команду:
/newbot
В ответ он попросит написать ему имя бота. Я назвал своего PhpZoneNotifier. Пишем, отправляем.
После этого он попросит прислать username для бота — это адрес, используемый в телеге для поиска пользователей. Username бота должен заканчиваться словом bot. Я выбрал в качестве юзернейма phpzonenotifier_bot. Отправляем.
В ответ получаем токен вида 123:ABCDEF. С помощью этого токена мы можем авторизоваться в телеге от имени этого бота.
Теперь нужно узнать наш собственный id в телеграме. По нему бот будет отправлять нам сообщения. Чтобы узнать этот айдишник, нужно написать боту @userinfobot команду /start.
После того, как мы получили auth token бота и наш id, можно приступать к написанию кода для отправки. Телеграм предоставляет довольно простой API для этого дела. Всё что нужно — это отправить POST-запрос на адрес:
https://api.telegram.org/bot{BOT_AUTH_TOKEN}/sendMessage
Где вместо {BOT_AUTH_TOKEN} подставить токен бота, полученный выше.
В теле запроса нужно передать 2 параметра:
-
chat_id — сюда передаём наш id пользователя
- text — сюда передаём текст сообщения
Для отправки запроса я использовал Guzzle.
<?php
namespace PhpZoneServices;
use GuzzleHttpClient;
use GuzzleHttpRequestOptions;
class TelegramNotifier
{
public static function notify($text)
{
$client = new Client();
try {
$client->post('https://api.telegram.org/bot1869549332:AAGhlRm5*************/sendMessage', [
RequestOptions::JSON => [
'chat_id' => 298160970,
'text' => $text,
]
]);
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}
После чего пытаемся отправить сообщение, вызвав:
TelegramNotifier::notify('lol kek cheburek');
И видим, что произошло исключение. var_dump вывел следующее:
{"ok":false,"error_code":400,"description":"Bad Request: chat not found"}
Так происходит потому что у бота нет чата с вами. Это защита телеги от рассылки спама — чтобы боту было позволено вам писать, вы сначала должны сами написать боту. Так что просто пишем нашему новому боту /start и снова пробуем запустить наш PHP-скриптик.
Получаем наше заветное уведомление.
Изи. Не забываем убрать отладочный var_dump из кода и добавить корректную обработку исключений.