رباتهای تلگرام به یکی از پرکاربردترین ابزارهای ارتباطی و اتوماسیون در فضای دیجیتال تبدیل شدهاند. از پاسخگویی خودکار در کانالهای خبری گرفته تا مدیریت سفارشها، نظرسنجیها، و حتی آموزشهای تعاملی، رباتها نقش مهمی در سادهسازی تعاملات و افزایش بهرهوری ایفا میکنند. اما برای بسیاری از علاقهمندان به برنامهنویسی، ساخت یک ربات از صفر ممکن است کاری پیچیده و مبهم به نظر برسد.
در این مطلب، قصد داریم مسیر ساخت یک ربات تلگرام با زبان پایتون را از ابتداییترین مراحل تا پیادهسازی حرفهای و انتشار روی سرور، بهصورت گامبهگام و با مثالهای عملی بررسی کنیم. این مقاله نهتنها برای مبتدیها طراحی شده، بلکه برای توسعهدهندگانی که به دنبال ساخت رباتهای کاربردی، قابل توسعه و امن هستند نیز مفید خواهد بود.
در طول مسیر، با مفاهیم کلیدی مانند دریافت توکن از BotFather، مدیریت پیامها و دستورات، طراحی منوهای تعاملی، ذخیرهسازی دادهها، و اجرای ربات روی سرور آشنا خواهید شد. همچنین با چالشهای امنیتی، محدودسازی کاربران، و نگهداری پروژه در محیط واقعی روبهرو میشوید و راهحلهای عملی برای آنها دریافت میکنید.
پیشنیازها
پیش از آنکه وارد دنیای کدنویسی و ساخت ربات شویم، لازم است چند ابزار و مفهوم پایه را بشناسیم و آماده کنیم. این مرحله نهتنها از بروز خطاهای رایج جلوگیری میکند، بلکه مسیر یادگیری را روانتر و قابل پیشبینیتر میسازد.
1. آشنایی مقدماتی با پایتون
اگر تاکنون با پایتون کار نکردهاید، نگران نباشید. برای ساخت ربات تلگرام، تنها به دانستن مفاهیم پایهای مانند متغیرها، توابع، شرطها و حلقهها نیاز دارید. اگر با این مفاهیم آشنا نیستید، پیشنهاد میشود ابتدا یک آموزش مقدماتی پایتون را مشاهده کنید.
2. نصب پایتون و ابزارهای توسعه
برای شروع، باید پایتون را روی سیستم خود نصب کنید. آخرین نسخه را از python.org دریافت و نصب نمایید. پس از نصب، با اجرای دستور زیر در ترمینال، مطمئن شوید که پایتون بهدرستی نصب شده است:
python --version
همچنین نصب ابزار مدیریت بستهها (pip) ضروری است. معمولاً همراه با پایتون نصب میشود، اما میتوانید با دستور زیر بررسی کنید:
pip --version
برای نوشتن و اجرای کدها، استفاده از محیط توسعهای مانند VS Code یا PyCharm توصیه میشود.
3. ساخت حساب تلگرام و دریافت توکن از BotFather
برای ساخت ربات، باید یک حساب تلگرام داشته باشید. سپس مراحل زیر را طی کنید:
- در تلگرام، کاربر
@BotFatherرا جستجو کنید. - دستور
/newbotرا ارسال کنید. - نام و نام کاربری (username) ربات را انتخاب کنید.
- پس از تأیید، BotFather یک توکن (کلید دسترسی) برای شما ارسال میکند.
این توکن مانند رمز عبور ربات شماست، آن را در جای امنی نگه دارید و در کدهای خود استفاده کنید.
4. نصب کتابخانههای مورد نیاز
برای تعامل با API تلگرام، کتابخانههای مختلفی وجود دارند. یکی از محبوبترینها python-telegram-bot است. برای نصب آن، کافیست دستور زیر را اجرا کنید:
pip install python-telegram-bot
در ادامه مطلب، از این کتابخانه برای ساخت ربات استفاده خواهیم کرد. اگر کتابخانه دیگری مدنظر دارید (مثل telebot یا aiogram)، میتوانید مسیر را با آنها نیز تطبیق دهید.
شروع پروژه
اکنون که ابزارها و توکن ربات را در اختیار داریم، وقت آن رسیده که اولین قدم عملی را برداریم و پروژه ساخت ربات را آغاز کنیم. در این بخش، پوشه پروژه را ایجاد میکنیم، فایل اصلی را مینویسیم، کتابخانه را فراخوانی میکنیم و اتصال ربات به تلگرام را تست میکنیم.
1. ایجاد پوشه و فایل اصلی
در سیستم خود یک پوشه جدید برای پروژه بسازید. مثلاً:
mkdir telegram_bot
cd telegram_bot
سپس یک فایل پایتون با نام دلخواه ایجاد کنید، مثلاً:
touch bot.py
2. فراخوانی کتابخانه و تنظیم توکن
در فایل bot.py، ابتدا کتابخانه python-telegram-bot را فراخوانی کرده و توکن دریافتی از BotFather را وارد کنید:
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
TOKEN = 'place token here'
3. تعریف دستور /start
در ادامه، یک تابع ساده برای پاسخگویی به دستور /start تعریف میکنیم:
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('Hello World.')
4. راهاندازی اپلیکیشن و افزودن هندلر
اکنون باید اپلیکیشن ربات را راهاندازی کرده و هندلر مربوط به دستور /start را به آن اضافه کنیم:
if __name__ == '__main__':
app = ApplicationBuilder().token(TOKEN).build()
app.add_handler(CommandHandler('start', start))
app.run_polling()
5. اجرای ربات
برای اجرای ربات، کافیست دستور زیر را در ترمینال وارد کنید:
python bot.py
اگر همه چیز درست باشد، ربات شما فعال میشود و با ارسال دستور /start در تلگرام، پاسخ «سلام! ربات شما فعال شد.» را دریافت خواهید کرد.
پاسخگویی به پیامها و ارسال محتوا
در این بخش، ربات خود را از حالت ایستا خارج میکنیم و به آن یاد میدهیم چگونه به پیامهای کاربران پاسخ دهد، فایل ارسال کند، و دستورات مختلف را مدیریت کند. این مرحله نقطهی آغاز تعامل واقعی با کاربران است.
1. پاسخ به پیامهای متنی
برای اینکه ربات به هر پیام متنی پاسخ دهد، از MessageHandler و filters.TEXT استفاده میکنیم:
from telegram.ext import MessageHandler, filters
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(f'You said: {update.message.text}')
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
در این مثال، ربات هر پیام متنی غیر از دستورات را دریافت کرده و همان را بازمیگرداند.
2. ارسال عکس
برای ارسال عکس، میتوانیم از دستور /photo استفاده کنیم و یک فایل تصویری را از مسیر محلی یا URL ارسال کنیم:
async def send_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_photo(photo='https://example.com/image.jpg')
app.add_handler(CommandHandler('photo', send_photo))
اگر فایل عکس روی سیستم شماست، میتوانید مسیر محلی را جایگزین کنید:
await update.message.reply_photo(photo=open('image.jpg', 'rb'))
3. ارسال فایل
برای ارسال فایل (PDF ،ZIP، یا هر نوع دیگر)، از reply_document استفاده میکنیم:
async def send_file(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_document(document=open('file.pdf', 'rb'))
app.add_handler(CommandHandler('file', send_file))
4. ارسال استیکر
ارسال استیکر نیز مشابه ارسال عکس است، با این تفاوت که از reply_sticker استفاده میشود:
async def send_sticker(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_sticker(sticker='CAACAgUAAxkBAAIBQ2QZ...') # فایل یا شناسه استیکر
app.add_handler(CommandHandler('sticker', send_sticker))
شناسه استیکر را میتوانید از پیامهای قبلی یا رباتهای مخصوص دریافت کنید.
5. پاسخ به دستورات خاص
برای مدیریت دستورات مانند /start، /help یا هر دستور دلخواه، از CommandHandler استفاده میکنیم. مثلاً:
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('Available commands:\n/start\n/help\n/photo\n/file\n/sticker')
app.add_handler(CommandHandler('help', help_command))
مدیریت پیامها و دستورات
در این مرحله، ربات را به سطحی بالاتر از پاسخگویی ساده ارتقا میدهیم. با استفاده از هندلرهای حرفهای، میتوانیم پیامها را فیلتر کنیم، دستورات خاص را مدیریت کنیم، و رفتار ربات را بر اساس نوع ورودی کاربر تنظیم کنیم.
1. استفاده از CommandHandler
برای پاسخگویی به دستورات مشخص مانند /start، /help یا هر دستور دلخواه، از CommandHandler استفاده میکنیم. این هندلر فقط پیامهایی را دریافت میکند که با / شروع شدهاند:
from telegram.ext import CommandHandler
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('Welcome! Type /help to see available commands.')
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('Commands:\n/start\n/help\n/photo\n/file\n/sticker')
app.add_handler(CommandHandler('start', start))
app.add_handler(CommandHandler('help', help_command))
2. استفاده از MessageHandler برای فیلتر کردن پیامها
اگر بخواهیم ربات فقط به پیامهای متنی غیر دستوری پاسخ دهد، از MessageHandler همراه با فیلتر مناسب استفاده میکنیم:
from telegram.ext import MessageHandler, filters
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(f'You said: {update.message.text}')
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
در این مثال، ربات فقط به پیامهایی پاسخ میدهد که متنی هستند و با / شروع نمیشوند.
3. فیلتر کردن پیامها بر اساس شرایط خاص
میتوانیم از فیلترهای پیشرفتهتر استفاده کنیم، مثلاً فقط پاسخگویی به پیامهایی که شامل کلمه خاصی هستند:
async def keyword_reply(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('You mentioned Python!')
app.add_handler(MessageHandler(filters.TEXT & filters.Regex('.*Python.*'), keyword_reply))
همچنین میتوان پیامهای عکس، ویدیو، یا فایل را نیز فیلتر کرد:
app.add_handler(MessageHandler(filters.PHOTO, handle_photo))
app.add_handler(MessageHandler(filters.DOCUMENT, handle_document))
4. مدیریت چند هندلر همزمان
میتوان چندین هندلر را به اپلیکیشن اضافه کرد تا ربات بتواند به انواع مختلفی از ورودیها پاسخ دهد. ترتیب اضافهکردن هندلرها مهم است، هندلرهایی که زودتر اضافه شوند، اول بررسی میشوند.
ساخت رابط کاربری درونتلگرامی
یکی از جذابترین قابلیتهای رباتهای تلگرام، امکان نمایش دکمهها و منوهای قابل کلیک برای کاربران است. این ویژگی باعث میشود ربات شما از حالت متنی ساده به یک ابزار تعاملی و کاربرپسند تبدیل شود. در این بخش، با انواع دکمهها آشنا میشویم و نحوه مدیریت پاسخها را بررسی میکنیم.
1. دکمههای ReplyKeyboardMarkup
این نوع دکمهها مانند کیبورد جایگزین هستند و در پایین صفحه چت ظاهر میشوند. برای مثال، میتوانیم یک منوی ساده با گزینههای «عکس»، «فایل» و «استیکر» بسازیم:
from telegram import ReplyKeyboardMarkup
async def show_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
keyboard = [['Photo', 'File'], ['Sticker']]
reply_markup = ReplyKeyboardMarkup(keyboard, resize_keyboard=True)
await update.message.reply_text('Choose an option:', reply_markup=reply_markup)
app.add_handler(CommandHandler('menu', show_menu))
2. دکمههای InlineKeyboardMarkup
این دکمهها درون پیام ظاهر میشوند و میتوانند لینک داشته باشند یا با کلیک، پاسخ خاصی ارسال کنند. برای مثال:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
async def inline_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
keyboard = [
[InlineKeyboardButton('Visit Website', url='https://example.com')],
[InlineKeyboardButton('Get Info', callback_data='info')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text('Choose:', reply_markup=reply_markup)
app.add_handler(CommandHandler('inline', inline_menu))
3. مدیریت Callback ها
برای پاسخگویی به کلیک روی دکمههایی که callback_data دارند، باید از CallbackQueryHandler استفاده کنیم:
from telegram.ext import CallbackQueryHandler
async def handle_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
if query.data == 'info':
await query.edit_message_text(text='Here is the information you requested.')
app.add_handler(CallbackQueryHandler(handle_callback))
4. ترکیب منوها با دستورات
میتوان منوهای تعاملی را با دستورات ترکیب کرد تا ربات در پاسخ به دستور خاص، منوی مرتبط را نمایش دهد. این کار تجربه کاربری را بهبود میبخشد و تعامل را هدفمند میکند.
ذخیرهسازی دادهها
برای ساخت رباتهایی که فراتر از پاسخگویی ساده عمل میکنند، مثلاً رباتهایی که اطلاعات کاربران را ذخیره میکنند، وضعیت گفتگو را حفظ میکنند، یا پاسخهای شخصیسازیشده میدهند، نیاز داریم دادهها را بهصورت ساختیافته ذخیره کنیم. در این بخش، با روشهای ساده و مؤثر برای ذخیرهسازی آشنا میشویم.
1. ذخیره اطلاعات کاربران در فایل JSON
برای ثبت اطلاعات کاربران (مانند شناسه، نام، یا پیامهای ارسالی)، میتوان از فایل JSON استفاده کرد. مثال:
import json
def save_user_data(user_id, data):
try:
with open('users.json', 'r') as f:
users = json.load(f)
except FileNotFoundError:
users = {}
users[str(user_id)] = data
with open('users.json', 'w') as f:
json.dump(users, f, indent=4)
در تابع هندلر، میتوان اطلاعات را ذخیره کرد:
async def register_user(update: Update, context: ContextTypes.DEFAULT_TYPE):
user = update.message.from_user
save_user_data(user.id, {'name': user.first_name, 'username': user.username})
await update.message.reply_text('Your data has been saved.')
2. استفاده از SQLite برای ذخیرهسازی پایدار
اگر پروژه بزرگتر باشد، استفاده از دیتابیس سبک SQLite توصیه میشود:
import sqlite3
def init_db():
conn = sqlite3.connect('bot.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT,
username TEXT
)''')
conn.commit()
conn.close()
در هندلر ثبت:
def save_to_db(user_id, name, username):
conn = sqlite3.connect('bot.db')
cursor = conn.cursor()
cursor.execute('INSERT OR REPLACE INTO users (id, name, username) VALUES (?, ?, ?)', (user_id, name, username))
conn.commit()
conn.close()
3. مدیریت وضعیت گفتگو (ConversationHandler)
برای ساخت رباتهایی که چند مرحله گفتوگو دارند (مثلاً فرم ثبتنام)، از ConversationHandler استفاده میکنیم:
from telegram.ext import ConversationHandler
ASK_NAME, ASK_AGE = range(2)
async def start_conv(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('What is your name?')
return ASK_NAME
async def ask_name(update: Update, context: ContextTypes.DEFAULT_TYPE):
context.user_data['name'] = update.message.text
await update.message.reply_text('How old are you?')
return ASK_AGE
async def ask_age(update: Update, context: ContextTypes.DEFAULT_TYPE):
context.user_data['age'] = update.message.text
await update.message.reply_text(f"Saved: {context.user_data['name']}, {context.user_data['age']}")
return ConversationHandler.END
conv_handler = ConversationHandler(
entry_points=[CommandHandler('register', start_conv)],
states={
ASK_NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, ask_name)],
ASK_AGE: [MessageHandler(filters.TEXT & ~filters.COMMAND, ask_age)],
},
fallbacks=[]
)
app.add_handler(conv_handler)
ساخت رباتهای کاربردی
اکنون که با اصول ساخت ربات، مدیریت پیامها، منوها و ذخیرهسازی دادهها آشنا شدهاید، وقت آن رسیده که آموختهها را در قالب پروژههای واقعی به کار بگیرید. در این بخش، چند ربات ساده اما کاربردی را پیادهسازی میکنیم، هرکدام با هدفی مشخص، قابل توسعه و مناسب برای تمرین عملی.
1. ربات ماشین حساب ساده
این ربات با دریافت دو عدد و یک عملگر، نتیجه را محاسبه میکند:
async def calc(update: Update, context: ContextTypes.DEFAULT_TYPE):
try:
expression = ' '.join(context.args) # e.g., 5 + 3
result = eval(expression)
await update.message.reply_text(f'Result: {result}')
except:
await update.message.reply_text('Invalid expression. Use: /calc 5 + 3')
app.add_handler(CommandHandler('calc', calc))
⚠️ توجه: استفاده از eval در پروژههای واقعی ناامن است. در نسخههای پیشرفتهتر باید از پارسرهای امن استفاده شود.
2. ربات یادآور (Reminder)
با استفاده از asyncio.sleep میتوان رباتی ساخت که پس از مدت مشخصی پیام یادآوری ارسال کند:
import asyncio
async def remind(update: Update, context: ContextTypes.DEFAULT_TYPE):
try:
delay = int(context.args[0])
message = ' '.join(context.args[1:])
await update.message.reply_text(f'Okay! I will remind you in {delay} seconds.')
await asyncio.sleep(delay)
await update.message.reply_text(f'Reminder: {message}')
except:
await update.message.reply_text('Usage: /remind 10 Take a break')
app.add_handler(CommandHandler('remind', remind))
3. ربات ترجمهگر ساده
با استفاده از کتابخانههایی مانند googletrans میتوان یک ربات ترجمه ساخت:
pip install googletrans==4.0.0-rc1
from googletrans import Translator
translator = Translator()
async def translate(update: Update, context: ContextTypes.DEFAULT_TYPE):
text = ' '.join(context.args)
result = translator.translate(text, dest='en')
await update.message.reply_text(f'Translation: {result.text}')
app.add_handler(CommandHandler('translate', translate))
4. ربات نظرسنجی
ارسال نظرسنجی با استفاده از متد send_poll:
async def poll(update: Update, context: ContextTypes.DEFAULT_TYPE):
question = 'Which language do you prefer?'
options = ['Python', 'JavaScript', 'Go', 'Rust']
await context.bot.send_poll(chat_id=update.effective_chat.id, question=question, options=options)
app.add_handler(CommandHandler('poll', poll))
امنیت و محدودسازی
هرچقدر ربات شما کاربردیتر و محبوبتر شود، احتمال سوءاستفاده، اسپم و حملات نیز افزایش مییابد. بنابراین، پیادهسازی اصول امنیتی و محدودسازی دسترسی از همان مراحل اولیه توسعه ضروری است. در این بخش، با روشهای ساده اما مؤثر برای افزایش امنیت ربات آشنا میشویم.
1. محدود کردن دسترسی به کاربران خاص
اگر ربات شما فقط برای گروه خاصی از کاربران طراحی شده، میتوانید شناسههای مجاز را در لیستی ذخیره کرده و در هر هندلر بررسی کنید:
ALLOWED_USERS = [123456789, 987654321] # Telegram user IDs
async def restricted(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_id = update.message.from_user.id
if user_id not in ALLOWED_USERS:
await update.message.reply_text('Access denied.')
return
await update.message.reply_text('Welcome, authorized user.')
app.add_handler(CommandHandler('secure', restricted))
2. جلوگیری از اسپم و ارسال مکرر
برای جلوگیری از ارسال پیامهای مکرر یا اسپم، میتوان از محدودسازی زمانی یا شمارنده استفاده کرد. مثال ساده:
import time
user_last_message = {}
async def anti_spam(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_id = update.message.from_user.id
now = time.time()
last = user_last_message.get(user_id, 0)
if now - last < 5: # 5 seconds cooldown
await update.message.reply_text('Please wait before sending another command.')
return
user_last_message[user_id] = now
await update.message.reply_text('Message accepted.')
app.add_handler(CommandHandler('ping', anti_spam))
3. مدیریت خطاها و جلوگیری از کرش
برای جلوگیری از توقف ربات در صورت بروز خطا، باید هندلر عمومی برای مدیریت Exceptions تعریف شود:
from telegram.error import TelegramError
async def error_handler(update: object, context: ContextTypes.DEFAULT_TYPE):
print(f'Error: {context.error}')
app.add_error_handler(error_handler)
همچنین توصیه میشود در هر تابع از try/except استفاده شود تا خطاهای خاص مدیریت شوند.
4. محافظت از توکن و اطلاعات حساس
توکن ربات را هرگز در فایلهای عمومی یا مخازن گیت منتشر نکنید. برای امنیت بیشتر، میتوانید از متغیرهای محیطی استفاده کنید:
import os
TOKEN = os.getenv('BOT_TOKEN')
و در محیط اجرا:
export BOT_TOKEN='your_token_here'
انتشار و نگهداری
تا اینجا ربات شما روی سیستم محلی اجرا میشد و فقط در زمان باز بودن ترمینال فعال بود. اما برای استفاده واقعی، باید ربات را روی سروری مستقر کنید تا بهصورت دائمی و پایدار در دسترس باشد. در این بخش، با روشهای مختلف اجرای ربات روی سرور، نگهداری آن، و آمادهسازی برای استفاده عمومی آشنا میشویم.
1. انتخاب بستر مناسب برای اجرا
بسته به نیاز پروژه و بودجه، میتوانید یکی از گزینههای زیر را انتخاب کنید:
- Heroku: رایگان، مناسب برای پروژههای سبک و تستی
- PythonAnywhere: اجرای ساده اسکریپتهای پایتون با رابط کاربری تحت وب
- VPS یا سرور اختصاصی: مناسب برای پروژههای حرفهای و پایدار
- Docker: برای اجرای ایزوله و قابل حمل در هر محیطی
2. اجرای دائمی با nohup یا systemd
اگر از VPS یا سرور لینوکسی استفاده میکنید، میتوانید ربات را بهصورت دائمی اجرا کنید:
با nohup:
nohup python bot.py &
با systemd:
فایل سرویس بسازید:
[Unit]
Description=Telegram Bot
After=network.target
[Service]
ExecStart=/usr/bin/python3 /path/to/bot.py
Restart=always
User=your_user
[Install]
WantedBy=multi-user.target
سپس:
sudo systemctl daemon-reload
sudo systemctl enable telegrambot
sudo systemctl start telegrambot
3. استفاده از Webhook بهجای polling
برای کاهش مصرف منابع و افزایش سرعت پاسخگویی، میتوانید از Webhook استفاده کنید. این روش نیاز به دامنه HTTPS دارد:
app.run_webhook(
listen='0.0.0.0',
port=8443,
url_path=TOKEN,
webhook_url=f'https://yourdomain.com/{TOKEN}'
)
4. نگهداری و بروزرسانی
برای نگهداری ربات در طولانیمدت:
- لاگگیری دقیق با
loggingبرای بررسی خطاها - نسخهبندی کد با Git
- تست منظم عملکرد ربات
- بروزرسانی کتابخانهها و امنیت توکنها
- تهیه نسخه پشتیبان از دادهها
جمعبندی
اگر تا اینجا همراه ما بودهاید، اکنون نهتنها با اصول ساخت ربات تلگرام با پایتون آشنا شدهاید، بلکه توانایی ساخت رباتهای تعاملی، امن و قابل استقرار را نیز در اختیار دارید. اما یادگیری در این نقطه متوقف نمیشود، در این بخش، منابع تکمیلی را معرفی میکنیم تا بتوانید دانش خود را گسترش دهید و رباتهایی پیچیدهتر و هوشمندتر بسازید.
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید