בוט טלגרם בפייתון. מדריך מלא לכתיבת בוט עם שערי חליפין מאפס

בוטים בטלגרם הם תוכניות שעוזרות ליצור קשר עם הקהל או לפשט פעולות שבעבר היו צריכים להתבצע באופן ידני. תוכניות אלה נכתבו במיוחד עבור פלטפורמת המסנג'ר. בוטים פועלים בצורה זו: המשתמש שולח פקודה דרך שורת הקלט, והמערכת מגיבה בטקסט או בהודעה אינטראקטיבית. לפעמים התוכנית אפילו מחקה פעולות של אדם אמיתי - בוט כזה מעורר יותר אמון בקרב הלקוחות.

ישנם מספר סוגי מערכות לסיוע אוטומטי למשתמשים. חלק מהבוטים פשוט מתקשרים עם לקוחות, אחרים מספקים מידע באופן קבוע. אי אפשר לחלק בבירור תוכניות לסוגים - מפתחים לרוב משלבים מספר פונקציות בבוט אחד.

אתה יכול לכתוב בוט פשוט לטלגרם עם אלמנטים אינטראקטיביים בצורה של כפתורים על המסך ב-9 שלבים. בואו נסתכל על כל אחד מהם בפירוט ונענה על כמה שאלות:

  • איך להתחיל בוט;
  • כיצד לרשום מקלדת מובנית מכפתור אחד או יותר;
  • כיצד לתכנת את הכפתורים עבור הפונקציות הרצויות;
  • מהו מצב מוטבע וכיצד להגדיר אותו עבור בוט קיים.

שלב 0: רקע תיאורטי על ממשק ה-API של הבוטים של Telegram

הכלי העיקרי המשמש ליצירת בוטים של טלגרם הוא ממשק תכנות יישומי HTML, או HTML API. אלמנט זה מקבל בקשות מבקרים ושולח תגובות בצורה של מידע. עיצובים מוכנים מפשטים את העבודה על התוכנית. כדי לכתוב בוט לטלגרם, עליך להשתמש בכתובת הדוא"ל הזו: https://api.telegram.org/bot/METHOD_NAME

לתפקוד נכון של הבוט יש צורך גם ב-token - שילוב של תווים המגן על התוכנית ופותח גישה אליה למפתחים מהימנים. כל אסימון הוא ייחודי. המחרוזת מוקצית לבוט עם היצירה. השיטות יכולות להיות שונות: getUpdates, getChat ואחרות. בחירת השיטה תלויה באיזה אלגוריתם מצפים המפתחים מהבוט. דוגמה סמלית:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

בוטים משתמשים בבקשות GET ו-POST. לעתים קרובות יש להשלים פרמטרים של השיטה - למשל, כאשר שיטת sendMessage אמורה לשלוח את מזהה הצ'אט וטקסט כלשהו. ניתן להעביר פרמטרים עבור חידוד שיטה כמחרוזת שאילתת כתובת URL באמצעות application/x-www-form-urlencoded או דרך application-json. שיטות אלו אינן מתאימות להורדת קבצים. נדרש גם קידוד UTF-8. על ידי שליחת בקשה ל-API, תוכל לקבל את התוצאה בפורמט JSON. תסתכל על תגובת התוכנית לאחזור מידע באמצעות שיטת getME:

קבל https://api.telegram.org/bot/getMe{ ok: true, result: { id: 231757398, first_name: "Exchange Rate Bot", שם משתמש: "exchangetestbot" } }

התוצאה תתקבל אם ok שווים נָכוֹן. אחרת, המערכת תציין שגיאה.

ישנן שתי דרכים לקבל הודעות מותאמות אישית בוטים. שתי השיטות יעילות, אך מתאימות במקרים שונים. כדי לקבל הודעות, אתה יכול לכתוב בקשה באופן ידני בשיטת getUpdates - התוכנה תציג את מערך הנתונים Update על המסך. יש לשלוח בקשות באופן קבוע, לאחר ניתוח כל מערך, השליחה חוזרת על עצמה. Offset הוא פרמטר שקובע את מספר הרשומות שדילג עליהן לפני טעינת תוצאה חדשה כדי למנוע הופעה חוזרת של אובייקטים מסומנים. היתרונות של שיטת getUpdates יבואו לידי ביטוי אם:

  • אין דרך להגדיר HTTPS;
  • נעשה שימוש בשפות סקריפט מורכבות;
  • שרת הבוט משתנה מעת לעת;
  • הבוט נטען במשתמשים.

