بازگشت به وبلاگ
 آموزش ساخت ربات تلگرام با Go از صفر تا اجرا

آموزش ساخت ربات تلگرام با Go از صفر تا اجرا

۱۴۰۵/۶/۳admin

اگر به دنبال آموزش ساخت ربات تلگرام با Go هستید، در این مقاله از صفر یک Telegram Bot با زبان برنامه‌نویسی Go می‌سازیم.

اما قبل از اینکه وارد کدنویسی شویم، یک سؤال مهم وجود دارد:

چرا اصلاً باید برای ساخت ربات تلگرام از Go استفاده کنیم؟

زبان Go که با نام Golang نیز شناخته می‌شود، به دلیل سرعت بالا، مصرف نسبتاً کم منابع، Concurrency داخلی، سادگی Deployment و مناسب بودن برای سرویس‌های Backend، گزینه جذابی برای ساخت ربات‌های تلگرام است.

Telegram نیز یک Bot API مبتنی بر HTTP ارائه می‌کند؛ بنابراین از نظر فنی می‌توان با زبان‌های مختلفی مانند Python، JavaScript، TypeScript، Go و غیره Bot ساخت.

در این آموزش یک Bot واقعی می‌سازیم که می‌تواند:

  • دستور /start را دریافت کند.
  • به کاربران پاسخ دهد.
  • پیام‌های متنی را پردازش کند.
  • Commandهای مختلف داشته باشد.
  • Inline Keyboard داشته باشد.
  • اطلاعات کاربر را بخواند.
  • خطاها را مدیریت کند.
  • Token را از Environment Variable دریافت کند.
  • با ساختاری مناسب برای توسعه بیشتر اجرا شود.

مشخصات SEO مقاله

کلمه کلیدی اصلی:

ساخت ربات تلگرام با Go

کلمات کلیدی مرتبط:

  • آموزش ساخت ربات تلگرام با Go
  • ساخت Telegram Bot با Golang
  • ساخت ربات تلگرام با Golang
  • آموزش Go Telegram Bot
  • ساخت Bot تلگرام با Go
  • Telegram Bot API در Go
  • Golang Telegram Bot
  • آموزش ساخت ربات با Golang
  • Go Telegram Bot Tutorial

عنوان SEO پیشنهادی:

آموزش ساخت ربات تلگرام با Go (Golang) از صفر تا اجرا

Meta Description پیشنهادی:

در این آموزش یاد می‌گیرید چگونه با Go و Telegram Bot API یک ربات تلگرام بسازید؛ از BotFather و Token تا Command، پیام، Inline Keyboard و اجرای Bot.

Slug پیشنهادی:

/telegram-bot-go/

Go چیست؟

Go یک زبان برنامه‌نویسی Open Source است که برای ساخت نرم‌افزارهای سریع، ساده و قابل نگهداری طراحی شده است.

Go در پروژه‌های Backend، سرویس‌های شبکه، Microserviceها، ابزارهای Command-Line و سیستم‌های توزیع‌شده کاربرد زیادی دارد.

یکی از ویژگی‌های مهم Go، پشتیبانی داخلی از Concurrency است.

برای مثال، Go با Goroutineها امکان اجرای هم‌زمان کارها را با Syntax نسبتاً ساده فراهم می‌کند.

این ویژگی برای سرویس‌هایی که باید تعداد زیادی درخواست یا عملیات مستقل را مدیریت کنند، بسیار مفید است.


چرا برای ساخت ربات تلگرام از Go استفاده کنیم؟

این بخش مهم‌ترین قسمت مقاله است.

ممکن است بپرسید:

وقتی می‌توانم با Python، Node.js یا زبان‌های دیگر Telegram Bot بسازم، چرا Go؟

پاسخ این است که Go همیشه بهترین انتخاب نیست؛ اما برای بعضی انواع Botها مزایای بسیار خوبی دارد.


۱. سرعت بالا

Go یک زبان Compiled است.

برنامه Go قبل از اجرا به Binary تبدیل می‌شود.

در نتیجه می‌توانیم یک فایل اجرایی مستقل داشته باشیم:

telegram-bot

و آن را روی Server اجرا کنیم.

این مدل Deployment بسیار ساده است.


۲. مصرف مناسب منابع

برای Botهایی که دائماً روی Server اجرا می‌شوند، مصرف CPU و RAM اهمیت دارد.

یک Bot کوچک Go می‌تواند به شکل یک Binary مستقل اجرا شود و به Runtime بزرگی مانند Node.js وابسته نباشد.

البته مقدار واقعی مصرف RAM و CPU کاملاً به Application، Library، تعداد Updateها، Database و سرویس‌های جانبی بستگی دارد؛ بنابراین نباید صرفاً بر اساس زبان برنامه‌نویسی ادعای یک عدد ثابت کرد.


۳. Concurrency

یکی از ویژگی‌های معروف Go، Goroutine است.

مثلاً:

go doSomething()

می‌تواند یک تابع را در یک Goroutine اجرا کند.

برای Telegram Botهایی که هم‌زمان باید عملیات‌هایی مانند موارد زیر را انجام دهند، این مدل بسیار کاربردی است:

Telegram Update
      ↓
     Bot
      ↓
 ┌────┼────┐
 ↓    ↓    ↓
API  DB   Queue

برای مثال، Bot می‌تواند پیام کاربر را دریافت کند، یک عملیات Database انجام دهد و در کنار آن یک سرویس خارجی را نیز فراخوانی کند.


۴. Deployment ساده

یکی از نقاط قوت Go این است که می‌توانید برنامه را Compile کنید و Binary تولیدشده را روی Server اجرا کنید.

برای مثال:

go build -o telegram-bot

سپس:

./telegram-bot

این موضوع برای Deployment بسیار راحت است.


۵. مناسب برای Backend

اگر Bot شما قرار است فقط یک /start ساده داشته باشد، تقریباً هر زبان مدرنی کافی است.

اما اگر Bot شما قرار است به این موارد متصل شود:

Telegram
   ↓
Go Backend
   ↓
PostgreSQL
   ↓
Redis
   ↓
REST API
   ↓
Message Queue

Go می‌تواند انتخاب بسیار مناسبی باشد.


۶. مناسب برای پروژه‌های بلندمدت

یکی از ویژگی‌های Go سادگی زبان است.

Go نسبت به بسیاری از زبان‌ها Syntax نسبتاً کوچکی دارد.

این موضوع باعث می‌شود در پروژه‌های تیمی، خواندن و نگهداری کد ساده‌تر شود.

البته این موضوع به کیفیت معماری پروژه نیز وابسته است؛ یک پروژه Go با معماری بد همچنان می‌تواند بسیار پیچیده باشد.


چه زمانی Go انتخاب خوبی نیست؟

این نکته نیز مهم است.

نباید تصور کنیم Go برای همه Telegram Botها بهترین زبان است.

اگر هدف شما این است که:

  • سریع یک Prototype بسازید.
  • از کتابخانه‌های فراوان AI استفاده کنید.
  • تیم شما Python بلد است.
  • پروژه بسیار کوچک است.
  • نیاز به توسعه بسیار سریع دارید.

ممکن است Python یا Node.js انتخاب راحت‌تری باشند.

اما اگر اولویت شما:

  • Performance
  • Concurrency
  • Deployment ساده
  • Backend قابل توسعه
  • مصرف مناسب منابع
  • ساخت سرویس طولانی‌مدت

باشد، Go گزینه بسیار جذابی است.


Telegram Bot چگونه کار می‌کند؟

قبل از کدنویسی، بهتر است معماری Telegram Bot را بدانیم.

به صورت ساده:

User
  ↓
Telegram
  ↓
Telegram Bot API
  ↓
Your Go Application
  ↓
Bot Logic
  ↓
Database / APIs

Telegram یک HTTP-based Bot API ارائه می‌کند و درخواست‌ها از طریق Endpointهای API انجام می‌شوند.

کتابخانه Go که در این آموزش استفاده می‌کنیم، لایه‌ای روی Bot API فراهم می‌کند تا لازم نباشد تمام HTTP Requestها و Updateها را دستی مدیریت کنیم.


چرا از کتابخانه Go استفاده کنیم؟

از نظر فنی می‌توانیم مستقیماً HTTP Request بفرستیم.

مثلاً Telegram API از ساختاری شبیه زیر استفاده می‌کند:

https://api.telegram.org/bot<TOKEN>/METHOD_NAME

برای مثال:

https://api.telegram.org/bot<TOKEN>/getMe

اما در یک پروژه واقعی، مدیریت مستقیم تمام API Methodها، Updateها، Typeها و Errorها باعث ایجاد کد اضافی می‌شود.

Telegram خودش نیز استفاده از Libraryها را برای ساخت پروژه‌های جدی‌تر توصیه/معرفی می‌کند و برای Go چندین Library را در فهرست رسمی نمونه‌ها قرار داده است.

در این آموزش از:

github.com/go-telegram/bot

استفاده می‌کنیم.

این پروژه یک Go Telegram Bot framework با وابستگی‌های صفر است و در مستندات فعلی خود Go 1.18+ و Bot API 10.2 را ذکر می‌کند.


مرحله اول: نصب Go

ابتدا Go را روی سیستم خود نصب کنید.

پس از نصب، Terminal را باز کنید:

go version

باید نسخه Go را مشاهده کنید.

برای این آموزش از یک نسخه جدید Go استفاده کنید.


مرحله دوم: ساخت پروژه Go

یک پوشه ایجاد کنید:

mkdir telegram-bot-go
cd telegram-bot-go

سپس یک Go Module ایجاد کنید:

go mod init telegram-bot-go

اکنون ساختار پروژه:

telegram-bot-go/
└── go.mod

مرحله سوم: نصب Telegram Bot Library

کتابخانه مورد استفاده را نصب کنید:

go get github.com/go-telegram/bot

مستندات فعلی همین Package را به عنوان یک Telegram Bot Framework برای Go معرفی می‌کنند.

اکنون فایل‌های مربوط به Module و Dependencyها ایجاد یا به‌روزرسانی می‌شوند.


مرحله چهارم: ساخت Bot با BotFather

مانند Node.js و Python، برای Go نیز ابتدا باید Telegram Bot خود را بسازید.

در Telegram وارد:

@BotFather

شوید.

سپس:

/newbot

را ارسال کنید.

BotFather از شما نام Bot را می‌خواهد.

مثلاً:

My Go Telegram Bot

سپس Username:

my_go_telegram_bot

در نهایت BotFather یک Token در اختیار شما قرار می‌دهد.

Token چیزی شبیه این است:

123456789:AAxxxxxxxxxxxxxxxxxxxxxxxx

Token را امن نگه دارید

Token را داخل Source Code قرار ندهید.

اشتباه:

bot.New("123456789:REAL_TOKEN")

روش بهتر:

TELEGRAM_BOT_TOKEN

را به عنوان Environment Variable تنظیم کنیم.

این روش مخصوصاً برای Deployment روی Server و Container بسیار مناسب‌تر است.


مرحله پنجم: تنظیم Environment Variable

در Linux یا macOS می‌توانید موقتاً بنویسید:

export TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN"

در Windows PowerShell:

$env:TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN"

اکنون Go می‌تواند Token را با:

os.Getenv("TELEGRAM_BOT_TOKEN")

دریافت کند.


مرحله ششم: ساخت اولین Telegram Bot با Go

یک فایل به نام:

main.go

ایجاد کنید.

کد زیر یک Bot ساده می‌سازد:

package main

import (
	"context"
	"os"
	"os/signal"

	"github.com/go-telegram/bot"
	"github.com/go-telegram/bot/models"
)

func main() {
	ctx, cancel := signal.NotifyContext(
		context.Background(),
		os.Interrupt,
	)
	defer cancel()

	b, err := bot.New(
		os.Getenv("TELEGRAM_BOT_TOKEN"),
		bot.WithDefaultHandler(handler),
	)

	if err != nil {
		panic(err)
	}

	b.Start(ctx)
}

func handler(
	ctx context.Context,
	b *bot.Bot,
	update *models.Update,
) {
	if update.Message == nil {
		return
	}

	_, err := b.SendMessage(
		ctx,
		&bot.SendMessageParams{
			ChatID: update.Message.Chat.ID,
			Text:   "سلام! 👋",
		},
	)

	if err != nil {
		panic(err)
	}
}

این الگو با نمونه‌ای که در مستندات فعلی go-telegram/bot ارائه شده هم‌راستا است: ساخت Bot، تعریف Default Handler و اجرای آن با Context.


مرحله هفتم: اجرای Bot

اکنون اجرا کنید:

go run .

اگر همه چیز درست باشد، برنامه اجرا خواهد شد.

اکنون وارد Telegram شوید.

Bot خود را پیدا کنید.

سپس:

/start

را ارسال کنید.

Bot باید:

سلام! 👋

را پاسخ دهد.


کد ما چگونه کار می‌کند؟

بیایید بخش‌های مهم را بررسی کنیم.

package main

package main

نشان می‌دهد این فایل بخشی از یک برنامه اجرایی Go است.


importها

import (
    "context"
    "os"
    "os/signal"

    "github.com/go-telegram/bot"
    "github.com/go-telegram/bot/models"
)

سه Package استاندارد Go داریم:

context
os
os/signal

و دو Package از کتابخانه Telegram:

bot
models

Context چیست؟

Context در Go یکی از مفاهیم بسیار مهم برای مدیریت Lifecycle، Cancellation و Timeout است.

در این پروژه:

ctx, cancel := signal.NotifyContext(
    context.Background(),
    os.Interrupt,
)

یک Context ایجاد می‌کنیم که با دریافت Interrupt قابل Cancel شدن است.

این موضوع به Shutdown تمیز برنامه کمک می‌کند.


ساخت Bot

قسمت اصلی:

b, err := bot.New(
    os.Getenv("TELEGRAM_BOT_TOKEN"),
    bot.WithDefaultHandler(handler),
)

در اینجا:

  1. Token را دریافت می‌کنیم.
  2. Bot را ایجاد می‌کنیم.
  3. Default Handler را مشخص می‌کنیم.

کتابخانه go-telegram/bot هنگام ساخت Bot نیز می‌تواند با getMe اعتبار Token را بررسی کند و در صورت خطا Error برگرداند.


Handler چیست؟

Handler تابعی است که Update دریافتی از Telegram را پردازش می‌کند.

در پروژه ما:

func handler(
    ctx context.Context,
    b *bot.Bot,
    update *models.Update,
)

سه چیز مهم در اختیار داریم:

ctx
b
update

ctx برای Context است.

b خود Telegram Bot است.

update اطلاعاتی است که از Telegram دریافت کرده‌ایم.


بررسی Message

این خط:

if update.Message == nil {
    return
}

بررسی می‌کند آیا Update شامل Message هست یا خیر.

چون Telegram فقط Message ارسال نمی‌کند.

ممکن است Update شامل مواردی مانند:

  • Message
  • Callback Query
  • Inline Query
  • و انواع دیگر Update

باشد.


ارسال پیام

برای ارسال پیام:

b.SendMessage(
    ctx,
    &bot.SendMessageParams{
        ChatID: update.Message.Chat.ID,
        Text:   "سلام! 👋",
    },
)

از SendMessage استفاده می‌کنیم.

Library مورد استفاده، Methodهای Telegram Bot API را در اختیار برنامه Go قرار می‌دهد؛ از جمله SendMessage و GetMe.


ساخت Command برای /start

اکنون بهتر است Bot را از حالت Echo ساده خارج کنیم.

می‌توانیم Handler مربوط به Commandها را جدا کنیم.

برای مثال:

func startHandler(
    ctx context.Context,
    b *bot.Bot,
    update *models.Update,
) {
    if update.Message == nil {
        return
    }

    b.SendMessage(
        ctx,
        &bot.SendMessageParams{
            ChatID: update.Message.Chat.ID,
            Text: "سلام! 👋\nبه ربات Go من خوش آمدید.",
        },
    )
}

سپس می‌توانیم Handlerهای مختلف برای Commandهای مختلف داشته باشیم.


یک Bot با چند Command

ساختار پروژه را کمی تغییر می‌دهیم:

telegram-bot-go/
│
├── main.go
├── handlers.go
└── go.mod

در main.go:

package main

import (
	"context"
	"os"
	"os/signal"

	"github.com/go-telegram/bot"
)

func main() {
	ctx, cancel := signal.NotifyContext(
		context.Background(),
		os.Interrupt,
	)
	defer cancel()

	b, err := bot.New(
		os.Getenv("TELEGRAM_BOT_TOKEN"),
	)

	if err != nil {
		panic(err)
	}

	b.Start(ctx)
}

سپس Handlerها را در فایل جدا قرار می‌دهیم.


چرا جدا کردن Handlerها مهم است؟

در پروژه کوچک:

main.go

کافی است.

اما در پروژه واقعی ممکن است داشته باشیم:

/start
/help
/about
/settings
/profile
/admin

اگر همه را داخل main.go قرار دهیم، فایل خیلی بزرگ می‌شود.

