لماذا مقال آخر حول إنشاء روبوت للدردشة؟
ربما بحثت بشكل سيئ ، ولكن لم أجد دليلاً مفصلاً حول إنشاء بوت بيثون باستخدام إطار Django ونهج webhook ، الذي تستضيفه شركة روسية. تتحدث معظم المواد عن استخدام إطار عمل القارورة واستخدام الاستضافة المجانية لكل من Heroku و PythonAnywhere. تساعدني تجربة مجتمع حبر على الخروج ، لذلك قررت أن أمضي بعض الوقت لكتابة هذا المقال بامتنان. سأصف التجربة العملية المكتسبة لتمكين كل شخص مهتم بهذا الأمر من توفير الوقت وفهم أفضل لكيفية عمل روبوت في Python باستخدام إطار Django على استضافتهم باستخدام نهج الرد التلقائي على الويب.
لماذا الاستضافة المدفوعة؟
في رأيي ، فإن النسخة القابلة للتطبيق من البوت هي عندما تكون مستقلة عن الكمبيوتر المحلي الخاص بك ومتاحة على مدار الساعة طوال أيام الأسبوع. للقيام بذلك ، تحتاج إلى استضافة يوجد عليها: خادم ويب ، ونظام إدارة قاعدة بيانات (لتطوير قدرات الروبوت) ، وتسجيل اسم النطاق ، والحصول على شهادة SSL لها ودعم فني لكل هذا الاقتصاد. تكلف هذه الخدمات المال. أدفع استضافة 138 روبل شهريًا للحفاظ على البنية التحتية للبوت للعمل: دعم Python + Django ، MySQL DBMS 25 GB ، ودعم SSH.
في معظم الدروس رأيت أن الكمبيوتر الشخصي يستخدم كخادم أو استضافة مجانية مع قيود على ساعات العمل ، وما إلى ذلك. في الأمثلة ، يقوم البوت باستطلاع خادم المراسلة بشكل دوري للرسائل الجديدة الواردة من المستخدمين. هذا حمل إضافي على خوادم المراسلة ، لذا يمكن "حظر" البوت لفترة. كل هذا ، في رأيي ، ليس حيويا للاستخدام المنتج. ولكن للاختبار والتدريب ممكن جدا.
ما هو الرد التلقائي على الويب ولماذا؟
بالنسبة للمنتج ، أعتبر القرار الصحيح لاستخدام الرد التلقائي على الويب ، أي النهج الذي يتوقع فيه برنامج الروبوت لدينا الرسائل من خادم المراسلة ولا "يطرقها" مع الطلبات الدورية: هل هناك رسائل جديدة أم لا. باستخدام الرد التلقائي على الويب ، سيكون الأمر على هذا النحو: كتب المستخدم رسالة ، وأرسلها خادم المراسلة إلى برنامج الروبوت الخاص بك ، وتلقى الرسالة ، وعالجها وأجاب.
لماذا جانغو
قررت عمل روبوت في الثعبان ، لذلك قمت بتوصيل دعم الثعبان على الاستضافة. لكن لم يكن لدي خيار إطار - الاستضافة لديها Django فقط. يقولون أنه يعمل Instagram و Pinterest و Bitbucket و Mozilla. ربما هذا هو السبب في أن الاستضافة تقدمه.
لماذا فكونتاكتي ، وليس برقية أو فايبر؟
للانتقال من البسيط إلى المعقد ، كان من المهم بالنسبة لي أن أجد الطريقة الأسهل والأكثر بديهية لإعداد الرد التلقائي على الويب. تبين أن فكونتاكتي هو الأكثر فهمًا بالنسبة لي بسبب المساعدة الواضحة وسهولة ربط الرد على الويب في لوحة تحكم المجتمع في قسم "الإدارة - العمل مع واجهة برمجة التطبيقات". سيكون وصف كيفية تكوين كل شيء وتوصيله أكثر. في المستقبل ، أريد أن أجعل برنامج الروبوت الخاص بي متاحًا في فايبر. ولكن مع Telegram ، فإن الطريق ليس في الطريق ، لأن استضافتي في روسيا ، و Telegram محظور من روسيا. لتجنب المشاكل مع Telegram ، يمكنك شراء الاستضافة في الخارج.
كيفية تثبيت webhook لـ VK bot؟
اسم المجال https: // . تحتاج أولاً إلى تسجيل اسم المجال للموقع والحصول على شهادة SSL له.
لم أكن أرغب في استخدام النطاق الجذر لبرنامج الدردشة الآلي ، لذلك بعد تسجيل النطاق ، قمت بإنشاء نطاق فرعي وحصلت على شهادة SSL له.
لقد قمت بكل هذه التلاعبات على موقع الاستضافة في حسابي الشخصي.
ونتيجة لذلك ، تلقيت عنوان الموقع mybot.mysite.ru وشهادة SSL لذلك.
نحصل على مفتاح VK (الرمز المميز) للبوت. أولاً أنشأت مجموعة مغلقة ، ثم انتقلت إلى "إدارة" المجموعة ، في قسم "العمل مع واجهة برمجة التطبيقات". في علامة التبويب "Access Keys" هو رمز مميز ، وفي علامة التبويب "واجهة برمجة تطبيقات Callback API".
تثبيت وتكوين Django . ربما لا تحتاج إلى جانغو لتشغيل نص بايثون الخاص بك ، لكني لا أعرف كيف يحدث ذلك.
باستخدام PuTTY ، اتصلت بالخادم عبر SSH ، وقمت بتكوين وتنشيط البيئة الافتراضية.
SSH:
virtualenv-2.7 virtualenv/myEnv . virtualenv/myEnv/bin/activate
يقوم الأمر في السطر الأول بإنشاء بيئة افتراضية ، ويقوم الأمر في السطر الثاني بتنشيطها (لاحظ المسافة بعد النقطة). الإصدار 2.7 تمليه الاستضافة وقد تختلف في حالتك. لذلك ، اقرأ مساعدة الاستضافة.
التالي تثبيت Django
SSH:
pip install 'django<2'
لقد قمت بتثبيت إصدار Django في موعد لا يتجاوز الثاني ، لأن python 2.7 يستخدم في الاستضافة ، ويعمل فقط إصدار Django أقل من 2 معه.
وقمت بتثبيت وحدة python للعمل مع VKontakte API
SSH:
pip install vk
FTP:
إنشاء مجلد لمشاريع django في الدليل الجذر على الاستضافة. دعا لها جانغو.
SSH:
إنشاء مشروع جديد.
cd django/ django-admin.py startproject mybot
نتيجة لذلك ، سيتم إنشاء مجلد باسم المشروع (في حالتنا هو "mybot") في المجلد / django. سيحتوي على ملفات المشروع الأولية التي تم إنشاؤها تلقائيًا:
/ جانغو
/ mybot - مجلد المشروع
/ mybot - وحدة نمطية مع إعدادات مشروعنا
__init__.py
Settings.py
urls.py
wsgi.py
إدارة
مشروع في Django هو مجموعة من التطبيقات. تطبيق في Django هو برنامج يقوم بتنفيذ الإجراءات التي وضعها المطور.
SSH:
إنشاء تطبيق.
cd mybot python manage.py startapp vk_bot
ذهبت إلى
مجلد / django / mybot وقمت بإنشاء تطبيق جديد يسمى "vk_bot".
تم إنشاء مجلد باسم التطبيق في مجلد المشروع يحتوي على ملفات التطبيق التي تم إنشاؤها تلقائيًا:
/ جانغو
/ mybot - مجلد المشروع
/ mybot - وحدة نمطية مع إعدادات مشروعنا
__init__.py
Settings.py
urls.py
wsgi.py
إدارة
/ vk_bot - مجلد التطبيق
__init__.py
admin.py
apps.py
models.py
test.py
views.py
FTP:
قمت بتنزيل جميع ملفات المشروع على جهاز الكمبيوتر المحمول الخاص بي للعمل مع التعليمات البرمجية.
للعمل مع ملفات المشروع والبرمجة ، استخدمت تطبيق Atom.
الذرة:
عدل إعدادات المشروع في الملف
/django/mybot/mybot/settings.py ... DEBUG = False ... ALLOWED_HOSTS = [ u'mybot.mysite.ru', ] ...
الذرة:
تم تعديل إعدادات توجيه
عناوين URL في الملف
/django/mybot/mybot/urls.py ... urlpatterns = [ url(r'^vk_bot/', include('vk_bot.urls')), ] ...
FTP:
إنشاء ملف
/django/mybot/vk_bot/urls.py بالمحتوى
التالي :
from django.conf.urls import url from . import views app_name = 'vk_bot' urlpatterns = [ url(r'^$', views.index, name='index'), ]
الذرة:
تم تعديل الملف
/django/mybot/vk_bot/views.py - تمت إضافة وظيفة تسمى الفهرس إليها وسيتم تنفيذها عند طلب العنوان في المتصفح
https://mybot.mysite.ru/vk_bot/
views.py
في
view.py script ، في وظيفة
الفهرس (الطلب) ، اضطررت إلى تعطيل الحماية المضمنة في Django CSRF ، لأن كنت أتلقى الخطأ "403 ممنوع". CSRF - الحماية من التزوير في طلب المواقع - الحماية من تزوير الطلبات عبر المواقع. كيف يعمل CSRF يمكنك أن تقرأ في هذه
المقالة .
لتعطيل الحماية ، استخدمت
csrf_exempt decorator. ولكن من أجل توفير هذه الحماية على الرغم من كل شيء ، ولكن بطريقة أبسط ، استخدمت مفتاحًا سريًا مسجلًا في قسم إدارة المجموعة على موقع VKontakte على الويب.
هذا الجزء من التعليمات البرمجية مسؤول عن معالجة الطلبات من الخادم التي سيرسلها من أجل ربط الرد على الويب الخاص بنا لمعالجة الأحداث. دعنا نقول فقط "تأكيد" من webhook لدينا.
if (data['type'] == 'confirmation'):
يرجى ملاحظة أنني احتفظ بجميع إعدادات التهيئة في ملف تهيئة بوت منفصل
bot_config.py وبالتالي قم بتوصيله في بداية البرنامج النصي:
from bot_config import *
bot_config.py
وفي هذا الجزء من التعليمات البرمجية ، يعالج رسائل المستخدم:
if (data['type'] == 'message_new'):
إذا كان هناك شيء بدا غير مفهوم ، يمكنك أيضًا قراءة
المقالة حول إعداد Django الأول .
سحر خادم الويب . لتهيئة معالجة الطلبات إلى خادم الويب ، ذهبت إلى الخادم في المجلد الذي يحتوي على نطاقات من خلال عميل FTP FileZilla وقمت بإنشاء المجلد "
mybot.mysite.ru " هناك ، ووضع ثلاثة ملفات فيه ، تم أخذ محتوياتها من المساعدة على الاستضافة:
.htaccess
AddHandler wsgi-script .wsgi RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /django.wsgi/$1 [QSA,PT,L] RewriteCond %{HTTP:X-Forwarded-Protocol} !=https RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
django.wsgi
import os, sys virtual_env = os.path.expanduser('~/virtualenv/myEnv') activate_this = os.path.join(virtual_env, 'bin/activate_this.py') execfile(activate_this, dict(__file__=activate_this)) sys.path.insert(0, os.path.join(os.path.expanduser('~'), 'django/mybot')) os.environ['DJANGO_SETTINGS_MODULE'] = 'mybot.settings' from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
هنا "myEnv" هو اسم البيئة الافتراضية التي قمت بإنشائها ، "django" هو المجلد الموجود في القسم الجذر من نظام الملفات على الاستضافة ، "mybot" هو اسم المشروع الذي أنشأناه باستخدام Django.
index.html
"ربط" ربط الويب الخاص بنا لمعالجة الرسائل في مجموعة VKontakte التي تم إنشاؤها.للقيام بذلك ، سنعود إلى قسم إدارة مجموعتنا على موقع VKontakte على الويب (انظر الصورة أعلاه). سنقوم بإدخال عنوان webhook في حقل "العنوان"
https://mybot.mysite.ru/vk_bot/
وانقر على زر "تأكيد". إذا كانت وظيفة
الفهرس (طلب) ، المكتوبة في ملف
/django/mybot/vk_bot/views.py ، تعمل بشكل صحيح ، أي أنها لا تحتوي على أخطاء مطبعية وأخطاء ، ستظهر علامة اختيار خضراء ترمز إلى أن كل شيء على ما يرام.
من أجل أن يتلقى webhook لدينا رسائل من خادم VKontakte حول رسائل المستخدم الجديدة ، في قسم إدارة مجموعتنا على موقع VKontakte على الويب ، في علامة التبويب "أنواع الأحداث" ، حدد مربع "الرسائل الواردة".
نتيجة لذلك ، سيتلقى برنامجنا النصي هذه الرسائل بتنسيق
json :
{"type":"message_new","object":{"id":891,"date":1541599508,"out":0,"user_id":1...1,"read_state":0,"title":"","body":" "},"group_id":1...4,"secret":"uxSBw"}
يرجى ملاحظة أن هناك حقل "سري" في رسالة
json . هذا هو نفس المفتاح السري الذي قمت بتسجيله في قسم إدارة المجموعة على موقع VKontakte على الويب ، بدلاً من الحماية المضمنة في Django CSRF ، والتي اضطررت إلى تعطيلها.
كيفية جعل الروبوت أكثر ذكاء وأفضل؟
يمكنك إنشاء قاعدة بيانات تحتوي على إجابات للمستخدم وتعليم الروبوت لاختيار الإجابة الأقرب لمعنى سؤال المستخدم. سأتحدث عن هذا في مقال منفصل.
من الممكن والضروري برمجة سيناريوهات تفاعل المستخدم ، إذا جاز التعبير ، للحفاظ على المحادثة.
حظا سعيدا في عملك الإبداعي!