השיטה השנייה שניתן לכתוב כדי לקבל הודעות משתמש היא setWebhook. הוא משמש פעם אחת, אין צורך לשלוח כל הזמן בקשות חדשות. ה-webhook שולח עדכוני נתונים לכתובת ה-URL שצוינה. שיטה זו דורשת אישור SSL. Webhook יהיה שימושי במקרים אלה:

  • נעשה שימוש בשפות תכנות אינטרנט;
  • הבוט אינו עמוס מדי, אין יותר מדי משתמשים;
  • השרת לא משתנה, התוכנית נשארת באותו שרת במשך זמן רב.

בהוראות נוספות, נשתמש ב-getUpdates.

שירות הטלגרם @BotFather נועד ליצור צ'אט בוטים. הגדרות בסיסיות נקבעות גם באמצעות מערכת זו - BotFather יעזור לך ליצור תיאור, לשים תמונת פרופיל, להוסיף כלי תמיכה. ספריות - סטים של בקשות HTML עבור בוטים של טלגרם - זמינות באינטרנט, יש די הרבה מהן. בעת יצירת התוכנית לדוגמה, נעשה שימוש ב-pyTelegramBotApi.

שלב 1: יישום בקשות שער חליפין

ראשית עליך לכתוב את הקוד שמבצע שאילתות. אנו נשתמש בעת כתיבת ה-API של PrivatBank, להלן קישור אליו: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. אתה צריך להשתמש בשיטות האלה בקוד שלך:

  • load_exchange - מוצא שערי חליפין ומציג מידע מקודד;
  • get_exchange - מציג נתונים על מטבע ספציפי;
  • get_exchanges – מציג את רשימת המטבעות לפי המדגם.

כתוצאה מכך, הקוד בקובץ pb.py נראה כך:

ייבוא ​​מחדש של בקשות ייבוא ​​ייבוא ​​json URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' def load_exchange(): החזר json.loads(requests.get(URL).text) def get_exchange(ccy_key ): עבור exc ב-load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): תוצאה = [] ccy_pattern = re.escape(ccy_pattern) + '.*' עבור exc in load_exchange(): אם re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) אינו None: result.append(exc) החזר תוצאה

התוכנית יכולה להנפיק את התגובה הבאה לבקשות שצוינו:

[ { ccy:"USD", base_ccy:"UAH", buy:"25.90000", sale:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", buy:"29.10000", sale:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", buy:"0.37800", sale:"0.41800" }, { ccy:"BTC", base_ccy:"USD", buy:"11220.0384", מכירה: "12401.0950" } ]

שלב 2: צור בוט טלגרם עם @BotFather

אתה יכול ליצור תוכנית לקבלת הודעות ולהגיב להן באמצעות שירות @BotFather. עבור לדף הטלגרם שלו והזן את הפקודה /newbot. בצ'אט יופיעו הוראות לפיהן צריך לרשום תחילה את שם הבוט ולאחר מכן את כתובתו. כאשר חשבון הבוט נוצר, תופיע על המסך הודעת פתיחה המכילה אסימון. להגדרה נוספת, השתמש בפקודות הבאות:

  • /setdescription - תיאור;
  • /setabouttext - מידע על הבוט החדש;
  • /setuserpic - תמונת פרופיל;
  • /setinline - מצב מוטבע;
  • /setcommands - תיאור של פקודות.

בשלב התצורה האחרון, אנו מתארים /help ו-/exchange. כאשר כל השלבים הושלמו, הגיע הזמן לעבור לקידוד.

שלב 3: הגדרה והשקה של הבוט

בואו ניצור קובץ config.py. בו, אתה צריך לציין את קוד הבוט הייחודי ואת אזור הזמן שבו התוכנית תמצא מידע.

TOKEN = '' # replace with token של הבוט שלךTIMEZONE = 'אירופה/קייב' TIMEZONE_COMMON_NAME = 'קייב'

לאחר מכן, אנו יוצרים קובץ נוסף עם יבוא של pb.py שנכתב בעבר, ספריות ורכיבים נחוצים אחרים. הספריות החסרות מותקנות ממערכת ניהול החבילות (pip).

ייבוא ​​telebotimport configimport pbimport datetimeimport pytzimport jsonimport traceback P_TIMEZONE = pytz.timezone(config.TIMEZONE) TIMEZONE_COMMON_NAME = config.TIMEZONE_COMMON_NAME

בואו נשתמש בתוכן של pyTelegramBotApi כדי ליצור בוט. אנו שולחים את האסימון שהתקבל באמצעות הקוד הבא:

bot = telebot.TeleBot(config.TOKEN) bot.polling(none_stop=True)

