برمجة بوت تيليجرام بايثون اون لاين

output
canvas
info

برمجة بوت تيليجرام بايثون اون لاين

 سكربت بوت تيليجرام جاهز بايثون اون لاين بدون مكتبات محددة، وشرح كيفية انشاء telegram bot وارسال الملفات والصور والبيانات من خلال مكتبة json ، urllib ، requests.

 برمجة بوت تيليجرام بايثون اون لاين

ما هو بوت التلجرام وكيف يمكنني استخدامه؟ - بوت تيليجرام هو مجرد API (واجهة برمجة التطبيقات) مثلة مثل youtube api الذي قمنا بالتطبيق عليه في درس json.

في تطبيق اليوتيوب كنا نطلب البيانات من youtube api ولكن هنا الوضع مختلف لان مستخدم تيليجرام هو الذي سوف يطلب البيانات من البوت الخاص بنا او سكربت بايثون.

انشاء بوت علي تيليجرام

يجب اولاً انشاء البوت الخاص بك والحصول علي التوكين (token) للاتصال به، اذا كنت لا تعلم كيفية انشاء بوت تيليجرام والحصول علي التوكين الخاص به شاهد المقطع التالي:

طريقة التشغيل:

بعد اضافة التوكن الخاص بك قم بضغط زر التشغيل في المحرر بالاعلي ثم توجة الي الـ بوت علي تيليجرام ثم قم بارسال الاوامر التالية:

  1. /hi
  2. /file test.txt
  3. /newfile -n myfile -t my content text

شرح الكود

في البداية تم استدعاء المكتبات المطلوبة وهي json للتعامل مع تشفير نصوص json، ومكتبة urllib لفتح وقراءة البيانات من روابط telegram bot، ومكتبة requests لارسال الملفات والصور.

import json
import urllib
import requests

ثم التصريح عن متغيرات الاتصال بـ بوت التيليجرام وهي التي سوف نخزن بها التوكين واسم مستخدم البوت ورابط telegram api ويجب عليك تعديل البيانات الي البيانات الخاصة بك كما في المقطع السابق.

TOKEN = "6244659139:AAGxTHOJKbubln8RL0imANh3oq-HRZuILz8"
URL = "https://api.telegram.org/bot{}/".format(TOKEN)
USERNAME_BOT = "@Brmghatrybot"

قم بتعديل محتوي متغير TOKEN الي التوكين الخاص بك ومتغير USERNAME_BOT الي اسم مستخدم البوت الخاص بك.

تم استخدام format لدمج قيمة متغير TOKEN مع قيمة متغير URL وتحديداً في موقع الاقواس {} ، وهذا اسلوب من اساليب تنسيق النصوص في بايثون - وبذلك تصبح قيمة متغير URL كالتالي.

URL = "https://api.telegram.org/bot6244659139:AAGxTHOJKbubln8RL0imANh3oq-HRZuILz8/"

دالة get_url

def get_url(url):
    response = urllib.request.urlopen(url)
    return response.read()

سوف يتم استخدام تلك الدالة للحصول علي الطلبات الجديدة مثل رسائل المستخدمين علي تيليجرام ولارسال الرسائل النصية اليهم، ووظيفتها الاساسية هي ارسال طلب (request) لعنوان url و ارجاع نص الرد (response content) من خلال return.

وبما اننا نتحدث الي API فان الرد في الغالب هو نص بتشفير json لذلك تم استدعاء مكتبة json وياتي دور الدالة التالية.

دالة get_json_from_url

def get_json_from_url(url):
    content = get_url(url)
    try:
        js = json.loads(content)
        return js
    except:
        pass

هذه الدالة سوف تكون مسؤلة عن تشغيل دالة get_url و تحويل نص json الي كائن بايثون من خلال json.loads يتم تحويل الرد القادم من تيليجرام الي python object. ثم يتم ارجاع متغير js بواسطة return.

تم استخدام try، except لتفادي الاخطاء في تشفير json.

دالة get_updates

def get_updates(offset=None):
    url = URL + "getUpdates?timeout=100"
    if offset:
        url += "&offset={}".format(offset)
    js = get_json_from_url(url)
    return js

تلك الدالة سوف تكون مسؤلة عن الحصول علي التحديثات او طلبات المستخدمين علي تيليجرام او الاحداث الجديدة ، وهي تعتمد علي الدوال التي ذكرناها سابقاً.

حتي تفهم تلك الدالة قم بفتح الرابط التالي في المتصفح مع تعديل كلمة TOKEN الي التوكين الخاص بك:

https://api.telegram.org/botTOKEN/getUpdates?timeout=100

من داخل تيليجرام قم بارسال رسالة الي البوت الذي قمت بأنشائة سابقاً وقم باعادة تحميل الرابط السابق في المتصفح مع تعديل التوكين ويمكنك تكرار العملية السابقة اكثر من مره لتشاهد نموزج بيانات يشبة التالي:

{
  "ok": true,
  "result": [
    {
      "update_id": 24080804,
      "message": {
        "message_id": 357,
        "from": {
          "id": *****,
          "is_bot": false,
          "first_name": "*****",
          "last_name": "*****",
          "username": "*****",
          "language_code": "en"
        },
        "chat": {
          "id": *****,
          "first_name": "*****",
          "last_name": "*****",
          "username": "*****",
          "type": "private"
        },
        "date": 1677536754,
        "text": "44"
      }
    },
    {
      "update_id": 24080805,
      "message": {
        "message_id": 358,
        "from": {
          "id": *****,
          "is_bot": false,
          "first_name": "*****",
          "last_name": "*****",
          "username": "*****",
          "language_code": "en"
        },
        "chat": {
          "id": 1257914112,
          "first_name": "*****",
          "last_name": "*****",
          "username": "*****",
          "type": "private"
        },
        "date": 1677536800,
        "text": "/start",
        "entities": [
          {
            "offset": 0,
            "length": 6,
            "type": "bot_command"
          }
        ]
      }
    },
    {
      "update_id": 24080806,
      "message": {
        "message_id": 359,
        "from": {
          "id": *****,
          "is_bot": false,
          "first_name": "*****",
          "last_name": "*****",
          "username": "*****",
          "language_code": "en"
        },
        "chat": {
          "id": 1257914112,
          "first_name": "*****",
          "last_name": "*****",
          "username": "*****",
          "type": "private"
        },
        "date": 1677537037,
        "text": "555555555555"
      }
    }
  ]
}

في النموزج السابق تجد كل الرسائل التي تم ارسالها الي telegram bot من جميع المستخدمين في شكل نص json ، ولكل رسالة مفتاح update_id وهو رقم الفهرس لكل رسالة، ومن خلال هذا الرقم يمكننا معرفة الرسائل الاحدث التي تلقاها بوت تيليجرام.

والان بعد ان قمت بارسال عدة رسائل ومشاهدة نموزج البيانات؛ قم باضافة باراميتر offset الي الرابط واجعلة يساوي رقم فهرس اي رسالة من المنتصف كالتالي:

https://api.telegram.org/botTOKEN/getUpdates?timeout=100&offset=24080805

والنتيجة انك سوف تحصل علي نموزج بيانات يحتوي علي جزء من الرسائل يبدأ من الرسالة المطلوبة 24080805 حتي النهاية ، وهذا ما سوف يقلل من استهلاك الانترنت واستهلاك موارد النظام.

دالة get_last_update_id

def get_last_update_id(updates):
    update_ids = []
    for update in updates["result"]:
        update_ids.append(int(update["update_id"]))
    return max(update_ids)

updates = { "ok": True, "result": [ { "update_id": 24080804, "message": { "message_id": 357, "from": { "id": 55555, "is_bot": False, "first_name": "*****", "last_name": "*****", "username": "*****", "language_code": "en" }, "chat": { "id": 55555, "first_name": "*****", "last_name": "*****", "username": "*****", "type": "private" }, "date": 1677536754, "text": "44" } }, { "update_id": 24080805, "message": { "message_id": 358, "from": { "id": 55555, "is_bot": False, "first_name": "*****", "last_name": "*****", "username": "*****", "language_code": "en" }, "chat": { "id": 1257914112, "first_name": "*****", "last_name": "*****", "username": "*****", "type": "private" }, "date": 1677536800, "text": "/start", "entities": [ { "offset": 0, "length": 6, "type": "bot_command" } ] } }, { "update_id": 24080806, "message": { "message_id": 359, "from": { "id": 55555, "is_bot": False, "first_name": "*****", "last_name": "*****", "username": "*****", "language_code": "en" }, "chat": { "id": 1257914112, "first_name": "*****", "last_name": "*****", "username": "*****", "type": "private" }, "date": 1677537037, "text": "555555555555" } } ] }
print(get_last_update_id(updates))

وظيفة هذه الدالة هي استخراج رقم فهرس اخر رسالة من خلال التكرار علي قيمة مفتاح result ، واضافة ارقام الفهرس update_id الي القائمة update_ids واستخراج اكبر رقم من خلال دالة max وارجاعة عبر return.

دالة echo_all

def echo_all(updates):
    try:
        for update in updates["result"]:
            if update.get("message") != None:
                if update.get("message", {}).get("text") != None:
                    text = update["message"]["text"]
                    chat = update["message"]["chat"]["id"]
                    print(text)
                    if "/hi" in text:
                        send_message('Hello my friend, I am your own bot.', chat)
                    elif "/file" in text:
                        send_document(text.replace('/file ', ''), chat)
                    elif "/newfile" in text:
                        s = text.split(' ')
                        if '-n' in text and '-t' in text:
                            f = open(s[s.index('-n')+1], 'w')
                            f.write(s[s.index('-t')+1])
                            f.close()
    except Exception as e:
        print(e)

هذه الدالة يمكنك اعتبارها العقل الالكتروني للـ بوت الخاص بنا ، وهي مسؤلة عن تحليل البيانات الواردة واتخاذ اجراء مناسب وكل التقنيات المستخدمه بها هي حلقة التكرار، والشروط، وفهرسة النصوص.

الدالة echo_all تاخذ باراميتر واحد هو updates وسوف يكون جزء البيانات المطلوب او احدث الرسائل الواردة ، لذلك تم استخدام حلقة التكرار للتكرار علي كل الرسائل.

الشرط الاول والثاني للتحقق من ان الرسالة ليست فارغة اذا كانت ليست فارغة يتم استخراج نص الرسالة والرقم التعريفي للمحادثة للرد لاحقاً، ثم تمرير نص الرسالة علي الشروط التالية للتحقق من وجود الاوامر.

وفي مثالنا هذا هناك ثلاثة اوامر وهي:

  1. /hi - لالقاء التحية علي البوت
  2. /file - لطلب ملف من البوت
  3. /newfile - لانشاء ملف جديد

الشرط الاول:

telegram:/hi

if "/hi" in text:
    send_message('Hello my friend, I am your own bot.', chat)

اذا كانت الكلمة /hi في النص text يتم ارسال رسالة ترحيب الي المستخدم من خلال الدالة send_message ، وهي المسؤلة عن ارسال النصوص.

الشرط الثاني:

telegram:/file test.txt

elif "/file" in text:
     send_document(text.replace('/file ', ''), chat)

اذا لم يتحقق الشرط الاول سوف يتم التحقق من وجود كلمة /file في النص text واذا وجدت يتم ارسال اسم الملف المطلوب الي دالة send_document بعد حذف كلمة /file من النص text.

الشرط الثالث:

telegram:/newfile -n new.txt -t contenttext

elif "/newfile" in text:
   s = text.split(' ')
   if '-n' in text and '-t' in text:
       f = open(s[s.index('-n')+1], 'w')
       f.write(s[s.index('-t')+1:])
       f.close()

اذا تحقق هذا الشرط سوف يتم تحويل النص الي قائمة من خلال فصل الكلمات بواسطة المسافة الفارغة ، وذلك لسهولة الفهرسة واستخراج البيانات من النص.

الشرط الفرعي للتاكد من ان المستخدم ادخل اسم الملف ومحتوي الملف من خلال التحقق من وجود الكلمة -n والكلمة -t في النص text ، ثم فتح ملف جديد بالاسم والمحتوي الذي قمنا باستخراجة من القائمة.

الشروط السابقة مجرد امثلة بسيطة تحتاج لمزيد من التعديلات حسب الحاجة ، لمزيد من المعلومات عن فهرسة النصوص، والقوائم راجع قسم انواع البيانات في بايثون.

تم استخدام try و except فقط لتفادي المشاكل والاخطاء.

دالة ارسال النصوص send_message

def send_message(text, chat_id):
    tot = urllib.parse.quote_plus(text)
    url = URL + "sendMessage?text={}&chat_id={}".format(tot, chat_id)
    get_url(url)

هذه الدالة تاخذ العوامل التالية:

  1. text - نص الرسالة
  2. chat_id - الرقم التعريفي للمحادثة المطلوب ارسال الرسالة اليها

داخل الدالة تم استخدام مكتبة urllib وتحديداً دالة quote_plus لتشفير بعض الرموز في النص text مثل المسافة الفارغة يتم تحويلها الي علامة + ، وهذا لاننا سوف نرسل الرسالة من خلال اسلوب GET.

بمعني اننا سوف ندخل نص الرسالة في رابط الاتصال بـ telegram bot api ؛ لذلك يجب تشفير النصوص وفق شروط تشفير الروابط ، ولمزيد من التفاصيل قم بالبحث عن "url encode".

بعد ذلك تم تنسيق text و chat_id داخل نص الرابط ثم ارسالة الي دالة get_url لارسال الطلب الي تيليجرام.

دالة ارسال ملف send_document

def send_document(doc, chat_id):
    files = {'document': open(doc, 'rb')}
    requests.post(URL + "sendDocument?chat_id={}".format(chat_id), files=files)

هذه الدالة تاخذ العوامل التالية:

  1. doc - اسم الملف.
  2. chat_id - الرقم التعريفي للمحادثة.

داخل الدالة تم التصريح عن متغير files والذي يحتوي علي قاموس مع مفتاح document وقيمتة هي كائن الملف المطلوب.

في هذه الدالة قمنا باستخدام مكتبة requests ؛ لانها تتيح لنا ارسال ملفات وانواع اخري من البيانات عبر اسلوب POST.

دالة ارسال الصور send_image

def send_image(doc, chat_id):
    files = {'photo': open(doc, 'rb')}
    requests.post(URL + "sendPhoto?chat_id={}".format(chat_id), files=files)

لا تختلف هذه الدالة عن الدالة السابقة سوي في مفتاح كائن الملف وهو photo بدلاً من document.

الدالة الرئيسية main

def main():
    last_update_id = None
    while True:
        updates = get_updates(last_update_id)
        if updates is not None:
            if len(updates["result"]) > 0:
                last_update_id = get_last_update_id(updates) + 1
                echo_all(updates)

هذه الدالة هي المشغل لكل الدوال السابقة وهي حلقة التكرار الرئيسية ، داخل الدالة تجد متغير last_update_id وهو لحفظ رقم اخر رسالة ، ثم حلقة تكرار لا نهائية.

مع كل تكرار سوف يتم الاتصال بالدالة get_updates مع رقم اخر رسالة + 1 ، واذا كان updates ليس None هذا يعني وجود رسائل جديدة.

الشرط الفرعي للتحقق بان مفتاح result يحتوي علي عناصر واذا كان عدد العناصر اكبر من صفر يتم تحديث قيمة متغير last_update_id وارسال نموزج البيانات الي دالة echo_all للفهرسة واتخاذ الاجراء المناسب.

تفعيل الدوال

if __name__ == '__main__':
    main()  

وفي النهاية الاتصال بدالة main لتفعيل الدوال والبدأ في تلقي الطلبات.

 

بواسطة : admin
رابط مباشر https://www.brmgha.com/ide?embd=VQwyenEmG0X

تضمين في موقع الكتروني

التعليقات

visitor

/hi

 

  • من خلال الضغط علي زر {;} في شريط الادوات يمكنك اضافة اكواد بايثون الي التعليق للتجربة اون لاين.
  • برجاء مراعاة قواعد الكتابة، والادب.

اكواد بايثون جاهزة

بحث
رسم بورترية python turtle

رسم بورترية python turtle

كود رسم دائرة بايثون turtle

رسم نجمة خماسية بايثون turtle

Python Turtle Online Shaheed Minar

رسم قلب python turtle

Python Turtle Online Fractal Art Tree Of Life

Python Turtle Online Play Sierpinski's Game

Python Turtle Online draw koch snowflakes by click window

Python Turtle Online Draws a Koch snowflake fractal

Python Turtle Online Draw Sierpinski Square

Python Turtle Online Sierpinski Triangle fractal

Python Turtle Online Nonuniform Fractal Tree Drawer

Python Turtle Online Fractal Tree Drawer

Python Turtle Online Drawing Mona Lisa

Python Turtle Online Ulam Spiral

Python Turtle Online Draw Polygons

Python Turtle Online Draw decorative graphics

Python Turtle Online Draw Tree branches

Python Turtle Online Draw Snakes

اون لاين بايثون, اون لاين كومبايلر, بايثون اون لاين كومبايلر, كومبايلر اون لاين, باثون اون لاين, برنامج بايثون اون لاين, محرر نصوص اون لاين, كومبايلر اونلاين, محرر أكواد بايثون اون لاين, بايثون كومبايلر, بايثون اون لاين, محرر اكواد اون لاين, بايثون اونلاين, محرر بايثون اون لاين, mtplotlib