ساختار بهتر:

handlers/
├── start.go
├── help.go
├── profile.go
└── admin.go

دریافت پیام‌های متنی

فرض کنید می‌خواهیم به پیام‌های کاربر پاسخ دهیم.

منطق ساده:

func messageHandler(
	ctx context.Context,
	b *bot.Bot,
	update *models.Update,
) {
	if update.Message == nil {
		return
	}

	text := update.Message.Text

	b.SendMessage(
		ctx,
		&bot.SendMessageParams{
			ChatID: update.Message.Chat.ID,
			Text: "پیام شما: " + text,
		},
	)
}

اگر کاربر بگوید:

سلام

Bot پاسخ می‌دهد:

پیام شما: سلام

ساخت Inline Keyboard

Telegram Botها فقط برای ارسال Text نیستند.

می‌توانیم رابط کاربری تعاملی بسازیم.

مثلاً:

┌─────────────────────┐
│      📚 آموزش‌ها     │
├──────────┬──────────┤
│ ℹ️ درباره │ 📞 تماس  │
└──────────┴──────────┘

Inline Keyboard برای Botهای فروشگاهی، پشتیبانی، آموزش، مدیریت کاربران و بسیاری از کاربردهای دیگر بسیار مفید است.


معماری یک Bot حرفه‌ای با Go

وقتی Bot بزرگ شود، معماری پیشنهادی می‌تواند به این شکل باشد:

                  Telegram
                     │
                     ▼
              Telegram Bot API
                     │
                     ▼
                Go Telegram
                   Bot
                     │
          ┌──────────┼──────────┐
          ▼          ▼          ▼
       Handler    Middleware   Router
          │
          ▼
       Services
          │
    ┌─────┼─────┐
    ▼     ▼     ▼
   DB    Redis  APIs

این ساختار کمک می‌کند Telegram Layer از Business Logic جدا باشد.


Go و Database

فرض کنید Bot شما باید اطلاعات کاربران را ذخیره کند.

مثلاً:

users
--------------------------
id
telegram_id
username
first_name
created_at

وقتی کاربر /start می‌زند:

/start
   ↓
Go Handler
   ↓
User Service
   ↓
PostgreSQL
   ↓
Create / Update User

Go با Databaseهایی مانند PostgreSQL و MySQL به خوبی قابل استفاده است.

برای پروژه‌های جدی Telegram Bot، PostgreSQL می‌تواند انتخاب بسیار خوبی باشد.


Go برای Telegram Botهای بزرگ

اینجاست که انتخاب Go اهمیت بیشتری پیدا می‌کند.

فرض کنید Bot شما:

500 users

دارد.

ساخت آن با هر زبان مناسبی ممکن است.

اما اگر پروژه تبدیل شود به:

100,000+ users

و Bot به:

Database
Redis
External APIs
Queues
Payment
AI
Analytics

متصل شود، معماری Backend اهمیت زیادی پیدا می‌کند.

Go در چنین Backendهایی می‌تواند گزینه بسیار مناسبی باشد، مخصوصاً اگر Concurrency و مصرف منابع برای شما مهم باشند.

البته تعداد کاربر به تنهایی دلیل کافی برای انتخاب Go نیست؛ طراحی سیستم، نوع workload، Database و زیرساخت اهمیت بیشتری دارند.


Polling در برابر Webhook

Telegram Botها می‌توانند Updateها را از طریق روش‌هایی مانند Long Polling یا Webhook دریافت کنند.

در Polling:

Go Bot
   ↓
Telegram API
   ↓
"Any new updates?"
   ↓
Updates

در Webhook:

Telegram
   ↓
HTTPS POST
   ↓
Your Go Server

Library مورد استفاده در این مقاله برای Webhook نیز متدی به نام StartWebhook ارائه می‌کند.


چه زمانی Webhook استفاده کنیم؟

برای Local Development:

Polling

معمولاً ساده‌تر است.

برای Production:

Webhook

می‌تواند انتخاب خوبی باشد، مخصوصاً وقتی Server عمومی و HTTPS دارید.

اما انتخاب نهایی به معماری Deployment شما بستگی دارد.


Deployment ربات Go

یکی از مزیت‌های جذاب Go این است که می‌توانید برنامه را Build کنید.

go build -o telegram-bot

سپس:

./telegram-bot

برنامه اجرا می‌شود.

این Binary می‌تواند روی Server اجرا شود.


اجرای Bot با Docker

Go همچنین با Docker بسیار خوب ترکیب می‌شود.

یک Dockerfile ساده:

FROM golang:1.24-alpine AS builder

WORKDIR /app

COPY go.mod go.sum ./

RUN go mod download

COPY . .

RUN go build -o telegram-bot .

FROM alpine:latest

WORKDIR /app

COPY --from=builder /app/telegram-bot .

CMD ["./telegram-bot"]

سپس:

docker build -t telegram-bot .

و:

docker run \
  -e TELEGRAM_BOT_TOKEN="YOUR_TOKEN" \
  telegram-bot

در Production بهتر است Secretها را از روش‌های مناسب مدیریت Secret دریافت کنید و Token را مستقیماً داخل Dockerfile قرار ندهید.


چرا Go برای Docker جذاب است؟

Go می‌تواند یک Binary مستقل تولید کند.

در نتیجه می‌توانیم از Multi-stage Docker Build استفاده کنیم:

Go Source
   ↓
Builder Image
   ↓
Compiled Binary
   ↓
Small Runtime Image

این معماری می‌تواند Image نهایی را نسبت به نگه داشتن ابزارهای Build در Runtime ساده‌تر و کوچک‌تر کند.


مدیریت Graceful Shutdown

یکی از مزایای استفاده از Context در Go این است که می‌توانیم Lifecycle برنامه را بهتر مدیریت کنیم.

نمونه:

ctx, cancel := signal.NotifyContext(
    context.Background(),
    os.Interrupt,
)

defer cancel()

b.Start(ctx)

هنگامی که برنامه Signal دریافت می‌کند، Context لغو می‌شود.

در یک پروژه واقعی می‌توانید همین الگو را برای:

Telegram Bot
Database
Redis
HTTP Server
Workers

به کار ببرید.


مدیریت خطا در Go

یکی از تفاوت‌های مهم Go این است که Error Handling معمولاً به شکل explicit انجام می‌شود.

مثلاً:

_, err := b.SendMessage(
    ctx,
    &bot.SendMessageParams{
        ChatID: chatID,
        Text:   "Hello",
    },
)

if err != nil {
    log.Printf("failed to send message: %v", err)
}

این مدل در ابتدا ممکن است verbose به نظر برسد، اما باعث می‌شود مسیرهای خطا در کد کاملاً مشخص باشند.


امنیت Telegram Bot

چند اصل را همیشه رعایت کنید.

Token را در Source Code قرار ندهید

بد:

token := "123456789:REAL_TOKEN"

خوب:

token := os.Getenv("TELEGRAM_BOT_TOKEN")

Token را در Git Commit نکنید

اگر از Git استفاده می‌کنید، Secretهای واقعی را در Repository قرار ندهید.

برای Production نیز بهتر است Token را از Secret Management یا Environment مناسب دریافت کنید.


یک ساختار حرفه‌ای برای پروژه

برای یک Bot متوسط تا بزرگ می‌توان ساختار زیر را در نظر گرفت:

telegram-bot/
│
├── cmd/
│   └── bot/
│       └── main.go
│
├── internal/
│   ├── bot/
│   │   ├── handlers/
│   │   │   ├── start.go
│   │   │   ├── help.go
│   │   │   └── messages.go
│   │   │
│   │   └── middleware/
│   │       └── logging.go
│   │
│   ├── service/
│   │   └── user.go
│   │
│   ├── repository/
│   │   └── user.go
│   │
│   └── database/
│       └── postgres.go
│
├── go.mod
├── go.sum
├── Dockerfile
└── README.md

این ساختار از یک اصل مهم پیروی می‌کند:

Telegram Handler نباید تمام Business Logic پروژه را در خود داشته باشد.

مثلاً بهتر است این کار را نکنیم:

Telegram Handler
    ↓
SQL Query
    ↓
Payment API
    ↓
Business Logic

بهتر است:

Telegram Handler
    ↓
Service
    ↓
Repository / External API

باشد.


چه پروژه‌هایی را می‌توان با Go Telegram Bot ساخت؟

تقریباً هر نوع Botی که Telegram Bot API اجازه دهد.

برای مثال:

ربات پشتیبانی

User
 ↓
Telegram Bot
 ↓
Support Service
 ↓
Admin

ربات فروشگاهی

Product
 ↓
