سلام دوستان من میخوام یه ماشین حساب ساده برای تلگرام بنویسم برای تمرین و اینجا به مشکل خوردم که میخوام دو تا ورود ی که از کاربر میگیرمو با هم جمع کنم به حاصل رو بدم به خروجی حالا ورودی اول رو میگیرم ولی ورودی دوم رو نمیدونم چجوری بگیرم و ذخیره کنم تا بتونم با هم جمع بزنم اگه کسی بلده لطفا کمک کنید
برای ساخت یک ماشین حساب ساده در تلگرام که دو عدد را از کاربر دریافت کرده و جمع آنها را محاسبه کند، باید وضعیت مکالمه با کاربر را مدیریت کنید تا بدانید در هر لحظه چه مرحلهای از تعامل هستید. برای این کار میتوانید از ConversationHandler در کتابخانه python-telegram-bot استفاده کنید.
مراحل کلی کار:
1. دریافت عدد اول از کاربر.
2. دریافت عدد دوم از کاربر.
3. محاسبه جمع و ارسال نتیجه به کاربر.
در ادامه، کد نمونهای ارائه میشود که این کار را انجام میدهد.
---
### **کد نمونه با استفاده از python-telegram-bot نسخه 13.x**
ابتدا اطمینان حاصل کنید که نسخه 13.x از کتابخانه را نصب کردهاید:
pip install python-telegram-bot==13.15
**کد:**
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, ConversationHandler
# تعریف مراحل مکالمه
FIRST_NUMBER, SECOND_NUMBER = range(2)
def start(update, context):
update.message.reply_text('سلام! لطفاً عدد اول را وارد کنید:')
return FIRST_NUMBER
def first_number(update, context):
# ذخیره عدد اول
context.user_data['first_number'] = update.message.text
update.message.reply_text('حالا عدد دوم را وارد کنید:')
return SECOND_NUMBER
def second_number(update, context):
first_number = context.user_data['first_number']
second_number = update.message.text
try:
# تبدیل ورودیها به عدد
num1 = float(first_number)
num2 = float(second_number)
result = num1 + num2
update.message.reply_text(f'نتیجه: {num1} + {num2} = {result}')
except ValueError:
update.message.reply_text('لطفاً اعداد معتبر وارد کنید.')
return ConversationHandler.END
def cancel(update, context):
update.message.reply_text('عملیات لغو شد.')
return ConversationHandler.END
def main():
# جایگزین 'YOUR_TOKEN' با توکن ربات خود
updater = Updater('YOUR_TOKEN', use_context=True)
dp = updater.dispatcher
# تعریف ConversationHandler
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
FIRST_NUMBER: [MessageHandler(Filters.text & ~Filters.command, first_number)],
SECOND_NUMBER: [MessageHandler(Filters.text & ~Filters.command, second_number)],
},
fallbacks=[CommandHandler('cancel', cancel)],
)
dp.add_handler(conv_handler)
# شروع ربات
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
---
توضیحاتواردات کتابخانهها:نهها:** از کتابخانه python-telegram-bot برای ساخت ربات تلگرام استفاده میتعریف مراحل مکالمه:کالمه:** با استفاده از FIRST_NUMBER و SECOND_NUMBER مراحل را مشخص میتابع start:start:** مکالمه را شروع کرده و از کاربر عدد اول را درخواست میکند.
- **تابع first_number:** عدد اول را دریافت و در context.user_data ذخیره میکند، سپس عدد دوم را درخواست میکند.
- **تابع second_number:** عدد دوم را دریافت کرده، هر دو عدد را به نوع float تبدیل میکند، جمع را محاسبه و نتیجه را به کاربر تابع cancel:**تابع cancel:** در صورت نیاز به لغو عملیات، مکالمه را تابع main:- **تابع main:** ربات را راهاندازی میکند و ConversationHandler را اضافهنکات مهم:
*توکن ربات:- **توکن ربات:** حتماً توکن ربات خود را از BotFather دریافت کرده و به جای 'YOUR_TOKEN' قرار دهید.
- **مدیریت خطاها:** در تبدیل ورودیها به عدد از try-except استفاده شده تا در صورت وارد کردن مقادیر نامعتبر، به کاربذخیره دادههای کاربر:ره دادههای کاربر:** از context.user_data برای ذخیره موقت اطلاعات مربوط به هر کاربر استفاده میکنیم.
- پایان مکالمه : با ConversationHandler.END مکالمه را خاتمه میدهیم تا ربات آماده دریافت دستورات جدید باشد.
---
# **کد برای نسخههای جدیدتر python-telegram-bot (نسخه 20 به بعد):**
اگر از نسخههای جدیدتر استفاده میکنید، نحو کد کمی تغییر میکند.
نصب نسخه جدید:
pip install python-telegram-bot --upgrade
کد:
`python
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes, MessageHandler, filters, ConversationHandler
FIRST_NUMBER, SECOND_NUMBER = range(2)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('سلام! لطفاً عدد اول را وارد کنید:')
return FIRST_NUMBER
async def first_number(update: Update, context: ContextTypes.DEFAULT_TYPE):
context.user_data['first_number'] = update.message.text
await update.message.reply_text('حالا عدد دوم را وارد کنید:')
return SECOND_NUMBER
async def second_number(update: Update, context: ContextTypes.DEFAULT_TYPE):
first_number = context.user_data['first_number']
second_number = update.message.text
try:
num1 = float(first_number)
num2 = float(second_number)
result = num1 + num2
await update.message.reply_text(f'نتیجه: {num1} + {num2} = {result}')
except ValueError:
await update.message.reply_text('لطفاً اعداد معتبر وارد کنید.')
return ConversationHandler.END
async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('عملیات لغو شد.')
return ConversationHandler.END
def main():
application = ApplicationBuilder().token('YOUR_TOKEN').build()
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
FIRST_NUMBER: [MessageHandler(filters.TEXT & ~filters.COMMAND, first_number)],
SECOND_NUMBER: [MessageHandler(filters.TEXT & ~filters.COMMAND, second_number)],
},
fallbacks=[CommandHandler('cancel', cancel)],
)
application.add_handler(conv_handler)
application.run_polling()
if name == 'main':
main()
`
تفاوتهای اصلی:
- استفاده از `async` و `await` در توابع.
- استفاده از `ApplicationBuilder` به جای `Updater`.
- تغییر در واردات و فیلترها.
---
جمعبندی:
- از ConversationHandler برای مدیریت مکالمات چند مرحلهای استفاده کنید.
- با استفاده از context.user_data اطلاعات موقت کاربر را بین مراحل ذخیره کنید.
- حتماً ورودیهای کاربر را اعتبارسنجی کنید تا از بروز خطا جلوگیری شود.
- در صورت نیاز، میتوانید عملیاتهای ریاضی دیگری را نیز اضافه کنید.
PPython + Linux Experts@PythonLinuxExperts · Gruppe · Technik
Ein offener öffentlicher Feed aus dem Suchindex
ChatCrawler — „Google für das öffentliche Telegram“; wird aktualisiert, während die Community gecrawlt wird.
Zeiten in UTC.