روبوتات الدردشة بلغة Go: كتابة مساعد سريع وموثوق من الصفر

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا Go هو الخيار الأمثل لروبوتات الدردشة؟

\n\n

إذا سبق لك كتابة روبوت دردشة بلغة Python، فأنت تعلم: أنه يعمل. ولكن عندما يزيد الحمل إلى آلاف الطلبات في الثانية، تبدأ Python في "التفكير". لغة Go (أو Golang) صُممت لكي لا تفكر - إنها فقط تنفذ. الأداء العالي، العمل المدمج مع الشبكة، الغوروتينات (الخيوط الخفيفة) والاستهلاك الأدنى للذاكرة يجعل Go أفضل لغة لإنشاء روبوتات الدردشة عالية التحميل.

\n\n

في هذا الدليل، سنقوم بإنشاء بوت Telegram كامل بلغة Go، سيعالج الأوامر، ويعمل مع API، ويتوسع بسهولة. ستحصل ليس فقط على نظرية، بل على كود جاهز يمكن تشغيله في 5 دقائق.

\n\n

ماذا سنبني؟

\n\n

بوتنا بلغة Go سيكون قادراً على:

\n
    \n
  • الرد على الأمر /start بترحيب.
  • \n
  • استقبال الرسائل النصية وإرجاعها بالأحرف الكبيرة (بوت صدى "ذو شخصية").
  • \n
  • معالجة الأخطاء وتسجيل الإجراءات.
  • \n
  • العمل عبر Telegram Bot API (السيناريو الأكثر شيوعاً لروبوتات الدردشة).
  • \n
\n\n

سيتم كتابة الكود بالكامل بلغة Go الخالصة دون مكتبات خارجية (فقط المكتبة القياسية وعميل HTTP)، حتى تفهم كيف يعمل كل شيء "تحت الغطاء".

\n\n

الخطوة 1: إعداد البيئة

\n\n

تأكد من تثبيت Go (الإصدار 1.21+). يمكنك التحقق باستخدام الأمر:

\n\n
go version
\n\n

أنشئ دليلاً جديداً للمشروع وقم بتهيئة الوحدة النمطية:

\n\n
mkdir go-chat-bot\ncd go-chat-bot\ngo mod init github.com/yourname/go-chat-bot
\n\n

ستحتاج إلى رمز البوت. إذا لم يكن لديك واحد:

\n
    \n
  1. اكتب في Telegram إلى @BotFather.
  2. \n
  3. أرسل الأمر /newbot واتبع التعليمات.
  4. \n
  5. انسخ الرمز الذي حصلت عليه (يبدو هكذا: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11).
  6. \n
\n\n

احفظ الرمز في متغير بيئة (لا تحفظ الرموز في الكود أبداً!):

\n\n
export BOT_TOKEN="رمزك_هنا"
\n\n

الخطوة 2: الهيكل الأساسي للبوت بلغة Go

\n\n

أنشئ ملف main.go. سنبدأ بخادم HTTP بسيط يستقبل التحديثات من Telegram. Go مثالي لهذا بفضل الحزمة المدمجة net/http.

\n\n
package main\n\nimport (\n    "encoding/json"\n    "fmt"\n    "io"\n    "log"\n    "net/http"\n    "os"\n    "strings"\n)\n\n// Update — هيكل التحديث الوارد من Telegram\ntype Update struct {\n    UpdateID int `json:"update_id"`\n    Message  struct {\n        Text string `json:"text"`\n        Chat struct {\n            ID int64 `json:"id"`\n        } `json:"chat"`\n    } `json:"message"`\n}\n\nfunc main() {\n    botToken := os.Getenv("BOT_TOKEN")\n    if botToken == "" {\n        log.Fatal("BOT_TOKEN غير مضبوط")\n    }\n\n    http.HandleFunc("/webhook", func(w http.ResponseWriter, r *http.Request) {\n        handleWebhook(w, r, botToken)\n    })\n\n    log.Println("البوت يعمل على :8080")\n    log.Fatal(http.ListenAndServe(":8080", nil))\n}\n\nfunc handleWebhook(w http.ResponseWriter, r *http.Request, token string) {\n    body, err := io.ReadAll(r.Body)\n    if err != nil {\n        log.Printf("خطأ في قراءة جسم الطلب: %v", err)\n        http.Error(w, "Bad Request", http.StatusBadRequest)\n        return\n    }\n    defer r.Body.Close()\n\n    var update Update\n    if err := json.Unmarshal(body, &update); err != nil {\n        log.Printf("خطأ في تحليل JSON: %v", err)\n        http.Error(w, "Bad JSON", http.StatusBadRequest)\n        return\n    }\n\n    // إذا كانت الرسالة فارغة - نتجاهلها\n    if update.Message.Text == "" {\n        return\n    }\n\n    log.Printf("تم استلام رسالة: %s", update.Message.Text)\n\n    // تشكيل الرد\n    var replyText string\n    if strings.HasPrefix(update.Message.Text, "/start") {\n        replyText = "مرحباً! أنا بوت بلغة Go. اكتب"                

المدونات

توصيات الكتب