Pytelegrambotapi
تطبيق Python بسيط ، ولكن قابلية التوسيع لـ Telegram BOT API.
كل من متزامن وغير متزامن.
دعم API BOT المدعوم: 7.1!
يتم اختبار واجهة برمجة التطبيقات هذه باستخدام Python 3.8-3.12 و Pypy 3. هناك طريقتان لتثبيت المكتبة:
$ pip install pyTelegramBotAPI
$ pip install git+https://github.com/eternnoir/pyTelegramBotAPI.git
يوصى بشكل عام باستخدام الخيار الأول.
على الرغم من أن واجهة برمجة التطبيقات جاهزة للإنتاج ، إلا أنها لا تزال قيد التطوير ولديها تحديثات منتظمة ، لا تنسى تحديثها بانتظام عن طريق الاتصال
pip install pytelegrambotapi --upgrade
من المفترض أنك حصلت على رمز API مع botfather. سوف نسمي هذا الرمز المميز الرمز TOKEN . علاوة على ذلك ، لديك معرفة أساسية بلغة برمجة Python والأهم من ذلك أن Telegram BOT API.
تغلف فئة Telebot (المحددة في __init__.py) جميع مكالمات API في فئة واحدة. يوفر وظائف مثل send_xyz ( send_message ، send_document وما إلى ذلك) وعدة طرق للاستماع للرسائل الواردة.
إنشاء ملف يسمى echo_bot.py . ثم افتح الملف وإنشاء مثيل لفئة Telebot.
import telebot
bot = telebot . TeleBot ( "TOKEN" , parse_mode = None ) # You can set parse_mode by default. HTML or MARKDOWNملاحظة: تأكد من استبدال الرمز المميز برمز API الخاص بك بالفعل.
بعد هذا الإعلان ، نحتاج إلى تسجيل بعض معالجات الرسائل المزعومة. تحدد معالجات الرسائل المرشحات التي يجب أن تمر الرسالة. إذا تم نقل رسالة المرشح ، يتم استدعاء الوظيفة المزينة ويتم تمرير الرسالة الواردة كوسيطة.
دعنا نحدد معالج الرسائل الذي يتعامل مع أوامر /start و /help .
@ bot . message_handler ( commands = [ 'start' , 'help' ])
def send_welcome ( message ):
bot . reply_to ( message , "Howdy, how are you doing?" )يمكن أن يكون للدالة التي تم تزيينها بواسطة معالج الرسائل اسمًا تعسفيًا ، ومع ذلك ، يجب أن يكون لها معلمة واحدة فقط (الرسالة) .
دعنا نضيف معالجًا آخر:
@ bot . message_handler ( func = lambda m : True )
def echo_all ( message ):
bot . reply_to ( message , message . text )هذا واحد يردد جميع الرسائل النصية الواردة إلى المرسل. ويستخدم وظيفة lambda لاختبار رسالة. إذا عاد Lambda بشكل صحيح ، يتم التعامل مع الرسالة بواسطة الوظيفة المزينة. نظرًا لأننا نريد معالجة جميع الرسائل من خلال هذه الوظيفة ، فإننا ببساطة نعود دائمًا.
ملاحظة: يتم اختبار جميع المعالجات بالترتيب الذي تم إعلانهم به
لدينا الآن روبوت أساسي يرد رسالة ثابتة على أوامر "/ابدأ" و "/مساعدة" والتي تردد بقية الرسائل المرسلة. لبدء الروبوت ، أضف ما يلي إلى ملف المصدر الخاص بنا:
bot . infinity_polling ()حسنا ، هذا كل شيء! يبدو ملف مصدرنا الآن هكذا:
import telebot
bot = telebot . TeleBot ( "YOUR_BOT_TOKEN" )
@ bot . message_handler ( commands = [ 'start' , 'help' ])
def send_welcome ( message ):
bot . reply_to ( message , "Howdy, how are you doing?" )
@ bot . message_handler ( func = lambda message : True )
def echo_all ( message ):
bot . reply_to ( message , message . text )
bot . infinity_polling () لبدء الروبوت ، ما عليك سوى فتح محطة وإدخال python echo_bot.py لتشغيل الروبوت! اختبره عن طريق إرسال الأوامر ('/start' و '/help') والرسائل النصية التعسفية.
يتم تعريف جميع الأنواع في الأنواع. كلها تتماشى تمامًا مع تعريف Telegram API للأنواع ، باستثناء الرسالة from الحقل ، والتي تتم تسميتها إلى from_user (لأن from الرمز المميز المحجوز). وبالتالي ، يمكن الوصول إلى سمات مثل message_id مباشرة باستخدام message.message_id . User GroupChat message.chat
يحتوي كائن الرسالة أيضًا على سمة content_type ، والتي تحدد نوع الرسالة. يمكن أن يكون content_type أحد الأوتار التالية: text ، audio ، document ، animation new_chat_photo game ، photo ، sticker delete_chat_photo video ، video_note ، voice ، location ، contact ، venue new_chat_title dice left_chat_member new_chat_members supergroup_chat_created group_chat_created channel_chat_created ، migrate_to_chat_id ، migrate_from_chat_id ، pinned_message ، invoice ، successful_payment ، connected_website ، poll ، passport_data ، proximity_alert_triggered ، video_chat_scheduled ، video_chat_started video_chat_ended video_chat_participants_invited . web_app_data ، message_auto_delete_timer_changed ، forum_topic_created ، forum_topic_closed ، forum_topic_reopened ، forum_topic_edited ، general_forum_topic_hidden ، general_forum_topic_unhidden ، write_access_allowed ، user_shared ، chat_shared ، story .
يمكنك استخدام بعض الأنواع في وظيفة واحدة. مثال:
content_types=["text", "sticker", "pinned_message", "photo", "audio"]
توجد جميع أساليب API في فئة Telebot. تم إعادة تسميتها لمتابعة اتفاقيات تسمية بيثون المشتركة. على سبيل المثال ، تتم إعادة تسمية getMe إلى get_me و sendMessage إلى send_message .
الموضحة أدناه هي بعض حالات الاستخدام العام لواجهة برمجة التطبيقات.
معالج الرسائل هو وظيفة مزينة باستخدام message_handler Decorator لمثيل Telebot. تتكون معالجات الرسائل من مرشحات واحدة أو متعددة. يجب أن يعود كل مرشح إلى رسالة معينة من أجل أن يصبح معالج الرسائل مؤهلاً للتعامل مع هذه الرسالة. يتم الإعلان عن معالج الرسائل بالطريقة التالية (شريطة أن يكون bot مثيلًا لـ Telebot):
@ bot . message_handler ( filters )
def function_name ( message ):
bot . reply_to ( message , "This is a message handler" ) function_name غير مرتبط بأي قيود. أي اسم وظيفة مسموح بها مع معالجات الرسائل. يجب أن تقبل الوظيفة في معظم الوسيطة ، والتي ستكون الرسالة التي يجب أن تتعامل معها الوظيفة. filters هي قائمة من وسيطات الكلمات الرئيسية. يتم الإعلان عن مرشح بالطريقة التالية: name=argument . قد يكون معالج واحد مرشحات متعددة. يدعم Telebot المرشحات التالية:
| اسم | الحجة (ق) | حالة |
|---|---|---|
| content_types | قائمة السلاسل (الافتراضي ['text'] ) | True إذا كانت message.content_type في قائمة السلاسل. |
| regexp | تعبير منتظم كسلسلة | True إذا كان re.search(regexp_arg) إرجاع True و message.content_type == 'text' (انظر تعبيرات Python العادية) |
| الأوامر | قائمة السلاسل | True إذا كانت message.content_type == 'text' و message.text يبدأ بأمر موجود في قائمة الأوتار. |
| chat_types | قائمة أنواع الدردشة | True إذا message.chat.type في المرشح الخاص بك |
| Func | وظيفة (lambda أو مرجع الوظيفة) | True إذا كان مرجع Lambda أو الوظيفة يرجع True |
فيما يلي بعض الأمثلة على استخدام المرشحات ومعالجات الرسائل:
import telebot
bot = telebot . TeleBot ( "TOKEN" )
# Handles all text messages that contains the commands '/start' or '/help'.
@ bot . message_handler ( commands = [ 'start' , 'help' ])
def handle_start_help ( message ):
pass
# Handles all sent documents and audio files
@ bot . message_handler ( content_types = [ 'document' , 'audio' ])
def handle_docs_audio ( message ):
pass
# Handles all text messages that match the regular expression
@ bot . message_handler ( regexp = "SOME_REGEXP" )
def handle_message ( message ):
pass
# Handles all messages for which the lambda returns True
@ bot . message_handler ( func = lambda message : message . document . mime_type == 'text/plain' , content_types = [ 'document' ])
def handle_text_doc ( message ):
pass
# Which could also be defined as:
def test_message ( message ):
return message . document . mime_type == 'text/plain'
@ bot . message_handler ( func = test_message , content_types = [ 'document' ])
def handle_text_doc ( message ):
pass
# Handlers can be stacked to create a function which will be called if either message_handler is eligible
# This handler will be called if the message starts with '/hello' OR is some emoji
@ bot . message_handler ( commands = [ 'hello' ])
@ bot . message_handler ( func = lambda msg : msg . text . encode ( "utf-8" ) == SOME_FANCY_EMOJI )
def send_something ( message ):
passهام: يتم اختبار جميع المعالجات بالترتيب الذي تم الإعلان عنه
التعامل مع الرسائل المعدلة @bot.edited_message_handler(filters) # <- passes a Message type object to your function
التعامل مع رسائل نشر القناة @bot.channel_post_handler(filters) # <- passes a Message type object to your function
التعامل مع رسائل نشر القناة المحررة @bot.edited_channel_post_handler(filters) # <- passes a Message type object to your function
التعامل مع استفسارات رد الاتصال
@ bot . callback_query_handler ( func = lambda call : True )
def test_callback ( call ): # <- passes a CallbackQuery type object to your function
logger . info ( call ) التعامل مع استفسارات الشحن @bot.shipping_query_handler() # <- passes a ShippingQuery type object to your function
تعامل مع الاستعلامات قبل checkoupt @bot.pre_checkout_query_handler() # <- passes a PreCheckoutQuery type object to your function
تعامل مع تحديثات الاستطلاع @bot.poll_handler() # <- passes a Poll type object to your function
تعامل مع استطلاع الإجابات @bot.poll_answer_handler() # <- passes a PollAnswer type object to your function
تعامل مع تحديثات حالة عضو الروبوت في chat @bot.my_chat_member_handler() # <- passes a ChatMemberUpdated type object to your function
تعامل مع تحديثات حالة عضو الدردشة في الدردشة @bot.chat_member_handler() # <- passes a ChatMemberUpdated type object to your function ملاحظة: "chat_member" لا يتم طلب تحديثات افتراضيًا. إذا كنت ترغب في السماح لجميع أنواع التحديثات ، فقم بتعيين allowed_updates في bot.polling() / bot.infinity_polling() إلى util.update_types
تعامل مع طلبات الانضمام إلى الدردشة باستخدام: @bot.chat_join_request_handler() # <- passes ChatInviteLink type object to your function
مزيد من المعلومات حول الوضع المضمّن.
الآن ، يمكنك استخدام inline_handler للحصول على استفسارات مضمنة في Telebot.
@ bot . inline_handler ( lambda query : query . query == 'text' )
def query_text ( inline_query ):
# Query message is text استخدم chosen_inline_handler للحصول على اختيار _inline_result في Telebot. لا تنسى إضافة أمر /setInlineFeedback لـ botfather.
مزيد من المعلومات: تجميع التغذية
@ bot . chosen_inline_handler ( func = lambda chosen_inline_result : True )
def test_chosen ( chosen_inline_result ):
# Process all chosen_inline_result. @ bot . inline_handler ( lambda query : query . query == 'text' )
def query_text ( inline_query ):
try :
r = types . InlineQueryResultArticle ( '1' , 'Result' , types . InputTextMessageContent ( 'Result message.' ))
r2 = types . InlineQueryResultArticle ( '2' , 'Result2' , types . InputTextMessageContent ( 'Result message2.' ))
bot . answer_inline_query ( inline_query . id , [ r , r2 ])
except Exception as e :
print ( e ) معالج البرامج الوسيطة هو وظيفة تتيح لك تعديل الطلبات أو سياق الروبوت أثناء مرورها عبر البرقية إلى الروبوت. يمكنك تخيل البرامج الوسيطة كسلسلة من الاتصال المنطقي التي يتم التعامل معها قبل تنفيذ أي معالجات أخرى. يتم تعطيل معالجة البرامج الوسيطة افتراضيًا ، وتمكينه عن طريق تعيين apihelper.ENABLE_MIDDLEWARE = True .
apihelper . ENABLE_MIDDLEWARE = True
@ bot . middleware_handler ( update_types = [ 'message' ])
def modify_message ( bot_instance , message ):
# modifying the message before it reaches any other handler
message . another_text = message . text + ':changed'
@ bot . message_handler ( commands = [ 'start' ])
def start ( message ):
# the message is already modified when it reaches message handler
assert message . another_text == message . text + ':changed'هناك أمثلة أخرى باستخدام معالج البرامج الوسيطة في دليل الأمثلة/الوسيطة.
هناك الأوساط الوطنية القائمة على الفصل. يبدو أن الوسيطة الأساسية القائمة على الفصل هكذا:
class Middleware ( BaseMiddleware ):
def __init__ ( self ):
self . update_types = [ 'message' ]
def pre_process ( self , message , data ):
data [ 'foo' ] = 'Hello' # just for example
# we edited the data. now, this data is passed to handler.
# return SkipHandler() -> this will skip handler
# return CancelUpdate() -> this will cancel update
def post_process ( self , message , data , exception = None ):
print ( data [ 'foo' ])
if exception : # check for exception
print ( exception )يجب أن تحتوي البرامج الوسيطة المستندة إلى الفصل على وظيفتين: Post and Pre Process. لذلك ، كما ترون ، تعمل الأطوار المتوسطة القائمة على الفصل قبل وبعد تنفيذ المعالج. للمزيد ، تحقق من الأمثلة
أيضًا ، يمكنك استخدام المرشحات المخصصة المدمجة. أو يمكنك إنشاء مرشح خاص بك.
مثال على مرشح مخصص أيضًا ، لدينا أمثلة عليها. تحقق من هذه الروابط: يمكنك التحقق من بعض المرشحات المدمجة في مثال رمز المصدر للتصفية عن طريق معرف مثال على التصفية عن طريق النص إذا كنت ترغب في إضافة بعض المرشحات المدمجة ، فأنت مرحب بك لإضافته في ملف custom_filters.py. فيما يلي مثال على إنشاء فئة المرشح:
class IsAdmin ( telebot . custom_filters . SimpleCustomFilter ):
# Class will check whether the user is admin or creator in group or not
key = 'is_chat_admin'
@ staticmethod
def check ( message : telebot . types . Message ):
return bot . get_chat_member ( message . chat . id , message . from_user . id ). status in [ 'administrator' , 'creator' ]
# To register filter, you need to use method add_custom_filter.
bot . add_custom_filter ( IsAdmin ())
# Now, you can use it in handler.
@ bot . message_handler ( is_chat_admin = True )
def admin_of_group ( message ):
bot . send_message ( message . chat . id , 'You are admin of this group!' ) import telebot
TOKEN = '<token_string>'
tb = telebot . TeleBot ( TOKEN ) #create a new Telegram Bot object
# Upon calling this function, TeleBot starts polling the Telegram servers for new messages.
# - interval: int (default 0) - The interval between polling requests
# - timeout: integer (default 20) - Timeout in seconds for long polling.
# - allowed_updates: List of Strings (default None) - List of update types to request
tb . infinity_polling ( interval = 0 , timeout = 20 )
# getMe
user = tb . get_me ()
# setWebhook
tb . set_webhook ( url = "http://example.com" , certificate = open ( 'mycert.pem' ))
# unset webhook
tb . remove_webhook ()
# getUpdates
updates = tb . get_updates ()
# or
updates = tb . get_updates ( 1234 , 100 , 20 ) #get_Updates(offset, limit, timeout):
# sendMessage
tb . send_message ( chat_id , text )
# editMessageText
tb . edit_message_text ( new_text , chat_id , message_id )
# forwardMessage
tb . forward_message ( to_chat_id , from_chat_id , message_id )
# All send_xyz functions which can take a file as an argument, can also take a file_id instead of a file.
# sendPhoto
photo = open ( '/tmp/photo.png' , 'rb' )
tb . send_photo ( chat_id , photo )
tb . send_photo ( chat_id , "FILEID" )
# sendAudio
audio = open ( '/tmp/audio.mp3' , 'rb' )
tb . send_audio ( chat_id , audio )
tb . send_audio ( chat_id , "FILEID" )
## sendAudio with duration, performer and title.
tb . send_audio ( CHAT_ID , file_data , 1 , 'eternnoir' , 'pyTelegram' )
# sendVoice
voice = open ( '/tmp/voice.ogg' , 'rb' )
tb . send_voice ( chat_id , voice )
tb . send_voice ( chat_id , "FILEID" )
# sendDocument
doc = open ( '/tmp/file.txt' , 'rb' )
tb . send_document ( chat_id , doc )
tb . send_document ( chat_id , "FILEID" )
# sendSticker
sti = open ( '/tmp/sti.webp' , 'rb' )
tb . send_sticker ( chat_id , sti )
tb . send_sticker ( chat_id , "FILEID" )
# sendVideo
video = open ( '/tmp/video.mp4' , 'rb' )
tb . send_video ( chat_id , video )
tb . send_video ( chat_id , "FILEID" )
# sendVideoNote
videonote = open ( '/tmp/videonote.mp4' , 'rb' )
tb . send_video_note ( chat_id , videonote )
tb . send_video_note ( chat_id , "FILEID" )
# sendLocation
tb . send_location ( chat_id , lat , lon )
# sendChatAction
# action_string can be one of the following strings: 'typing', 'upload_photo', 'record_video', 'upload_video',
# 'record_audio', 'upload_audio', 'upload_document' or 'find_location'.
tb . send_chat_action ( chat_id , action_string )
# getFile
# Downloading a file is straightforward
# Returns a File object
import requests
file_info = tb . get_file ( file_id )
file = requests . get ( 'https://api.telegram.org/file/bot{0}/{1}' . format ( API_TOKEN , file_info . file_path ))
جميع وظائف send_xyz من Telebot تأخذ وسيطة reply_markup اختيارية. يجب أن تكون هذه الوسيطة مثيلًا لـ ReplyKeyboardMarkup أو ReplyKeyboardRemove أو ForceReply ، والتي يتم تعريفها في الأنواع.
from telebot import types
# Using the ReplyKeyboardMarkup class
# It's constructor can take the following optional arguments:
# - resize_keyboard: True/False (default False)
# - one_time_keyboard: True/False (default False)
# - selective: True/False (default False)
# - row_width: integer (default 3)
# row_width is used in combination with the add() function.
# It defines how many buttons are fit on each row before continuing on the next row.
markup = types . ReplyKeyboardMarkup ( row_width = 2 )
itembtn1 = types . KeyboardButton ( 'a' )
itembtn2 = types . KeyboardButton ( 'v' )
itembtn3 = types . KeyboardButton ( 'd' )
markup . add ( itembtn1 , itembtn2 , itembtn3 )
tb . send_message ( chat_id , "Choose one letter:" , reply_markup = markup )
# or add KeyboardButton one row at a time:
markup = types . ReplyKeyboardMarkup ()
itembtna = types . KeyboardButton ( 'a' )
itembtnv = types . KeyboardButton ( 'v' )
itembtnc = types . KeyboardButton ( 'c' )
itembtnd = types . KeyboardButton ( 'd' )
itembtne = types . KeyboardButton ( 'e' )
markup . row ( itembtna , itembtnv )
markup . row ( itembtnc , itembtnd , itembtne )
tb . send_message ( chat_id , "Choose one letter:" , reply_markup = markup )المثال الأخير يعطي هذه النتيجة:
# ReplyKeyboardRemove: hides a previously sent ReplyKeyboardMarkup
# Takes an optional selective argument (True/False, default False)
markup = types . ReplyKeyboardRemove ( selective = False )
tb . send_message ( chat_id , message , reply_markup = markup ) # ForceReply: forces a user to reply to a message
# Takes an optional selective argument (True/False, default False)
markup = types . ForceReply ( selective = False )
tb . send_message ( chat_id , "Send me another word:" , reply_markup = markup )بالتخيل:
يمثل هذا الكائن كيانًا خاصًا في رسالة نصية. على سبيل المثال ، علامات التجزئة ، أسماء المستخدمين ، عناوين URL ، إلخ. السمات:
typeurloffsetlengthuser إليك مثال: message.entities[num].<attribute>
هنا num هو رقم الكيان أو ترتيب الكيان في الرد ، لأنه إذا كانت هناك كيانات متعددة في الرد/الرسالة.
message.entities إرجاع قائمة كائن الكيانات.
message.entities[0].type سوف يعطي نوع الكيان الأول
قم بإحالة BOT API للحصول على تفاصيل إضافية
منذ الإصدار 5.0 من API BOT ، لديك إمكانية تشغيل خادم API BOT الخاص بك. Pytelegrambotapi يدعم أيضا هذه الميزة.
from telebot import apihelper
apihelper . API_URL = "http://localhost:4200/bot{0}/{1}" مهم: كما هو موضح هنا ، يجب عليك تسجيل الخروج من الروبوت من خادم Telegram قبل التبديل إلى خادم API المحلي. في pytelegrambotapi استخدم bot.log_out()
ملاحظة: 4200 هو منفذ مثال
جديد: هناك تنفيذ غير متزامن لـ Telebot. لتمكين هذا السلوك ، قم بإنشاء مثيل لـ AsyncteleBot بدلاً من Telebot.
tb = telebot . AsyncTeleBot ( "TOKEN" )الآن ، يتم تنفيذ كل وظيفة تستدعي واجهة برمجة تطبيقات Telegram في مهمة غير متزامنة منفصلة. يتيح لك استخدام AsyncteleBot القيام بما يلي:
import telebot
tb = telebot . AsyncTeleBot ( "TOKEN" )
@ tb . message_handler ( commands = [ 'start' ])
async def start_message ( message ):
await bot . send_message ( message . chat . id , 'Hello!' )رؤية المزيد في الأمثلة
في بعض الأحيان يجب أن ترسل رسائل تتجاوز 5000 حرف. لا يمكن لـ Telegram API التعامل مع العديد من الأحرف في طلب واحد ، لذلك نحتاج إلى تقسيم الرسالة بالمضاعفات. إليك كيفية القيام بذلك باستخدام واجهة برمجة التطبيقات:
from telebot import util
large_text = open ( "large_text.txt" , "rb" ). read ()
# Split the text each 3000 characters.
# split_string returns a list with the splitted text.
splitted_text = util . split_string ( large_text , 3000 )
for text in splitted_text :
tb . send_message ( chat_id , text ) أو يمكنك استخدام وظيفة smart_split الجديدة للحصول على مجموعة فرعية أكثر أهمية:
from telebot import util
large_text = open ( "large_text.txt" , "rb" ). read ()
# Splits one string into multiple strings, with a maximum amount of `chars_per_string` (max. 4096)
# Splits by last 'n', '. ' or ' ' in exactly this priority.
# smart_split returns a list with the splitted text.
splitted_text = util . smart_split ( large_text , chars_per_string = 3000 )
for text in splitted_text :
tb . send_message ( chat_id , text )يأخذ مُنشئ Telebot الوسائط الاختيارية التالية:
كبديل لمعالجات الرسائل ، يمكن للمرء أيضًا تسجيل وظيفة كمستمع لـ Telebot.
إشعار: لن تختفي المعالجات! ستتم معالجة رسالتك من قبل المعالجات والمستمعين. أيضا ، من المستحيل التنبؤ الذي سيعمل في البداية بسبب الخيوط. إذا كنت تستخدم الخيوط = FALSE ، فستعمل المستمعون المخصصون في وقت مبكر ، بعد أن يتم استدعاء معالجاتهم. مثال:
def handle_messages ( messages ):
for message in messages :
# Do something with the message
bot . reply_to ( message , 'Hi' )
bot . set_update_listener ( handle_messages )
bot . infinity_polling ()عند استخدام WebHooks Telegram يرسل تحديثًا واحدًا لكل مكالمة ، ومعالجته ، يجب عليك الاتصال بـ Process_new_messages ([update.message]) عند استلامها.
هناك بعض الأمثلة باستخدام Webhooks في دليل الأمثلة/WebHook_Examples.
يمكنك استخدام سجل وحدة Telebot لتسجيل معلومات التصحيح حول Telebot. استخدم telebot.logger للحصول على مسجل وحدة Telebot. من الممكن إضافة معالجات تسجيل مخصصة إلى المسجل. ارجع إلى صفحة وحدة تسجيل بيثون لمزيد من المعلومات.
import logging
logger = telebot . logger
telebot . logger . setLevel ( logging . DEBUG ) # Outputs debug messages to console.للمزامنة:
يمكنك استخدام الوكيل للطلب. سيستخدم كائن apihelper.proxy بواسطة وسيطة requests الاتصال.
from telebot import apihelper
apihelper . proxy = { 'http' : 'http://127.0.0.1:3128' } إذا كنت ترغب في استخدام Proxy Socket5 ، فأنت بحاجة إلى تثبيت pip install requests[socks] وتأكد من أن لديك أحدث إصدار من gunicorn و PySocks و pyTelegramBotAPI requests و urllib3 .
apihelper . proxy = { 'https' : 'socks5://userproxy:password@proxy_address:port' }من أجل Async:
from telebot import asyncio_helper
asyncio_helper . proxy = 'http://127.0.0.1:3128' #urlيمكنك تعطيل أو تغيير التفاعل مع خادم Telegram الحقيقي باستخدام
apihelper . CUSTOM_REQUEST_SENDER = your_handlerالمعلمة. يمكنك تمرير وظيفتك الخاصة التي سيتم استدعاؤها بدلاً من الطلبات .
على سبيل المثال:
def custom_sender ( method , url , ** kwargs ):
print ( "custom_sender. method: {}, url: {}, params: {}" . format ( method , url , kwargs . get ( "params" )))
result = util . CustomRequestResponse ( '{"ok":true,"result":{"message_id": 1, "date": 1, "chat": {"id": 1, "type": "private"}}}' )
return resultثم يمكنك استخدام API وشراء الطلبات في رمز معالجك.
apihelper . CUSTOM_REQUEST_SENDER = custom_sender
tb = TeleBot ( "test" )
res = tb . send_message ( 123 , "Test" )ستكون النتيجة:
custom_sender. method: post, url: https://api.telegram.org/botololo/sendMessage, params: {'chat_id': '123', 'text': 'Test'}
لدينا نسخة غير متزامنة تمامًا من Telebot. لا يتم التحكم في هذه الفئة بواسطة المواضيع. يتم إنشاء مهام Asyncio لتنفيذ جميع الأشياء.
مثال بوت صدى على asynctelebot:
# This is a simple echo bot using the decorator mechanism.
# It echoes any incoming text messages.
from telebot . async_telebot import AsyncTeleBot
import asyncio
bot = AsyncTeleBot ( 'TOKEN' )
# Handle '/start' and '/help'
@ bot . message_handler ( commands = [ 'help' , 'start' ])
async def send_welcome ( message ):
await bot . reply_to ( message , """
Hi there, I am EchoBot.
I am here to echo your kind words back to you. Just say anything nice and I'll say the exact same thing to you!
""" )
# Handle all other messages with content_type 'text' (content_types defaults to ['text'])
@ bot . message_handler ( func = lambda message : True )
async def echo_message ( message ):
await bot . reply_to ( message , message . text )
asyncio . run ( bot . polling ())كما ترون هنا ، فإن الكلمات الرئيسية تنتظر ومتزامنة.
تعتمد المهام غير المتزامنة على أداء المعالج. يمكن للعديد من المهام غير المتزامنة تشغيل باراليلي ، في حين أن مهام الخيوط ستحظر بعضها البعض.
AsyncteleBot غير متزامن. يستخدم AIOHTTP بدلاً من وحدة الطلبات.
شاهد المزيد من الأمثلة في مجلد أمثلةنا
Telegram BOT API تدعم الدردشة الجديدة للرسالة.
type في كائن Chat : if message . chat . type == "private" :
# private chat message
if message . chat . type == "group" :
# group chat message
if message . chat . type == "supergroup" :
# supergroup chat message
if message . chat . type == "channel" :
# channel message قد يتم رفض مثيلات الروبوت التي كانت خاملة لفترة طويلة من قبل الخادم عند إرسال رسالة بسبب مهلة الجلسة الأخيرة المستخدمة. أضف apihelper.SESSION_TIME_TO_LIVE = 5 * 60 إلى تهييدك لإجبار الترفيه بعد 5 دقائق دون أي نشاط.
احصل على المساعدة. يناقش. محادثة.
انضم إلى قناة الأخبار. هنا سنقوم بنشر الإصدارات والتحديثات.
القالب هو مجلد جاهز يحتوي على بنية للمشروع الأساسي. فيما يلي بعض الأمثلة على القالب:
تريد أن تدرج روبوتك هنا؟ فقط قدم طلب سحب. يتم قبول الروبوتات فقط مع رمز المصدر العام.