Подключение бота getUpdates

Подключить бота работающего через метод getUpdate можно двумя способами, через API (см. раздел "Подключение бота через API") или заменой адрса api.telegram.org.

Боты такого типа самостоятельно запрашивают обновления у Telegram, с помощью HTTPS запросов используя метод getUpdate. Чтобы подключить бота к аналитике нужно изменить адрес api.telegram.org на адрес который выдаст вам система при подключении.

После смены адреса наша платформа будет проксировать все запросы на адрес api.telegram.org и собирать для вас статистику. На этот адресс можно слать не только запросы типа getUpdate но и все остальные типы запросов (отправка сообщений, файлов и т.д.) все запросы проксируются на сервера Telegram в неизменном виде.

Как изменить адрес подключение в боте

Изменение адреса api.telegram.org предусмотренно Telegram Bot API, большинство библиотек имеют возможности для смены этого адреса.

Важно. В примерах используется адрес "https://tgrasp.co", вы можете использовать этот адрес только в случае если в личном кабинете был указан токен бота. В иных случаях используйте только тот адрес который вы получили в личном кабинете на этапе настройки бота.

Если в личном кабинете вы задали токен для бота, система выдаст вам адрес "https://tgrasp.co" иначе адрес будет "https://кодбота.tgrasp.co"

Инструкции для различных библиотек

Если вы не нашли инструкцию для своей библиотеки или у вас возникли проблемы с подключением обратитесь к нам в техническую поддержку или заполните форму в конце этой страницы.

Python

aiogram/aiogram v3

Репозиторий - https://github.com/aiogram/aiogram

Информация как сменить хост в документации https://docs.aiogram.dev/en/dev-3.x/api/session/custom_server.html

Чтобы изменить адрес подключения, необходимо добавить код:

from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.client.telegram import TelegramAPIServer


session = AiohttpSession(
    api=TelegramAPIServer.from_base('https://tgrasp.co')
)

И необходимо изменить вызов функции Bot добавив параметр session=session

bot = Bot(..., session=session)

Полный листинг кода

Обратите внимание на строки 11 и 12, в них импортируются объекты. В строках 51-53 задается адрес. В строке 56 добавляется атрибут , session=session

import asyncio
import logging
import sys
from os import getenv

from aiogram import Bot, Dispatcher, Router, types
from aiogram.enums import ParseMode
from aiogram.filters import CommandStart
from aiogram.types import Message
from aiogram.utils.markdown import hbold
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.client.telegram import TelegramAPIServer

# Bot token can be obtained via https://t.me/BotFather
TOKEN = getenv("BOT_TOKEN")

# All handlers should be attached to the Router (or Dispatcher)
dp = Dispatcher()


@dp.message(CommandStart())
async def command_start_handler(message: Message) -> None:
    """
    This handler receives messages with `/start` command
    """
    # Most event objects have aliases for API methods that can be called in events' context
    # For example if you want to answer to incoming message you can use `message.answer(...)` alias
    # and the target chat will be passed to :ref:`aiogram.methods.send_message.SendMessage`
    # method automatically or call API method directly via
    # Bot instance: `bot.send_message(chat_id=message.chat.id, ...)`
    await message.answer(f"Hello, {hbold(message.from_user.full_name)}!")


@dp.message()
async def echo_handler(message: types.Message) -> None:
    """
    Handler will forward receive a message back to the sender

    By default, message handler will handle all message types (like a text, photo, sticker etc.)
    """
    try:
        # Send a copy of the received message
        await message.send_copy(chat_id=message.chat.id)
    except TypeError:
        # But not all the types is supported to be copied so need to handle it
        await message.answer("Nice try!")


async def main() -> None:

    session = AiohttpSession(
        api=TelegramAPIServer.from_base('https://tgrasp.co') # ваш адрес
    )

    # Initialize Bot instance with a default parse mode which will be passed to all API calls
    bot = Bot(TOKEN, parse_mode=ParseMode.HTML, session=session)
    
    # And the run events dispatching
    await dp.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    asyncio.run(main())
