Задать вопрос
  • Где можно дать старт рекламы телеграмм бота?

    Slotly
    @Slotly
    Python, Telegram-боты записи, бэкенд для сайтов
    Зависит от того, что за бот, и это не придирка - от ответа зависит всё.

    Если бот сам по себе продукт (игра, сервис, инструмент) - да, нужна
    реклама, и это тяжёлый путь с деньгами и выгоранием.

    Если бот обслуживает существующий бизнес - запись, заказы, поддержка -
    реклама ему почти не нужна, и это главное, что стоит понять до того,
    как тратить бюджет. Трафик даёт сам бизнес:

    - QR-код на стойке и в зале, рядом «запишитесь за минуту»
    - кнопка на сайте вместо формы «мы вам перезвоним»
    - ссылка в автоответе директа и в подписи в мессенджерах
    - ссылка в карточке 2ГИС и Яндекс Карт
    - чек и SMS после визита: «в следующий раз можно записаться тут»

    У бизнеса с потоком клиентов это даёт больше, чем любая закупка,
    и стоит ноль.

    Если бот всё-таки самостоятельный:

    - тематические чаты, но не оффером, а ответами по существу. В чатах,
    где реклама запрещена, отдача обычно выше, потому что туда не лезут
    спамеры
    - каталоги ботов дают трафик, но он мусорный, конверсия низкая
    - взаимный обмен с каналами близкой тематики
    - контент, где бот не реклама, а иллюстрация: показываете, как решается
    задача, бот появляется по ходу

    И вопрос, который стоит задать себе первым: понятно ли из первого
    экрана бота, что он делает и зачем. Люди чаще отваливаются на этом,
    чем не доходят. Пока не проверили - рекламу лить рано, вы просто
    оплатите отвал.
    Ответ написан
    Комментировать
  • Telethon отказывается соединятся с серверами Telegram, как это обойти?

    Slotly
    @Slotly
    Python, Telegram-боты записи, бэкенд для сайтов
    Дополню про прокси, потому что на этой строчке многие спотыкаются.

    127.0.0.1:1080 сработает только если на этом порту у вас реально
    кто-то слушает. Большинство VPN-клиентов (WireGuard, OpenVPN и почти все
    десктопные приложения) работают на уровне TUN-интерфейса и заворачивают
    весь системный трафик — локальный SOCKS5 они при этом не поднимают.
    Скопируете строку как есть и получите ConnectionRefusedError, после чего
    будете думать, что дело в Telethon.

    Проверить за секунду:

    curl --socks5 127.0.0.1:1080 -s -o /dev/null -w "%{http_code}\n" https://api.telegram.org
    ss -ltn | grep 1080 # на Linux
    netstat -ano | findstr 1080 # на Windows

    Пусто — значит SOCKS5 у вас нет. Локальный SOCKS5 дают: ssh -D 1080
    на свой сервер, Tor (порт 9050), xray/v2ray, Shadowsocks. Обычный
    VPN-клиент — нет.

    Теперь главное. Судя по логам, у вас есть bot_token — то есть вы делаете
    бота, а не юзербота. Тогда MTProto вам, скорее всего, не нужен вообще.

    Telethon ходит по MTProto, и для DPI этот протокол выглядит характерно,
    поэтому режется охотнее. Bot API работает по обычному HTTPS на
    api.telegram.org. С той же машины, где Telethon даёт TcpFull и таймауты,
    Bot API часто отвечает без всяких прокси. Проверяется одной командой:

    curl https://api.telegram.org/bot/getMe

    Ответил — значит канал живой, и проблема была в протоколе, а не в сети.
    Тогда берите aiogram или python-telegram-bot, и вопрос с прокси
    закрывается сам.

    Telethon оправдан, только если нужны функции обычного аккаунта, которых
    в Bot API нет: читать чужие чаты, работать от лица пользователя,
    доставать историю. Если этого в задаче нет — переезд решает проблему,
    а не обходит её.

    Если всё-таки остаётесь на Telethon с прокси, учтите: прокси становится
    единственной точкой отказа. Упал — упал бот. Ставьте явные таймауты,
    автопереподключение и проверку прокси перед использованием, иначе
    клиент будет висеть молча.
    Ответ написан
    Комментировать
  • Какие способы обеспечить стабильность работы тг бота сейчас без использования впн?

    Slotly
    @Slotly
    Python, Telegram-боты записи, бэкенд для сайтов
    Про переход на Bot API выше верно. Добавлю про симптом, который вы
    описали, — «залипает, а потом отвечает пачкой».

    Это почти наверняка не сеть, а отсутствие таймаутов. Один запрос повис,
    за ним встала очередь, соединение отвалилось по системному таймауту —
    и всё накопленное вылетело разом. Пока таймауты не выставлены явно,
    любая работа через прокси будет давать ровно эту картину, на каком бы
    сервере вы ни хостились.

    Что помогает, кроме самого переезда на Bot API:

    — явные таймауты на каждый сетевой вызов, короткие
    — ретраи с экспоненциальной паузой и случайным разбросом
    — таблица исходящих: бот не шлёт напрямую, а кладёт сообщение в базу,
    отдельный воркер отправляет и проставляет статус. При обрыве ничего
    не теряется, уходит позже
    — ключ идемпотентности на отправку, иначе после восстановления связи
    прилетят дубли
    — отвечать пользователю сразу, даже если работа не сделана: «принял,
    обрабатываю». Человек прощает медленно, но не прощает тишину

    Если прокси всё-таки нужны — не ротация вслепую, а пул с проверкой:
    перед выдачей дёргать через прокси getMe с таймаутом в пару секунд,
    не ответил — помечать мёртвым на несколько минут. Прокси, который падает
    через раз, хуже отсутствующего: он съедает ретраи.
    Ответ написан
    Комментировать
  • Кто-нибудь сталкивался с резким увеличением задержки при работе с Telegram API?

    Slotly
    @Slotly
    Python, Telegram-боты записи, бэкенд для сайтов
    Про DPI выше всё верно, добавлю то, что помогает выбрать лечение,
    а не только поставить диагноз.

    Смена ДЦ помогает не всегда, и это можно проверить заранее. Если режут
    по IP-подсетям Telegram — да, другой аплинк спасёт. Если режут по SNI
    на этапе TLS-хендшейка, переезд в другой ДЦ той же страны не даст
    ничего: имя домена уходит в открытом виде и его видно везде одинаково.

    Различить за минуту. Сначала адрес:

    dig +short api.telegram.org

    Потом два запроса — по домену и по IP с подменой Host, во втором имя
    домена в открытом виде не передаётся:

    curl -o /dev/null -s -w "dns:%{time_namelookup} conn:%{time_connect} tls:%{time_appconnect} total:%{time_total}\n" https://api.telegram.org/bot/getMe

    curl -k -o /dev/null -s -w "%{http_code} %{time_total}\n" -H "Host: api.telegram.org" https:///bot/getMe

    По IP летает, по домену висит — режут по имени, маршрут ни при чём
    и менять ДЦ бесполезно. Висят оба — тогда да, IP и маршрут, версия
    выше подтверждается.

    Заодно смотрите, какая фаза растёт:
    — большой time_connect — рвут на TCP
    — нормальный time_connect при большом time_appconnect — убивают
    TLS-хендшейк, это как раз про SNI
    — первые две в норме, растёт только total — это уже обычная
    перегрузка канала, и лечится совсем иначе

    Теперь про клиент, раз вы про него спрашивали. Причина не в нём, но
    именно его настройки решают, будет у вас «иногда подтормаживает» или
    «бот встал».

    Таймауты. В aiogram по умолчанию 60 секунд, и это очень много. Один
    повисший запрос держит очередь, а когда соединение наконец отваливается,
    всё накопленное вылетает разом. Симптом «бот молчал, потом ответил всем
    сразу» — это почти всегда таймауты, а не сеть.

    from aiogram import Bot
    from aiogram.client.session.aiohttp import AiohttpSession
    bot = Bot(token=TOKEN, session=AiohttpSession(timeout=20))
    # у long polling таймаут задаётся отдельно:
    # dp.start_polling(bot, polling_timeout=20)

    Вебхук вместо long polling. Long polling держит одно долгое соединение,
    а такие DPI рвёт охотнее всего. Вебхук — это короткие запросы, плюс при
    неудаче Telegram повторяет доставку сам.

    Ретраи с экспоненциальной паузой и случайным разбросом. Без разброса все
    повторы придут одновременно и добьют то, что и так шатается.

    Очередь исходящих в базе вместо «отправить и надеяться»: бот кладёт
    сообщение со статусом, отдельный воркер разгребает. При обрыве сообщения
    уходят позже, а не теряются. И свой ключ идемпотентности, иначе после
    восстановления связи люди получат по три копии.

    И залогируйте время каждого запроса с разбивкой по фазам. Ровная
    задержка и рваная на глаз одинаковые, а чинятся по-разному.
    Ответ написан
    Комментировать