הפרמטר none_stop מבטיח שבקשות נשלחות כל הזמן. פעולת הפרמטר לא תושפע משגיאות שיטה.

שלב 4: כתוב את /start Commander Handler

אם כל השלבים הקודמים נעשים כהלכה, הבוט התחיל לעבוד. התוכנית מייצרת בקשות באופן קבוע מכיוון שהיא משתמשת בשיטת getUpdates. לפני השורה עם האלמנט none_stop, אנחנו צריכים פיסת קוד שמעבדת את הפקודה /start:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'שלום! אני יכול להראות לך exchange rates.n' + 'כדי לקבל את שערי החליפין הקש / exchange.n' + 'כדי לקבל עזרה, לחץ על /help.')

RџСўРё commands=['התחל'] שווה ל-True start_command נקראת. תוכן ההודעה עובר לשם. לאחר מכן, עליך ליישם את פונקציית השליחה_הוֹדָעָה ביחס למסר מסוים.

שלב 5: צור /help פקודות

ניתן ליישם את הפקודה /help ככפתור. בלחיצה עליו, המשתמש יועבר לחשבון הטלגרם של המפתח. תן ללחצן שם, כגון "שאל את המפתח". הגדר את הפרמטר reply_markup, המפנה את המשתמש לקישור, עבור שיטת send_message. בואו נכתוב בקוד את הפרמטר שיוצר את המקלדת (InlineKeyboardMarkup). אתה צריך רק כפתור אחד (InlineKeyboardButton).

קוד מטפל הפקודות הסופי נראה כך:

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'שאל את המפתח', url='ваша ссылка профиль' ) ) bot.send_message( message.chat.id, '1) לקבלת רשימה של מטבעות זמינים הקש /exchange.n' + '2) לחץ על המטבע שבו אתה מעוניין.n' + '3) אתה יקבל הודעה המכילה מידע לגבי המקור ומטבעות היעד, ' + 'שערי קנייה ותעריפי מכירה.n' + '4) לחץ על "עדכן" כדי לקבל את המידע העדכני לגבי הבקשה. ' + 'הבוט יראה גם את ההבדל בין שערי החליפין הקודם והנוכחי.n' + '5) הבוט תומך בשורה. הקלד @ בכל צ'אט ובאותיות הראשונות של מטבע.', reply_markup=keyboard )

פעולת קוד בצ'אט בטלגרם:

בוט טלגרם בפייתון. מדריך מלא לכתיבת בוט עם שערי חליפין מאפס

שלב 6: הוספת מנהל הפקודות /exchange

שלב זה נחוץ כדי להציג כפתורים עם סמלים של מטבעות זמינים בצ'אט. מקלדת על המסך עם אפשרויות תעזור לך להימנע מטעויות. PrivatBank מספק מידע על הרובל, הדולר והאירו. האפשרות InlineKeyboardButton פועלת כך:

  1. המשתמש לוחץ על הכפתור עם הייעוד הרצוי.
  2. getUpdates מקבל התקשרות חוזרת (CallbackQuery).
  3. נודע כיצד לטפל בלחיצה על המקלדת - מידע על הכפתור שנלחץ מועבר.

קוד מטפל /exchange:

@bot.message_handler(commands=['exchange']) def exchange_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton('USD', callback_data='get-USD') ) keyboard.row( telebot.types.InlineKeyboardButton('EUR', callback_data='get-EUR'), telebot.types.InlineKeyboardButton('RUR', callback_data='get-RUR') ) bot.send_message( message.chat .id, 'לחץ על המטבע הנבחר:', reply_markup=keyboard )

התוצאה של הקוד בטלגרם:

בוט טלגרם בפייתון. מדריך מלא לכתיבת בוט עם שערי חליפין מאפס

שלב 7: כתיבת מטפל עבור לחצני המקלדת המובנים

חבילת pyTelegramBot Api מכילה את פונקציית העיצוב @bot.callback_query_handler. רכיב זה נועד לתרגם את ה-callback לפונקציה - ה-API פותח את ה-API ויוצר מחדש את הקריאה. זה כתוב כך:

@bot.callback_query_handler(func=call lambda: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query)

בואו נכתוב גם את שיטת get_ex_callback:

def get_ex_callback(query): bot.answer_callback_query(query.id) send_exchange_result(query.message, query.data[4:])

יש שיטה שימושית נוספת - answer_callback_query. זה עוזר להסיר את העומס בין לחיצה על הכפתור להצגת התוצאה על המסך. אתה יכול לשלוח הודעה אל send_exchange_query על ידי העברת קוד מטבע והודעה. בוא נכתוב send_exchange_result:

def send_exchange_result(message, ex_code): bot.send_chat_action(message.chat.id, 'typing') ex = pb.get_exchange(ex_code) bot.send_message( message.chat.id, serialize_ex(ex), reply_markup=get_update_keyboard(ex ), parse_mode='HTML' )

בעוד שהצ'אטבוט מקבל את תוצאת הבקשה מהבנק API, המבקר רואה את הכיתוב "מקליד הודעה". זה נראה כאילו אדם אמיתי עונה. כדי להציג מחוון כזה על המסך, יהיה עליך להוסיף שורות סטטוס קלט. לאחר מכן, נשתמש ב-get_exchange - בעזרתה, התוכנית תקבל את ייעוד המטבע (רובל, יורו או דולרים). send_message משתמש בשיטות נוספות: serialize_ex ממיר את המטבע לפורמט אחר, ו-get_update_keyboard מגדיר מקשי softkey שמעדכנים מידע ושולחים נתוני שוק מטבעות לצ'אטים אחרים.

בוא נכתוב את הקוד עבור get_update_keyboard. צריך להזכיר שני כפתורים - t ו-e מייצגים סוג והחלפה. יש צורך בפריט switch_inline_query עבור כפתור השיתוף כדי שהמשתמש יוכל לבחור מתוך מספר צ'אטים. המבקר יוכל לבחור למי לשלוח את שער החליפין הנוכחי של הדולר, הרובל או האירו.

def get_update_keyboard(ex): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Update', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['buy'], 's': ex['sale'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('שתף', switch_inline_query=ex['ccy']) ) החזר מקלדת

לפעמים צריך לראות כמה השתנה שער החליפין בזמן קצר. בוא נכתוב שתי שיטות עבור כפתור העדכון כדי שמשתמשים יוכלו לראות קורסים בהשוואה.

ההפרש בין שערי החליפין מועבר לסדרה באמצעות פרמטר ה-diff.

השיטות שנקבעו פועלות רק לאחר עדכון הנתונים, הן לא ישפיעו על התצוגה הראשונה של הקורס.