aiogram/aiogram v2

Информация как сменить хост в официальной документации

Чтобы изменить адрес подключения, необходимо добавить код:

from aiogram.bot.api import TelegramAPIServer
server = TelegramAPIServer.from_base('https://tgrasp.co')

И необходимо изменить вызов функции Bot добавив параметр server=server

bot = Bot(..., server=local_server)

Полный листинг кода

Обратите внимание на строки 3, в ней импортируются объект. В строке 12 задается адрес. В строке 15 добавляется атрибут , server=server

import logging
from aiogram import Bot, Dispatcher, executor, types
from aiogram.bot.api import TelegramAPIServer
from aiogram.types import ContentType

API_TOKEN = 'BOT TOKEN HERE'

# Configure logging
logging.basicConfig(level=logging.INFO)

# Create private Bot API server endpoints wrapper
server = TelegramAPIServer.from_base('https://tgrasp.co')

# Initialize bot with using local server
bot = Bot(token=API_TOKEN, server=server)
# ... and dispatcher
dp = Dispatcher(bot)


@dp.message_handler(content_types=ContentType.ANY)
async def echo(message: types.Message):
    await message.copy_to(message.chat.id)

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
eternnoir/pyTelegramBotAPI

Репозиторий - https://github.com/eternnoir/pyTelegramBotAPI

Чтобы изменить хост нужно импортировать apihelper и задать параметр API_URL. О том как изменить хост можно прочитать в официальной документации

from telebot import apihelper

apihelper.API_URL = "https://tgrasp.co/bot{0}/{1}"

Полный листинг кода

Для полноценного примера мы использовали пример из официального репозитория по адресу https://github.com/eternnoir/pyTelegramBotAPI/blob/master/examples/echo_bot.py

Обратите внимание на строки 7 и 11. В них импортируется объект и изменяется адрес

#!/usr/bin/python

# This is a simple echo bot using the decorator mechanism.
# It echoes any incoming text messages.

import telebot
from telebot import apihelper

API_TOKEN = '<api_token>'

apihelper.API_URL = "https://tgrasp.co/bot{0}/{1}" # ваш адрес

bot = telebot.TeleBot(API_TOKEN)


# Handle '/start' and '/help'
@bot.message_handler(commands=['help', 'start'])
def send_welcome(message):
    bot.reply_to(message, """\
Hi there, I am EchoBot.
I am here to echo your kind words back to you. Just say anything nice and I'll say the exact same thing to you!\
""")


# Handle all other messages with content_type 'text' (content_types defaults to ['text'])
@bot.message_handler(func=lambda message: True)
def echo_message(message):
    bot.reply_to(message, message.text)


bot.infinity_polling()
python-telegram-bot/python-telegram-bot

Репозиторий - https://github.com/python-telegram-bot/python-telegram-bot

Информация как сменить хост в документации https://github.com/python-telegram-bot/python-telegram-bot/wiki/Local-Bot-API-Server

Вы можете изменить хост с помощью метода base_url, Для наглядности мы использовали базовый пример из документации. Обратите на строку 16 в ней изменяется адрес .base_url('https://tgrasp.co/bot')

import logging
from telegram import Update
from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler

logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await context.bot.send_message(chat_id=update.effective_chat.id, text="I'm a bot, please talk to me!")

if __name__ == '__main__':

# Замените адрес на свой
    application = ApplicationBuilder().base_url('https://tgrasp.co/bot').token('<BOT TOKEN>').build()
    
    start_handler = CommandHandler('start', start)
    application.add_handler(start_handler)
    
    application.run_polling()

PHP

telegram-bot-sdk/telegram-bot-sdk

Репозиторий - https://github.com/telegram-bot-sdk/telegram-bot-sdk

Библиотека поддерживает работу с несколькими ботами, поэтому ниже представлено два варианта подключения

