لماذا 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
سيتم كتابة الكود بالكامل بلغة Go الخالصة دون مكتبات خارجية (فقط المكتبة القياسية وعميل HTTP)، حتى تفهم كيف يعمل كل شيء "تحت الغطاء".
\n\nالخطوة 1: إعداد البيئة
\n\nتأكد من تثبيت Go (الإصدار 1.21+). يمكنك التحقق باستخدام الأمر:
\n\ngo version\n\nأنشئ دليلاً جديداً للمشروع وقم بتهيئة الوحدة النمطية:
\n\nmkdir go-chat-bot\ncd go-chat-bot\ngo mod init github.com/yourname/go-chat-bot\n\nستحتاج إلى رمز البوت. إذا لم يكن لديك واحد:
\n- \n
- اكتب في Telegram إلى @BotFather. \n
- أرسل الأمر
/newbotواتبع التعليمات. \n - انسخ الرمز الذي حصلت عليه (يبدو هكذا:
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11). \n
احفظ الرمز في متغير بيئة (لا تحفظ الرموز في الكود أبداً!):
\n\nexport BOT_TOKEN="رمزك_هنا"\n\nالخطوة 2: الهيكل الأساسي للبوت بلغة Go
\n\nأنشئ ملف main.go. سنبدأ بخادم HTTP بسيط يستقبل التحديثات من Telegram. Go مثالي لهذا بفضل الحزمة المدمجة net/http.
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. اكتب"