Cart
 ↓
Order
 ↓
Payment
 ↓
Database

ربات هوش مصنوعی

User
 ↓
Telegram
 ↓
Go
 ↓
AI API
 ↓
Go
 ↓
Telegram

ربات مانیتورینگ

Server
 ↓
Monitoring Service
 ↓
Go Bot
 ↓
Telegram Admin

این مدل برای ارسال Alert بسیار جذاب است.

مثلاً:

🚨 Server Alert

CPU: 95%
Memory: 91%
Status: WARNING

آیا Go برای AI Telegram Bot مناسب است؟

بله.

اما نکته مهم این است که Go قرار نیست مدل AI را حتماً خودش اجرا کند.

معماری معمول:

Telegram
   ↓
Go Bot
   ↓
AI API
   ↓
Go Bot
   ↓
Telegram

Go می‌تواند نقش Backend و Orchestration Layer را داشته باشد.

برای مثال:

  1. پیام Telegram را دریافت کند.
  2. User را احراز هویت کند.
  3. Conversation را از Database بخواند.
  4. درخواست را به AI API ارسال کند.
  5. Response را دریافت کند.
  6. نتیجه را به Telegram ارسال کند.
  7. Conversation را ذخیره کند.

این معماری برای یک پروژه واقعی بسیار قدرتمندتر از یک Bot ساده Echo است.


Go یا Node.js برای Telegram Bot؟

اگر بین Go و Node.js مردد هستید، پاسخ به نیاز پروژه بستگی دارد.

ویژگیGoNode.js
Performanceبسیار خوببسیار خوب
Concurrencyنقطه قوت اصلیEvent Loop + Async
Memoryمعمولاً مناسبمناسب
شروع سریعخوببسیار خوب
اکوسیستم npmنداردبسیار بزرگ
Deploymentبسیار سادهساده
TypeScriptندارد، زبان مستقلدارد
Backendعالیعالی
AI Ecosystemخوببسیار خوب
مناسب Microserviceعالیعالی

نظر من

اگر شما از قبل JavaScript/Node.js می‌دانید و Bot کوچک است، تغییر به Go صرفاً برای ساخت Telegram Bot ضرورت ندارد.

اما اگر:

  • Go را می‌دانید،
  • Bot بخشی از یک Backend بزرگ‌تر است،
  • Concurrency اهمیت دارد،
  • Deployment ساده می‌خواهید،
  • یا می‌خواهید Bot بخشی از یک معماری Go-based باشد،

استفاده از Go کاملاً منطقی است.


یک نکته مهم درباره انتخاب Library

برای Go چندین Telegram Bot Library وجود دارد.

Telegram در فهرست رسمی Bot API Libraries خود گزینه‌هایی مانند go-telegram/bot، Telego، gotgbot و چند پروژه دیگر را معرفی می‌کند.

یکی از گزینه‌های قدیمی‌تر و بسیار شناخته‌شده نیز:

github.com/go-telegram-bot-api/telegram-bot-api/v5

است.

این پروژه خود را به عنوان یک Wrapper برای Telegram Bot API معرفی می‌کند و Documentation و Examples متعددی دارد.

برای این مقاله go-telegram/bot را انتخاب کردیم چون API فعلی آن برای ساخت یک Bot مدرن، ساده و مستقیم است و در حال حاضر نیز در فهرست رسمی Telegram قرار دارد.


نسخه ساده و نهایی Bot

اگر بخواهیم یک نسخه جمع‌وجور و مناسب برای شروع داشته باشیم:

package main

import (
	"context"
	"os"
	"os/signal"

	"github.com/go-telegram/bot"
	"github.com/go-telegram/bot/models"
)

func main() {
	ctx, cancel := signal.NotifyContext(
		context.Background(),
		os.Interrupt,
	)
	defer cancel()

	token := os.Getenv("TELEGRAM_BOT_TOKEN")

	if token == "" {
		panic("TELEGRAM_BOT_TOKEN is not set")
	}

	b, err := bot.New(
		token,
		bot.WithDefaultHandler(handler),
	)

	if err != nil {
		panic(err)
	}

	b.Start(ctx)
}

func handler(
	ctx context.Context,
	b *bot.Bot,
	update *models.Update,
) {
	if update.Message == nil {
		return
	}

	text := update.Message.Text

	_, err := b.SendMessage(
		ctx,
		&bot.SendMessageParams{
			ChatID: update.Message.Chat.ID,
			Text: "شما گفتید: " + text,
		},
	)

	if err != nil {
		panic(err)
	}
}