Если у вас один бот

use Telegram\Bot\Api;

// замените четвертый атрибут на адрес который вы получили в личном кабинете.
// обратите внимание на добавление /bot в конце
$telegram = new Api('<BOT TOKEN>', false, null, 'https://tgrasp.co/bot');

$response = $telegram->getUpdates([
    'offset' => 0,
    'timeout'=>10
]);

Если у вас несколько ботов

use Telegram\Bot\BotsManager;

$config = [
    'bots' => [
        'mybot' => [
            'token' => '<BOT TOKEN>',
        ],
    ],
    // замените на адрес который вы получили в личном кабинете.
    // обратите внимание на добавление /bot в конце
    'base_bot_url' => 'https://tgrasp.co/bot'
];

$telegram = new BotsManager($config);

// Example usage
$response = $telegram->bot('mybot')->getUpdates([
    'offset' => 0,
    'timeout'=> 10
]);
php-telegram-bot/core

Информация как сменить хост в документации https://github.com/php-telegram-bot/core#using-a-custom-bot-api-server

Longman\TelegramBot\Request::setCustomBotApiUri(
    $api_base_uri = 'https://tgrasp.co'
);
TelegramBot/Api

Информация как сменить хост в документации https://github.com/TelegramBot/Api?tab=readme-ov-file#local-bot-api-server

На момент написание этой документации возможность смены адреса присутствует только в dev версии 2.6. По умолчанию устанавливается версия 2.5

Обновите вашу версию библиотеки до версии 2.6

Измените в composer.json на"^2.6" и добавьте параметры "minimum-stability": "dev", "prefer-stable": true

Пример composer.json
{
    "require": {
        "telegram-bot/api": "^2.6"
    },
    "minimum-stability": "dev",
    "prefer-stable": true
}

Изменение адреса

При создании объекта BotApi передайте четвертым параметром наш адрес

try {

    $bot = new \TelegramBot\Api\BotApi(
        '<BOT TOKEN>', 
        null, 
        null, 
        'https://tgrasp.co/bot' // замените на адресс который вы получили в личном кабинете
    );
    $updates = $bot->getUpdates(0, 100, 10);
    
} catch (\TelegramBot\Api\Exception $e) {
    $e->getMessage();
}

JavaScript

yagop/node-telegram-bot-api

Для того чтобы изменить хост нужно передать параметр baseApiUrl: 'https://tgrasp.co' в атрибут options при создании обьекта new TelegramBot(token, [options])

const options = { 
    polling: true, 
    baseApiUrl: 'https://tgrasp.co' // замените на адрес который вы получили в личном кабинете
}; 
const bot = new TelegramBot(TOKEN, options);

Полный листинг кода

Для полноценного примера мы использовали пример из официального репозитория по адресу https://github.com/yagop/node-telegram-bot-api/blob/master/examples/polling.js

Обратите внимание на строку 12, в ней изменяется адрес

/**
 * This example demonstrates using polling.
 * It also demonstrates how you would process and send messages.
 */

const TOKEN = process.env.TELEGRAM_TOKEN || 'YOUR_TELEGRAM_BOT_TOKEN';
const TelegramBot = require('node-telegram-bot-api');
const request = require('@cypress/request');

const options = {
  polling: true,
  baseApiUrl: 'https://tgrasp.co' // ваш адрес
};

const bot = new TelegramBot(TOKEN, options);


// Matches /photo
bot.onText(/\/photo/, function onPhotoText(msg) {
  // From file path
  const photo = `${__dirname}/../test/data/photo.gif`;
  bot.sendPhoto(msg.chat.id, photo, {
    caption: "I'm a bot!"
  });
});


// Matches /audio
bot.onText(/\/audio/, function onAudioText(msg) {
  // From HTTP request
  const url = 'https://upload.wikimedia.org/wikipedia/commons/c/c8/Example.ogg';
  const audio = request(url);
  bot.sendAudio(msg.chat.id, audio);
});


