تلگرام امروز دیگر فقط یک پیامرسان نیست؛ یک پلتفرم کسبوکار واقعی است. میلیونها ایرانی هر روز از تلگرام استفاده میکنند و همین موضوع، ساخت ربات تلگرام را به یکی از پرطرفدارترین مهارتهای برنامهنویسی در ایران تبدیل کرده.
اگر یک برنامهنویس C# هستی یا تازه داری وارد دنیای داتنت میشی، خبر خوبی برات داریم: ساخت ربات تلگرام با C# نهتنها ممکنه، بلکه با ابزارهای موجود، کار خیلی جذاب و نسبتاً سادهایه.
در این مقاله، از صفر مطلق تا ساخت یک ربات کامل و کارآمد رو باهم طی میکنیم. کد کامل داریم، توضیحات کامل داریم و هیچ چیزی رو ناگفته نمیذاریم.
قبل از اینکه وارد کدنویسی بشیم، باید مطمئن بشیم که همه ابزارهای لازم رو داریم:
اول از همه باید رباتمون رو در تلگرام ثبت کنیم. این کار رو از طریق BotFather انجام میدیم که یه ربات رسمی تلگرامه:
⚠️ هشدار مهم: توکن ربات مثل رمز عبوره. هیچوقت اون رو در کد پابلیک (مثل GitHub) قرار نده!
بهترین کتابخانه برای کار با API تلگرام در C#، پکیج Telegram.Bot است که رسمیترین و پرطرفدارترین گزینه در اکوسیستم داتنته.
ترمینال رو باز کن و دستورات زیر رو اجرا کن:
dotnet new console -n TelegramBotCSharp
cd TelegramBotCSharp
dotnet add package Telegram.Bot
dotnet add package Microsoft.Extensions.Hosting
پکیج Telegram.Bot همه چیزی رو که برای ارتباط با API تلگرام نیاز داری فراهم میکنه. این کتابخانه بهصورت async نوشته شده که برای برنامههای real-time عالیه.
فایل Program.cs رو باز کن و کد زیر رو بنویس:
using Telegram.Bot;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
var botToken = “YOUR_BOT_TOKEN_HERE”; // توکن ربات خودت رو اینجا بذار
var botClient = new TelegramBotClient(botToken);
using CancellationTokenSource cts = new();
ReceiverOptions receiverOptions = new()
{
AllowedUpdates = Array.Empty()
};
botClient.StartReceiving(
updateHandler: HandleUpdateAsync,
pollingErrorHandler: HandlePollingErrorAsync,
receiverOptions: receiverOptions,
cancellationToken: cts.Token
);
var me = await botClient.GetMeAsync();
Console.WriteLine($“ربات {me.Username} با موفقیت راهاندازی شد!”);
Console.ReadLine();
cts.Cancel();
async Task HandleUpdateAsync(ITelegramBotClient botClient,
Update update, CancellationToken cancellationToken)
{
if (update.Message is not { } message) return;
if (message.Text is not { } messageText) return;
var chatId = message.Chat.Id;
Console.WriteLine($“پیام دریافت شد از {chatId}: ‘{messageText}’”);
switch (messageText.ToLower())
{
case “/start”:
await botClient.SendTextMessageAsync(
chatId: chatId,
text: “سلام! 👋 به ربات ما خوش آمدید!
برای راهنمایی /help را بفرستید.”,
cancellationToken: cancellationToken);
break;
case “/help”:
await botClient.SendTextMessageAsync(
chatId: chatId,
text: “📌 دستورات موجود:
/start - شروع
/about - درباره ما
/contact - تماس با ما”,
cancellationToken: cancellationToken);
break;
case “/about”:
await botClient.SendTextMessageAsync(
chatId: chatId,
text: “🤖 این ربات با C# و کتابخانه Telegram.Bot ساخته شده است.”,
cancellationToken: cancellationToken);
break;
default:
await botClient.SendTextMessageAsync(
chatId: chatId,
text: $“شما نوشتید: {messageText}
برای راهنمایی /help را بفرستید.”,
cancellationToken: cancellationToken);
break;
}
}
Task HandlePollingErrorAsync(ITelegramBotClient botClient,
Exception exception, CancellationToken cancellationToken)
{
var errorMessage = exception switch
{
ApiRequestException apiRequestException
=> $“خطای API تلگرام:
[{apiRequestException.ErrorCode}]
{apiRequestException.Message}”,
_ => exception.ToString()
};
Console.WriteLine(errorMessage);
return Task.CompletedTask;
}
یکی از قدرتهای ربات تلگرام اینه که میتونه انواع مختلف محتوا ارسال کنه. بیاید چند نمونه ببینیم:
// ارسال عکس از طریق URL
await botClient.SendPhotoAsync(
chatId: chatId,
photo: InputFile.FromUri(“https://example.com/image.jpg”),
caption: “این یک تصویر نمونه است! 📸”,
cancellationToken: cancellationToken);
// ارسال عکس از روی دیسک
using var fileStream = new FileStream(“image.jpg”, FileMode.Open);
await botClient.SendPhotoAsync(
chatId: chatId,
photo: InputFile.FromStream(fileStream, “image.jpg”),
caption: “تصویر ارسال شده از سرور”,
cancellationToken: cancellationToken);
using Telegram.Bot.Types.ReplyMarkups;
var inlineKeyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData(“✅ بله”, “yes”),
InlineKeyboardButton.WithCallbackData(“❌ خیر”, “no”),
},
new[]
{
InlineKeyboardButton.WithCallbackData(“🏠 منوی اصلی”, “main_menu”),
}
});
await botClient.SendTextMessageAsync(
chatId: chatId,
text: “لطفاً یک گزینه انتخاب کنید:”,
replyMarkup: inlineKeyboard,
cancellationToken: cancellationToken);
// داخل HandleUpdateAsync اضافه کن:
if (update.CallbackQuery is { } callbackQuery)
{
await botClient.AnswerCallbackQueryAsync(
callbackQueryId: callbackQuery.Id,
text: $“شما انتخاب کردید: {callbackQuery.Data}”,
cancellationToken: cancellationToken);
await botClient.SendTextMessageAsync(
chatId: callbackQuery.Message!.Chat.Id,
text: $“گزینه انتخابی: {callbackQuery.Data}”,
cancellationToken: cancellationToken);
}
آیا میخواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگخورهایتان چند برابر شود؟ سئوی سایت خود را به متخصصان ما بسپارید. همین حالا برای مشاوره رایگان با ما تماس بگیرید:
📞 09190994063 - 09376846692
یک ربات حرفهای بدون پایگاه داده کامل نیست. بیاید ببینیم چطور میتونیم از SQLite در کنار رباتمون استفاده کنیم:
// نصب پکیج
// dotnet add package Microsoft.EntityFrameworkCore.Sqlite
using Microsoft.EntityFrameworkCore;
public class BotDbContext : DbContext
{
public DbSet Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite(“Data Source=bot.db”);
}
public class UserModel
{
public int Id { get; set; }
public long TelegramId { get; set; }
public string Username { get; set; } = string.Empty;
public string FirstName { get; set; } = string.Empty;
public DateTime RegisteredAt { get; set; } = DateTime.Now;
}
// در HandleUpdateAsync استفاده کن:
using var db = new BotDbContext();
await db.Database.EnsureCreatedAsync();
var existingUser = await db.Users
.FirstOrDefaultAsync(u => u.TelegramId == message.From!.Id);
if (existingUser == null)
{
var newUser = new UserModel
{
TelegramId = message.From!.Id,
Username = message.From.Username ?? “بدون یوزرنیم”,
FirstName = message.From.FirstName
};
db.Users.Add(newUser);
await db.SaveChangesAsync();
Console.WriteLine($“کاربر جدید ثبت شد: {newUser.FirstName}”);
}
رباتی که فقط روی لپتاپت اجرا میشه به دردت نمیخوره! باید اون رو روی یه سرور دائمی مستقر کنی. چند روش محبوب وجود داره:
سادهترین روشه. کافیه پروژه رو Publish کنی و روی سرور لینوکس اجرا کنی:
# Publish پروژه
dotnet publish -c Release -r linux-x64 --self-contained
اجرا به عنوان سرویس با systemd
sudo nano /etc/systemd/system/telegram-bot.service
[Unit]
Description=My Telegram Bot
After=network.target
[Service]
WorkingDirectory=/opt/telegram-bot
ExecStart=/opt/telegram-bot/TelegramBotCSharp
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
sudo systemctl enable telegram-bot
sudo systemctl start telegram-bot
روش Webhook بهینهتره چون سرور دیگه مدام به API تلگرام request نمیزنه، بلکه تلگرام خودش پیامها رو برامون میفرسته:
// تنظیم Webhook
await botClient.SetWebhookAsync(
url: “https://yourdomain.com/bot”,
cancellationToken: cts.Token);
// در ASP.NET Core:
app.MapPost(“/bot”, async (
ITelegramBotClient bot,
Update update,
IUpdateHandler handler,
CancellationToken ct) =>
{
await handler.HandleUpdateAsync(bot, update, ct);
});
امنیت ربات تلگرام رو هیچوقت دست کم نگیر. این موارد الزامیه:
// بررسی دسترسی ادمین
private static readonly long[] AdminIds = { 123456789, 987654321 };
bool IsAdmin(long userId) => AdminIds.Contains(userId);
// استفاده:
if (messageText == “/admin” && !IsAdmin(message.From!.Id))
{
await botClient.SendTextMessageAsync(chatId,
“⛔ شما به این دستور دسترسی ندارید.”,
cancellationToken: cancellationToken);
return;
}
با این دانش، میتونی رباتهای خیلی مفیدی بسازی:
ساخت ربات تلگرام یک قدم عالیه، اما بدون سئوی حرفهای، رقبا جلوی شما میمانند. آیا میخواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگخورهایتان چند برابر شود؟ سئوی سایت خود را به متخصصان ما بسپارید. همین حالا برای مشاوره رایگان با ما تماس بگیرید:
📞 09190994063 - 09376846692
برای تست و توسعه، ربات میتونه روی کامپیوتر شخصیات اجرا بشه. اما برای اینکه ربات ۲۴ ساعته و ۷ روز هفته آنلاین باشه، به یه سرور VPS نیاز داری. سرورهای لینوکسی ایرانی یا خارجی با 1GB RAM کافیه.
در Polling، ربات مدام از تلگرام میپرسه “پیام جدیدی هست؟” که منابع بیشتری مصرف میکنه. در Webhook، تلگرام خودش وقتی پیام جدیدی بیاد، اون رو به سرور ما میفرسته. Webhook سریعتر، بهینهتر و حرفهایتره اما نیاز به دامنه با SSL داره.
بله! API تلگرام کاملاً رایگانه و هیچ محدودیتی برای استفاده از BotFather نیست. کتابخانه Telegram.Bot هم Open Source و رایگانه. تنها هزینهای که ممکنه داشته باشی، هزینه سرور برای استقرار ربانته.
اگه سرور ربات شما در ایران باشه و API تلگرام فیلتر باشه، ربات کار نمیکنه. راهحل اینه که ربات رو روی سرور خارج از ایران مستقر کنی تا مستقیم به API تلگرام وصل بشه. کاربران هم میتونن از فیلترشکن استفاده کنن.
قطعاً بله! رباتهای تلگرامی کسبوکارهای زیادی در ایران دارن. از ربات فروشگاهی با درگاه پرداخت تا ربات آموزشی با اشتراک ماهانه. C# با قابلیتهای بالایی که داره، برای ساخت چنین رباتهایی انتخاب فوقالعادهایه.
Telegram.Bot محبوبترین و کاملترین کتابخانه C# برای تلگرام است که بهصورت فعال نگهداری میشه و تقریباً تمام ویژگیهای API تلگرام رو پوشش میده. گزینههای دیگهای مثل TelegramBotFramework هم وجود داره که برای پروژههای بزرگتر مناسبتره.
ساخت ربات تلگرام با C# یه مهارت ارزشمنده که میتونه کسبوکارت رو متحول کنه. با کتابخانه Telegram.Bot و دانش C#، میتونی رباتهای حرفهای و کارآمد بسازی. همین امروز شروع کن!
مقاله بسیار جامع و کاربردی بود. ممنون از توضیحات کاملتون. فقط یک سوال، برای رباتهایی که ترافیک بالایی دارند، آیا Polling همچنان گزینه مناسبی است یا حتماً باید از Webhook استفاده کرد؟
خوشحالیم که مقاله براتون مفید بوده. برای رباتهایی با ترافیک بالا، Webhook قطعاً گزینه بهینهتر و حرفهایتری است زیرا بار پردازشی سرور شما را کاهش میدهد و پاسخگویی سریعتری دارد. Polling برای ترافیک کم یا رباتهای شخصی مناسبتر است. برای مشاوره بیشتر میتوانید با ما تماس بگیرید: 09190994063 - 09376846692
بخش امنیت توکن و استفاده از Environment Variables خیلی مهم بود. ممنون که به این نکته اشاره کردید. آیا راهی برای رمزنگاری توکن در سرور هم وجود دارد که امنیت بیشتری داشته باشد؟
بله، روشهای پیشرفتهتری برای محافظت از توکن وجود دارد، مانند استفاده از Azure Key Vault یا HashiCorp Vault که توکنها و Secretها را به صورت امن ذخیره و مدیریت میکنند. برای پروژههای کوچک و متوسط، استفاده از Environment Variables یا User Secrets در محیط توسعه معمولاً کافی است. امنیت چندلایه همیشه بهترین راهکار است. برای مشاوره تماس بگیرید: 09190994063 - 09376846692
توضیحات مربوط به استقرار ربات روی سرور با systemd بسیار مفید بود. اگر بخواهیم از Docker برای استقرار استفاده کنیم، آیا تفاوتی در ساختار پروژه C# ایجاد میشود یا فقط Dockerfile باید اضافه شود؟
برای استقرار با Docker، ساختار پروژه C# شما تفاوت عمدهای نخواهد داشت. شما نیاز به یک Dockerfile دارید که مراحل Build و Publish پروژه را انجام داده و سپس آن را در یک کانتینر اجرا کند. استفاده از Docker برای مدیریت وابستگیها و ایزولاسیون محیط بسیار توصیه میشود. برای مشاوره تخصصی در این زمینه با ما تماس بگیرید: 09190994063 - 09376846692
توصیههای حرفهای مانند Rate Limiting و Dependency Injection واقعاً نشاندهنده یک رویکرد حرفهای در توسعه بودند. آیا کتابخانه Telegram.Bot ابزاری برای پیادهسازی Rate Limiting داخلی دارد یا باید خودمان آن را پیاده کنیم؟
کتابخانه Telegram.Bot به صورت داخلی مکانیزم Rate Limiting پیچیدهای برای مدیریت درخواستهای شما به API تلگرام ندارد. این محدودیتها (مانند 30 پیام در ثانیه به یک کاربر) باید توسط توسعهدهنده و در منطق برنامهنویسی ربات پیادهسازی شوند. میتوانید از پکیجهای Rate Limiting موجود در .NET یا یک مکانیزم صفبندی (Queue) استفاده کنید. برای راهنمایی بیشتر با ما تماس بگیرید: 09190994063 - 09376846692
من تازه وارد دنیای C# شدم. آیا ساخت ربات تلگرام برای یک مبتدی کار سختی است؟ چقدر طول میکشد تا بتوانم یک ربات ساده را بسازم و راهاندازی کنم؟
خیر، ساخت ربات تلگرام با C# و کتابخانه Telegram.Bot برای مبتدیان با کمی آشنایی با اصول C# و مفاهیم شیءگرایی کاملاً قابل انجام است. با دنبال کردن این مقاله میتوانید در کمتر از چند ساعت یک ربات ساده با قابلیت پاسخگویی به دستورات را راهاندازی کنید. تمرین و تکرار کمک زیادی میکند. برای راهنمایی بیشتر با ما تماس بگیرید: 09190994063 - 09376846692
ایدههای کاربردی برای رباتها خیلی جذاب بودند، مخصوصاً ربات فروشگاه آنلاین. آیا کتابخانه Telegram.Bot قابلیت اتصال به درگاههای پرداخت ایرانی را به صورت مستقیم پشتیبانی میکند؟
کتابخانه Telegram.Bot به صورت مستقیم قابلیت اتصال به درگاههای پرداخت ایرانی را ندارد، اما شما میتوانید با استفاده از API درگاههای پرداخت ایرانی (مثل زرینپال، نکستپی و...) و پیادهسازی منطق پرداخت در کدهای C# ربات خود، این قابلیت را اضافه کنید. ربات تنها نقش واسط بین کاربر و درگاه پرداخت را ایفا خواهد کرد. برای مشاوره در زمینه اتصال به درگاههای پرداخت با ما تماس بگیرید: 09190994063 - 09376846692
سلام، بخش مربوط به پایگاه داده و استفاده از SQLite خیلی عالی بود. آیا امکان استفاده از پایگاه دادههای دیگری مثل SQL Server یا PostgreSQL هم وجود دارد؟ چه تغییراتی لازم است؟
بله، قطعاً میتوانید از پایگاه دادههای دیگری مانند SQL Server، PostgreSQL یا MySQL نیز استفاده کنید. کافیست پکیج Entity Framework Core مربوط به آن دیتابیس (مثلاً Microsoft.EntityFrameworkCore.SqlServer) را نصب کرده و Connection String را در متد OnConfiguring کلاس DbContext تغییر دهید. بقیه ساختار کد و نحوه استفاده از DbSetها یکسان خواهد بود. برای اطلاعات بیشتر با ما تماس بگیرید: 09190994063 - 09376846692
سوالات متداول (FAQ) بسیار کاربردی بودند. در مورد فیلترشکنپذیر کردن ربات، آیا راهی وجود ندارد که بدون استقرار روی سرور خارجی، ربات در ایران هم کار کند؟ مثلاً با استفاده از پروکسی داخلی؟
در حال حاضر، بهترین و پایدارترین راه برای اطمینان از دسترسی کامل ربات به API تلگرام (که خودش فیلتر است) این است که ربات را روی سروری خارج از ایران مستقر کنید. استفاده از پروکسی داخلی برای ربات ممکن است پیچیدگیهایی داشته باشد و پایداری آن تضمین شده نیست، زیرا اتصال خود ربات به تلگرام فیلتر است. برای اطلاعات بیشتر با ما تماس بگیرید: 09190994063 - 09376846692
ممنون بابت این آموزش کامل و مفید. در مورد مدیریت State کاربر، آیا Telegram.Bot.Framework که اشاره کردید، بهترین گزینه است یا راهکارهای سادهتری برای مدیریت گفتگوهای چند مرحلهای وجود دارد؟
Telegram.Bot.Framework یکی از گزینههای قدرتمند برای مدیریت State و گفتگوهای پیچیده است، خصوصاً در پروژههای بزرگ. برای رباتهای سادهتر، میتوانید خودتان با ذخیره State کاربر در دیتابیس (مثلاً فیلدی به نام 'CurrentState' در جدول کاربران) و استفاده از یک ماشین وضعیت (State Machine) ساده، این کار را پیادهسازی کنید. انتخاب ابزار بستگی به پیچیدگی ربات شما دارد. برای مشاوره تماس بگیرید: 09190994063 - 09376846692