ptgb 2.0.1
ptgb: ^2.0.1 copied to clipboard
A complete client for the Telegram Bot API. Methods for every endpoint + keyboards, media, webhooks, payments, stickers, business accounts, and etc.
ptgb #
A complete client for the Telegram Bot API. Methods for every endpoint + keyboards, media, webhooks, payments, stickers, business accounts, and etc.
import 'package:ptgb/ptgb.dart';
Future<void> main() async {
final bot = Bot(); // loads your token from a .env file — see Quick Start
await for (final update in bot.poll()) {
if (update.text == '/start') {
await bot.sendMessage(update.chatId!, 'Hello from ptgb!');
}
}
}
Contents #
- Features
- Installation
- Getting a bot token
- Quick start
- Examples
- Things to keep in mind
- Contributing
- License
Features #
- Full API coverage — messaging, media, chat & forum administration, inline mode, payments & Telegram Stars, stickers, games, Telegram Business accounts, Stories, and Web Apps.
- Two update sources — long-polling out of the box (
Bot.poll) or your own webhook server (Bot.serveWebhook). - Typed helpers, not raw JSON, everywhere — keyboards
(
InlineKeyboardMarkup,ReplyKeyboardMarkup), media (InputMedia*), permissions (ChatPermissions,ChatAdministratorRights), inline query results (InlineQueryResult*/InputMessageContent*), and every incomingUpdate/Messagepayload and outgoing method's response (User/Chat/Message,ChatFullInfo,StickerSet, ...) — no moresomething['somethingelse']. - Optional rate limiting — pass
Bot(rateLimiter: RateLimiter())to automatically pace outgoing requests instead of handling every 429 yourself. - Telegram Mini App support — verify a Web App's signed
initDatawithBot.verifyWebAppInitData. - A low-level escape hatch (
Bot.call) for any Bot API method that doesn't have a typed wrapper yet.
Installation #
dart pub add ptgb
or add it to pubspec.yaml directly:
dependencies:
ptgb: ^1.0.0
Getting a bot token #
- Message @BotFather on Telegram and send
/newbot. - Copy the token it gives you (looks like
123456:ABC-your-token-here). - Keep it somewhere safe — never commit it to source control. See Quick Start below for the recommended way to load it.
Quick start #
Recommended: put your token in a .env file next to your script and let
ptgb load it for you automatically (via the penv
package):
TOKEN=123456:ABC-your-token-here
import 'package:ptgb/ptgb.dart';
Future<void> main() async {
final bot = Bot(); // reads TOKEN from .env
await for (final update in bot.poll()) {
if (update.text == '/start') {
await bot.sendMessage(update.chatId!, 'Hello from ptgb!');
}
}
}
Using a different filename or key? Pass dotFileName and/or envKey:
final bot = Bot(dotFileName: 'secrets.env', envKey: 'BOT_TOKEN');
Add .env to your .gitignore so it never gets committed.
Alternative: pass the token directly if you're managing it yourself, e.g. from a secrets manager at deploy time:
final bot = Bot(token: myTokenFromSomewhereElse);
Either way works — just never hard-code a real token as a literal string in code that ends up in version control.
Examples #
The example/ folder has a full, numbered set of runnable
programs, from a minimal echo bot up to a "god mode" bot exercising
keyboards, media, payments, stickers, invite links, and webhooks. Start with
example/README.md for the full list and reading order.
Things to keep in mind #
- Treat your token like a password. Anyone who has it can control your bot. Keep it out of version control.
poll()andserveWebhook()are mutually exclusive. Telegram only delivers updates through one channel at a time — callsetWebhookbefore using webhooks, anddeleteWebhookbefore switching back to polling.- ptgb does not retry or throttle requests for you by default. Every
failed call throws a
TelegramApiException; wrap your update handling intry/catchso one bad call (blocked user, rate limit, invalidchat_id) doesn't crash your whole process. Seeexample/15_error_handling_and_retries.dart. If you'd rather pace requests proactively, passBot(rateLimiter: RateLimiter())— seeexample/17_rate_limiting.dart. - Inline query results are typed classes, not raw JSON
Maps. Build a list ofInlineQueryResult*subtypes (InlineQueryResultArticle,InlineQueryResultPhoto,InlineQueryResultCachedPhoto, ...) and pass it toBot.answerInlineQuery— seeexample/08_inline_queries.dartandexample/41_inline_query_result_gallery.dart. - Incoming
User/Chat/Messagepayloads (and every method's response) are typed classes.Update's own getters (.message,.chat,.from, ...) return typed wrappers directly —update.message?.text,update.from?.username, etc. — with.rawalways available underneath for anything not covered by a getter. Seeexample/18_typed_message_helpers.dart. These are common class names, so if another package you're using also exports aUser,Chat, orMessage, import one of them with a prefix to disambiguate. - Requires Dart SDK
^3.5.0.
Documentation #
Full docs / wiki: doc.psdkjoon.ir/ptgb (mirrors: doc.psdk.space/ptgb, doc.psdk.fun/ptgb).
Contributing #
Bug reports, feature requests, and pull requests are welcome on GitHub. If you're filing a bug, a minimal reproduction and the relevant Bot API method name help a lot.
License #
MIT — see the LICENSE file for details.