اجرای آن:

go run .

یا Build:

go build -o telegram-bot

و سپس:

./telegram-bot

جمع‌بندی؛ چرا ربات تلگرام را با Go بسازیم؟

ساخت Telegram Bot با Go فقط یک انتخاب برای متفاوت بودن نیست.

اگر پروژه شما یک Bot کوچک و ساده است، Python، Node.js یا حتی زبان‌های دیگر می‌توانند کاملاً کافی باشند.

اما وقتی Bot بخشی از یک Backend جدی‌تر می‌شود، ویژگی‌های Go اهمیت بیشتری پیدا می‌کنند:

Fast Compilation
      +
Low-level Control
      +
Concurrency
      +
Simple Deployment
      +
Strong Typing
      +
Excellent Backend Ecosystem

ترکیب این ویژگی‌ها باعث می‌شود Go برای ساخت Telegram Botهایی که قرار است بخشی از یک سیستم Backend بزرگ‌تر باشند، انتخاب بسیار خوبی باشد.

از طرف دیگر، Telegram Bot API مستقل از زبان است؛ بنابراین بهترین زبان، زبانی نیست که صرفاً سریع‌تر باشد، بلکه زبانی است که با نیاز پروژه، مهارت تیم و معماری سیستم شما هماهنگ باشد.

اگر تازه Go را یاد گرفته‌اید، ساخت یک Telegram Bot یکی از پروژه‌های خوبی است که می‌توانید با آن مفاهیمی مانند:

  • context
  • concurrency
  • HTTP/API
  • error handling
  • environment variables
  • database access
  • graceful shutdown
  • Docker
  • Webhook

را در یک پروژه واقعی تمرین کنید.


سوالات متداول درباره ساخت Telegram Bot با Go

آیا می‌توان با Go ربات تلگرام ساخت؟

بله. Telegram Bot API یک API مبتنی بر HTTP است و Go نیز چندین Library برای کار با آن دارد. Telegram نیز چند Library مربوط به Go را در فهرست رسمی خود معرفی می‌کند.

آیا Go برای Telegram Bot بهتر از Python است؟

نه به صورت مطلق.

Python برای توسعه سریع و استفاده از اکوسیستم بزرگ خود بسیار مناسب است. Go در عوض برای Backendهای سریع، Concurrent و قابل Deployment می‌تواند مزایای مهمی داشته باشد.

آیا Go برای Telegram Bot بهتر از Node.js است؟

باز هم پاسخ مطلق وجود ندارد.

اگر تیم شما JavaScript می‌داند، Node.js ممکن است سریع‌تر باشد. اگر پروژه شما Go-based است یا Concurrency، Binary Deployment و سادگی Runtime برایتان مهم است، Go می‌تواند انتخاب بهتری باشد.

آیا ساخت Telegram Bot با Go رایگان است؟

خود Telegram Bot API برای توسعه Bot ارائه شده است، اما اجرای Bot روی VPS یا Cloud ممکن است هزینه زیرساخت داشته باشد.

آیا می‌توان Bot ساخته‌شده با Go را روی VPS اجرا کرد؟

بله. یکی از مزایای Go این است که می‌توانید برنامه را به یک Binary تبدیل کنید و آن را روی Server اجرا کنید.

آیا می‌توان Bot Go را با Docker اجرا کرد؟

بله. Go و Docker ترکیب بسیار مناسبی برای Deployment Backend هستند.

آیا می‌توان با Go یک AI Telegram Bot ساخت؟

بله. Go می‌تواند به عنوان Backend عمل کند و از طریق API با سرویس‌های AI ارتباط برقرار کند.

آیا Go برای Botهای بزرگ مناسب است؟

بله، می‌تواند مناسب باشد؛ مخصوصاً وقتی Bot بخشی از یک سیستم Backend بزرگ‌تر با Database، Cache، Queue و APIهای مختلف است. البته مقیاس‌پذیری بیشتر از آنکه به زبان وابسته باشد، به معماری صحیح سیستم بستگی دارد.


منابع و مستندات

برای مطالعه بیشتر، منابع زیر نقطه شروع مناسبی هستند:

نظرات

برای ارسال نظر باید وارد شوید.