def serialize_ex(ex_json, diff=None): result = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'קנה: ' + ex_json['buy'] if diff: result += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Sell: ' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: result += 'nSell: ' + ex_json['sale'] + 'n' return result def serialize_exchange_diff(diff): result = '' if diff > 0: result = '(' + str(diff) + ' " src="https://sworg/images/core/emoji/2.3/svg/2197.svg">" src="https://sworg/images /core/emoji/72x72/2197.png">" src="https://sworg/images/core/emoji/72x72/2197.png">)' elif diff < 0: result = '(' + str( diff)[1:] + ' " src="https://sworg/images/core/emoji/2.3/svg/2198.svg">" src="https://sworg/images/core/emoji/72x72 /2198.png">" src="https://sworg/images/core/emoji/72x72/2198.png">)' תוצאת החזרה

תארו לעצמכם שהמבקר רצה לדעת את שער הדולר. זה מה שקורה אם תבחר ב-USD בהודעה:

בוט טלגרם בפייתון. מדריך מלא לכתיבת בוט עם שערי חליפין מאפס

שלב 8: הטמעת ה-Update Button Handler

בוא נכתוב את הקוד לטיפול בפעולות עם כפתור העדכון ונוסיף לו את החלק iq_callback_method. כאשר פריטי תוכנית מתחילים בפרמטר get, עליך לכתוב get_ex_callback. במצבים אחרים, אנו מנתחים את JSON ומנסים להשיג את המפתח t.

@bot.callback_query_handler(func=lambda call: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query) else: try: if json.loads(data)[ 't'] == 'u': edit_message_callback(query) מלבד ValueError: pass

אם t שווה ל-u, תצטרך לכתוב תוכנית עבור שיטת edit_message_callback. בואו נפרק את התהליך הזה צעד אחר צעד:

  1. הורדת מידע עדכני על מצב שוק המטבעות (exchange_now = pb.get_exchange(data['c']).
  1. כתיבת הודעה חדשה באמצעות סדרה עם diff.
  2. הוספת חתימה (get_edited_signature).

אם ההודעה הראשונית לא משתנה, קרא לשיטת edit_message_text.

def edit_message_callback(query): data = json.loads(query.data)['e'] exchange_now = pb.get_exchange(data['c']) text = serialize_ex( exchange_now, get_exchange_diff( get_ex_from_iq_data(data)), )_now + 'n' + get_edited_signature() if query.message: bot.edit_message_text( text, query.message.chat.id, query.message.message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='line_HTML'query )_ : bot.edit_message_text( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

בואו נכתוב את שיטת get_ex_from_iq_data כדי לנתח JSON:

def get_ex_from_iq_data(exc_json): return { 'buy': exc_json['b'], 'sale': exc_json['s'] }

תצטרך עוד כמה שיטות: למשל, get_exchange_diff, שקוראת את המידע הישן והחדש על עלות המטבעות ומציגה את ההפרש.

def get_exchange_diff(last, now): return { 'sale_diff': float("%.6f" % (float(now['sale']) - float(last['sale']))), 'buy_diff': float ("%6f" % (float(now['buy']) - float(last['buy']))) }

האחרון, get_edited_signature, מציג את הזמן שבו הקורס עודכן לאחרונה.

def get_edited_signature(): return 'עודכן ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'

כתוצאה מכך, ההודעה המעודכנת מהבוט עם שער חליפין יציב נראית כך:

בוט טלגרם בפייתון. מדריך מלא לכתיבת בוט עם שערי חליפין מאפס

כאשר הקורס משתנה, ההבדלים בין הערכים מוצגים בהודעה עקב הפרמטרים שנקבעו.

בוט טלגרם בפייתון. מדריך מלא לכתיבת בוט עם שערי חליפין מאפס

שלב 9: יישום מצב מוטבע

יש צורך במצב המובנה כדי לשלוח במהירות מידע מהתוכנית לכל צ'אט - כעת אינך צריך להוסיף בוט לשיחה כמשתתף. כאשר משתמש בטלגרם מזין שם בוט עם סימן @ לפניו, אפשרויות המרה צריכות להופיע מעל שורת הקלט. אם תלחץ על אחד מהפריטים, הבוט ישלח הודעה לשיחה עם התוצאות וכפתורים לעדכון ושליחת נתונים. שם השולח יכיל את הכיתוב "via

InlineQuery מועבר ל-query_text דרך הספרייה. הקוד משתמש בפונקציה answer_line כדי לאחזר את תוצאות החיפוש כמערך של נתונים ורכיב inline_query_id. אנו משתמשים ב-get_exchanges כך שהבוט מוצא מספר מטבעות לפי בקשה.

@bot.inline_handler(func=lambda query: True) def query_text(inline_query): bot.answer_inline_query( inline_query.id, get_iq_articles(pb.get_exchanges(inline_query.query)) )

אנו מעבירים מערך נתונים ל-get_iq_articles על מנת להחזיר אובייקטים מ-InlineQueryResultArticle באמצעות שיטה זו.

def get_iq_articles(exchanges): תוצאה = [] עבור exc ב-exchanges: result.append( telebot.types.InlineQueryResultArticle( id=exc['ccy'], title=exc['ccy'], input_message_content=telebot.types.InputTextMessageContent ( serialize_ex(exc), parse_mode='HTML' ), reply_markup=get_update_keyboard(exc), description='Convert ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) להחזיר תוצאה

עכשיו, אם תכתוב @ ורווח בשורה, תוצאות החיפוש יופיעו על המסך – אפשרויות להמרה לשלושה מטבעות זמינים.

בוט טלגרם בפייתון. מדריך מלא לכתיבת בוט עם שערי חליפין מאפס

משתמשים יכולים לסנן את התוצאות על ידי הזנת המטבע הרצוי.

לאחר לחיצה על המטבע הרצוי מהרשימה, הצ'אט מקבל את אותה הודעה שמקבלים משתמשי הבוט. אתה יכול גם להשתמש בלחצן עדכן. התמונה למטה מציגה את ההודעה המעודכנת שנשלחה דרך הבוט:

בוט טלגרם בפייתון. מדריך מלא לכתיבת בוט עם שערי חליפין מאפס

סיכום

עכשיו אתה יודע איך ליצור בוט עבור טלגרם. אתה יכול להוסיף כלים שימושיים לתוכנית שלך: כפתורים לעדכון ושליחת התוצאה למשתמשים אחרים במסנג'ר ומצב מובנה המאפשר לך להשתמש בפונקציות של הבוט מחוץ לצ'אט איתו. בהתבסס על הוראה זו, אתה יכול ליצור כל בוט פשוט עם פונקציות אחרות - לא רק זו שתציג שערי חליפין. אל תפחדו להתנסות עם ספריות, ממשקי API וקוד כדי ליצור עוזר אוטומטי שישוחח בצ'אט עם לקוחות בטלגרם ויחזק את הקשר של מתעניינים עם החברה.

תגובת 1

השאירו תגובה