// Matches /love
bot.onText(/\/love/, function onLoveText(msg) {
  const opts = {
    reply_to_message_id: msg.message_id,
    reply_markup: JSON.stringify({
      keyboard: [
        ['Yes, you are the bot of my life ❤'],
        ['No, sorry there is another one...']
      ]
    })
  };
  bot.sendMessage(msg.chat.id, 'Do you love me?', opts);
});


// Matches /echo [whatever]
bot.onText(/\/echo (.+)/, function onEchoText(msg, match) {
  const resp = match[1];
  bot.sendMessage(msg.chat.id, resp);
});


// Matches /editable
bot.onText(/\/editable/, function onEditableText(msg) {
  const opts = {
    reply_markup: {
      inline_keyboard: [
        [
          {
            text: 'Edit Text',
            // we shall check for this value when we listen
            // for "callback_query"
            callback_data: 'edit'
          }
        ]
      ]
    }
  };
  bot.sendMessage(msg.from.id, 'Original Text', opts);
});


// Handle callback queries
bot.on('callback_query', function onCallbackQuery(callbackQuery) {
  const action = callbackQuery.data;
  const msg = callbackQuery.message;
  const opts = {
    chat_id: msg.chat.id,
    message_id: msg.message_id,
  };
  let text;

  if (action === 'edit') {
    text = 'Edited Text';
  }

  bot.editMessageText(text, opts);
});
grammyjs/grammY

Инструкция как изменить адрес в официальной документации - https://grammy.dev/guide/api#configuring-grammy-to-use-the-local-bot-api-server

Для подключения измените создание объекта Bot

const bot = new Bot("", { // <-- use the same token as before
  client: { apiRoot: "https://tgrasp.co" },
});

Пример

В качестве примера мы использовали базовый пример из официальной документации. Обратите внимание на 4-7 строки в них изменяется адрес

const { Bot } = require("grammy");


const bot = new Bot("< BOT_TOKEN >",
{ // <-- use the same token as before
  client: { apiRoot: "https://tgrasp.co" }, // замените на адрес который вы получили в личном кабинете
});

// Handle the /start command.
bot.command("start", (ctx) => ctx.reply("Welcome! Up and running."));

// Start the bot.
bot.start();
telegraf/telegraf

Репозиторий - https://github.com/telegraf/telegraf

Для подключения измените создание объекта Telegraf.

Ниже пример простого бота с измененным адресом. Обратите внимание на строки 5-8, в них изменяется адрес. Замените адрес на тот который вы получили в личном кабинете. После внесения изменений перезапустите бот.

const { Telegraf } = require('telegraf');

// Specify here your token that you received from BotFather
const bot = new Telegraf('< BOT_TOKEN >',
  {
  telegram: {
    apiRoot: 'https://tgrasp.co' // замените на адрес который вы получили в личном кабинете
  }
});

// Response to the command /start
bot.start((ctx) => ctx.reply('Hi! I am a simple bot using long polling.'));

// Launching the bot in long pollin mode
bot.launch().then(() => {
  console.log('Бот запущен в режиме long polling');
});

// Processing an application shutdown
process.once('SIGINT', () => bot.stop('SIGINT'));
process.once('SIGTERM', () => bot.stop('SIGTERM'));

Go

go-telegram-bot-api/telegram-bot-api

Репозиторий - https://github.com/go-telegram-bot-api/telegram-bot-api

Используйте метод SetAPIEndpoint чтобы изменить хост подключения

bot, err := tgbotapi.NewBotAPI("<api_token>")

bot.SetAPIEndpoint("https://tgrasp.co/bot%s/%s") // замените на адрес который вы получили в личном кабинете

Полноценный пример

Обратите внимание на строку 17, в ней изменяется адрес

package main

import (
	"log"

	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)

func main() {
	bot, err := tgbotapi.NewBotAPI("<api_token>")
	if err != nil {
		log.Panic(err)
	}

	bot.Debug = true

	bot.SetAPIEndpoint("https://tgrasp.co/bot%s/%s") // замените на адрес который вы получили в личном кабинете


	log.Printf("Authorized on account %s", bot.Self.UserName)

	u := tgbotapi.NewUpdate(0)
	u.Timeout = 60

	updates := bot.GetUpdatesChan(u)

	for update := range updates {
		if update.Message != nil { // If we got a message
			log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)

			msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text)
			msg.ReplyToMessageID = update.Message.MessageID

			bot.Send(msg)
		}
	}
}
tucnak/telebot

Репозиторий - https://github.com/tucnak/telebot

Чтобы изменить хост подключения, передайте нужный адрес в параметр URL

pref := tele.Settings{
  URL: "https://tgrasp.co", //адрес который вы получили в личном кабинете
  Token:  os.Getenv("TOKEN"),
  Poller: &tele.LongPoller{Timeout: 10 * time.Second},
}

Полноценный пример

Обратите внимание на строку 13, в ней изменяется адрес

package main

import (
	"log"
	"os"
	"time"

	tele "gopkg.in/telebot.v3"
)

func main() {
	pref := tele.Settings{
		URL: "https://tgrasp.co", //адрес который вы получили в личном кабинете
		Token:  os.Getenv("TOKEN"),
		Poller: &tele.LongPoller{Timeout: 10 * time.Second},
	}

	b, err := tele.NewBot(pref)
	if err != nil {
		log.Fatal(err)
		return
	}

	b.Handle("/hello", func(c tele.Context) error {
		return c.Send("Hello!")
	})

	b.Start()
}

Java

rubenlagus/TelegramBots

Репозиторий - https://github.com/rubenlagus/TelegramBots

В качестве примера мы использовали репозиторий https://github.com/rubenlagus/TelegramBotsExample

Для подключения входящего трафика нужно передать объект TelegramUrl в функцию TelegramBotsLongPollingApplication.registerBot()

Обратите внимание на строку 8 это стандартный метод подключение к TG Bot API. В следующей строке мы добавили 2 параметра в эту функцию, в том числе передаем новые адрес для подключения. Замените его на адрес который выдала вам система.

//import org.telegram.telegrambots.meta.TelegramUrl;
//import org.telegram.telegrambots.longpolling.util.DefaultGetUpdatesGenerator;

public static void main(String[] args) {

    TelegramBotsLongPollingApplication botsApplication = new TelegramBotsLongPollingApplication();
    try {
         // botsApplication.registerBot(BotConfig.COMMANDS__TOKEN, new CommandsHandler(BotConfig.COMMANDS__TOKEN, BotConfig.COMMANDS__USER));
         botsApplication.registerBot(
            BotConfig.WEATHER_TOKEN, 
            () -> new TelegramUrl("https", "tgrasp.co", 443), //<!-- замените адрес на ваш
            new DefaultGetUpdatesGenerator(), 
            new CommandsHandler(BotConfig.COMMANDS_TOKEN, BotConfig.COMMANDS_USER)
         );

        } catch (TelegramApiException e) {
            log.error("Error registering bot", e);
        }
}

Возможные ошибки

Все ошибки связанные с работой бота попадают в раздел ошибки бота в личном кабинете.

Код
Описание
Решение

409

Conflict: terminated by other getUpdates request; make sure that only one bot instance is running

Ошибка возникает когда сервера телеграм фиксируют два одновременных запроса getUpdates. Убедитесь что у вас запущен только один поток получения данных

502

502 Bad Gateway

Убедитесь что вы отправляете запрос верной структуры. Иногда на серверах телеграм случаются проблемы и они могут отвечать этой ошибкой.

Если вы не нашли нужную вам инструкцию напишите нам в чат на сайте или заполните форму ниже, мы пишем новые инструкции по запросу.

Last updated