कैसे पायथन, Django और webhook का उपयोग करके VKontakte के लिए एक चैट बॉट बनाने के लिए

चैट बॉट बनाने के बारे में एक और लेख क्यों?


शायद मैंने खराब तरीके से खोजा, लेकिन मुझे Django ढांचे और वेबहूक दृष्टिकोण का उपयोग करके एक अजगर बॉट बनाने पर एक विस्तृत मार्गदर्शिका नहीं मिल पाई, जिसे एक रूसी कंपनी द्वारा होस्ट किया गया है। अधिकांश सामग्री फ्लास्क फ्रेमवर्क का उपयोग करने और हरोकू और पायथनऑनएब की मुफ्त होस्टिंग का उपयोग करने के बारे में बात करती हैं। हैबर समुदाय का अनुभव मेरी मदद करता है, इसलिए मैंने इस लेख को लिखने में समय बिताने के लिए कृतज्ञता के एक टोकन के रूप में फैसला किया। मैं हर किसी को सक्षम करने के लिए प्राप्त व्यावहारिक अनुभव का वर्णन करूंगा जो समय बचाने के लिए इच्छुक हैं और बेहतर तरीके से समझते हैं कि वेबहुक दृष्टिकोण का उपयोग करके अपनी होस्टिंग पर Django ढांचे का उपयोग करके पायथन में एक बॉट कैसे बनाया जाए।

होस्टिंग क्यों दी?


मेरी राय में, बॉट का एक व्यवहार्य संस्करण तब है जब यह आपके स्थानीय कंप्यूटर से स्वतंत्र है और 24/7 उपलब्ध है। ऐसा करने के लिए, आपको एक होस्टिंग की आवश्यकता है, जिस पर: एक वेब सर्वर, एक डेटाबेस प्रबंधन प्रणाली (बॉट की क्षमताओं को विकसित करने के लिए), एक डोमेन नाम का पंजीकरण, इसके लिए एक एसएसएल प्रमाणपत्र प्राप्त करना और इस सभी अर्थव्यवस्था के लिए तकनीकी सहायता। ऐसी सेवाओं में पैसा खर्च होता है। मैं बॉट को काम करने के लिए बुनियादी ढांचे को बनाए रखने के लिए एक महीने में 138 रूबल की मेजबानी का भुगतान करता हूं: पायथन + Django, MySQL DBMS 25 जीबी के लिए समर्थन, एसएसएच के लिए समर्थन।
अधिकांश पाठों में मैंने देखा कि एक व्यक्तिगत कंप्यूटर का उपयोग सर्वर के रूप में किया जाता है या काम के घंटों पर प्रतिबंध के साथ मुफ्त होस्टिंग आदि का उपयोग किया जाता है। उदाहरणों में, बॉट समय-समय पर उपयोगकर्ताओं से नए संदेशों के लिए मैसेंजर सर्वर का चुनाव करता है। यह मैसेंजर सर्वर पर एक अतिरिक्त भार है, इसलिए बॉट को थोड़ी देर के लिए "प्रतिबंधित" किया जा सकता है। यह सब, मेरी राय में, उत्पादक उपयोग के लिए महत्वपूर्ण नहीं है। लेकिन परीक्षण और प्रशिक्षण के लिए काफी संभव है।

Webhook क्या है और यह क्यों है?


उत्पाद के लिए, मैं एक webhook का उपयोग करने के लिए सही निर्णय पर विचार करता हूं, अर्थात्, एक दृष्टिकोण जिसमें हमारे बॉट मैसेंजर सर्वर से संदेशों की अपेक्षा करते हैं और आवधिक अनुरोधों के साथ इसे "हथौड़ा" नहीं करते हैं: नए संदेश हैं या नहीं। एक webhook के साथ, यह इस तरह होगा: उपयोगकर्ता ने एक संदेश लिखा, संदेशवाहक सर्वर ने इसे आपके बॉट में भेजा, उसने संदेश प्राप्त किया, इसे संसाधित किया और उत्तर दिया।

क्यों django


मैंने अजगर में एक बॉट बनाने का फैसला किया, इसलिए मैंने होस्टिंग पर अजगर के समर्थन को जोड़ा। लेकिन मेरे पास एक फ्रेमवर्क का विकल्प नहीं है - होस्टिंग में केवल Django है। वे कहते हैं कि यह Instagram, Pinterest, Bitbucket और Mozilla में काम करता है। शायद यही कारण है कि होस्टिंग प्रदान करता है।

क्यों VKontakte, तार या Viber नहीं?


सरल से जटिल में जाने के लिए, मेरे लिए एक वेबहूक स्थापित करने का सबसे आसान और सबसे सहज तरीका खोजना महत्वपूर्ण था। "प्रबंधन - एपीआई के साथ काम करना" अनुभाग में कम्युनिटी कंट्रोल पैनल में वेबहूक को जोड़ने में स्पष्ट मदद और आसानी के कारण वीकेकंटे मेरे लिए सबसे अधिक समझ में आया। मैंने कैसे कॉन्फ़िगर और सब कुछ कनेक्ट किया, इसका विवरण आगे होगा। भविष्य में मैं अपने बॉट को वाइबर में उपलब्ध कराना चाहता हूं। लेकिन टेलीग्राम के साथ, यह अभी तक रास्ते में नहीं है, क्योंकि मेरी मेजबानी रूस में है, और टेलीग्राम रूस से अवरुद्ध है। टेलीग्राम की समस्याओं से बचने के लिए, आप विदेश में होस्टिंग खरीद सकते हैं।

वीके बॉट के लिए वेबहूक कैसे स्थापित करें?


डोमेन नाम https: // । सबसे पहले आपको साइट के डोमेन नाम को पंजीकृत करने और इसके लिए एक एसएसएल प्रमाण पत्र प्राप्त करने की आवश्यकता है।

मैं चैटबोट के लिए रूट डोमेन का उपयोग नहीं करना चाहता था, इसलिए डोमेन को पंजीकृत करने के बाद, मैंने एक उपडोमेन बनाया और इसके लिए एक एसएसएल प्रमाणपत्र प्राप्त किया।

मैंने अपने व्यक्तिगत खाते में होस्टिंग साइट पर इन सभी जोड़तोड़ को किया।
नतीजतन, मुझे साइट mybot.mysite.ru का पता और इसके लिए एसएसएल प्रमाणपत्र प्राप्त हुआ।

हमें बॉट के लिए वीके कुंजी (टोकन) मिलता है। पहले मैंने एक बंद समूह बनाया, फिर "एपीआई के साथ काम करना" अनुभाग में, समूह के "प्रबंधन" में चला गया। टैब में "एक्सेस कीज़" एक टोकन है, और टैब में "कॉलबैक एपीआई" वेबहूक सेटिंग्स।



Django को स्थापित और कॉन्फ़िगर करें । हो सकता है कि आपको अपने अजगर स्क्रिप्ट को चलाने के लिए Django की आवश्यकता न हो, लेकिन मुझे नहीं पता कि यह कैसे है।

PuTTY का उपयोग करके, मैं SSH के माध्यम से सर्वर से जुड़ा, वर्चुअल वातावरण को कॉन्फ़िगर और सक्रिय किया।

SSH:
virtualenv-2.7 virtualenv/myEnv . virtualenv/myEnv/bin/activate 

पहली पंक्ति में कमांड एक आभासी वातावरण बनाता है, और दूसरी पंक्ति में कमांड इसे सक्रिय करता है (अवधि के बाद स्थान पर ध्यान दें)। संस्करण 2.7 होस्टिंग द्वारा तय किया गया है और आपके मामले में भिन्न हो सकता है। इसलिए, होस्टिंग सहायता पढ़ें।

अगला Django स्थापित
SSH:
 pip install 'django<2' 

मैंने Django संस्करण को पहले की तुलना में दूसरे नंबर पर स्थापित नहीं किया है, क्योंकि होस्टिंग पर पायथन 2.7 का उपयोग किया जाता है, और केवल Django संस्करण इसके साथ 2 से कम काम करता है।

और VKontakte API के साथ काम करने के लिए अजगर मॉड्यूल स्थापित किया
SSH:
 pip install vk 


एफ़टीपी:
होस्टिंग पर रूट डायरेक्टरी में django-Projects के लिए एक फ़ोल्डर बनाया गया। वह उसे django बुलाया।

SSH:
एक नया प्रोजेक्ट बनाया।
 cd django/ django-admin.py startproject mybot 

परिणामस्वरूप, प्रोजेक्ट के नाम वाला एक फोल्डर बनाया जाएगा (हमारे मामले में यह "mybot") / dosango फ़ोल्डर में। इसमें स्वचालित रूप से बनाई गई प्रारंभिक परियोजना फाइलें शामिल होंगी:
/ django
/ mybot - प्रोजेक्ट फ़ोल्डर
/ mybot - हमारी परियोजना की सेटिंग के साथ मॉड्यूल
__init__.py
settings.py
urls.py
wsgi.py
manage.py

Django में एक परियोजना अनुप्रयोगों का एक समूह है। Django में एक एप्लिकेशन एक प्रोग्राम है जो डेवलपर द्वारा निर्धारित कार्यों को पूरा करता है।

SSH:
एक एप्लिकेशन बनाया गया।
 cd mybot python manage.py startapp vk_bot 

मैं / django / mybot फ़ोल्डर में गया और "vk_bot" नामक एक नया एप्लिकेशन बनाया।
एप्लिकेशन के नाम वाला एक फ़ोल्डर प्रोजेक्ट फ़ोल्डर में बनाया गया था, जिसमें स्वचालित रूप से बनाई गई एप्लिकेशन फाइलें थीं:

/ django
/ mybot - प्रोजेक्ट फ़ोल्डर
/ mybot - हमारी परियोजना की सेटिंग के साथ मॉड्यूल
__init__.py
settings.py
urls.py
wsgi.py
manage.py
/ vk_bot - एप्लिकेशन फ़ोल्डर
__init__.py
admin.py
apps.py
models.py
tests.py
views.py

एफ़टीपी:
मैंने कोड के साथ काम करने के लिए अपने लैपटॉप पर सभी परियोजना फाइलों को डाउनलोड किया।
प्रोजेक्ट फ़ाइलों और प्रोग्रामिंग के साथ काम करने के लिए, मैंने एटम एप्लिकेशन का उपयोग किया।

एटम:
फ़ाइल /django/mybot/mybot/settings.py में प्रोजेक्ट सेटिंग्स को संपादित किया
 ... DEBUG = False ... ALLOWED_HOSTS = [ u'mybot.mysite.ru', ] ... 

एटम:
फ़ाइल /django/mybot/mybot/urls.py में संपादित url रूटिंग सेटिंग्स
 ... urlpatterns = [ url(r'^vk_bot/', include('vk_bot.urls')), ] ... 

एफ़टीपी:
निम्न सामग्री के साथ एक फ़ाइल /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
 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.views.decorators.csrf import csrf_exempt from django.shortcuts import render from django.http import HttpResponse from bot_config import * # import token, confirmation_token and over constants from bot_config.py import json, vk # vk is library from VK """ Using VK Callback API version 5.5 For more ditalies visit https://vk.com/dev/callback_api """ """ From Django documentation (https://docs.djangoproject.com/en/1.11/ref/request-response/) When a page is requested, Django automatically creates an HttpRequest object that contains metadata about the request. Then Django loads the appropriate view, passing the HttpRequest as the first argument to the view function. This argiment is <request> in def index(request): Decorator <@csrf_exempt> marks a view as being exempt from the protection ensured by the Django middleware. For cross site request protection will be used secret key from VK """ @csrf_exempt #exempt index() function from built-in Django protection def index(request): #url: https://mybot.mysite.ru/vk_bot/ if (request.method == "POST"): data = json.loads(request.body)# take POST request from auto-generated variable <request.body> in json format if (data['secret'] == secret_key):# if json request contain secret key and it's equal my secret key if (data['type'] == 'confirmation'):# if VK server request confirmation """ For confirmation my server (webhook) it must return confirmation token, whitch issuing in administration web-panel your public group in vk.com. Using <content_type="text/plain"> in HttpResponse function allows you response only plain text, without any format symbols. Parametr <status=200> response to VK server as VK want. """ # confirmation_token from bot_config.py return HttpResponse(confirmation_token, content_type="text/plain", status=200) if (data['type'] == 'message_new'):# if VK server send a message session = vk.Session() api = vk.API(session, v=5.5) user_id = data['object']['user_id'] # token from bot_config.py api.messages.send(access_token = token, user_id = str(user_id), message = "Hello, I'm bot!") return HttpResponse('ok', content_type="text/plain", status=200) else: return HttpResponse('see you :)') 

विचार स्क्रिप्ट में, इंडेक्स (अनुरोध) फ़ंक्शन में, मुझे Django CSRF में निर्मित सुरक्षा को अक्षम करना पड़ा, क्योंकि मुझे "403 निषिद्ध" त्रुटि मिल रही थी। CSRF - क्रॉस साइट रिक्वेस्ट फोर्जरी प्रोटेक्शन - क्रॉस-साइट रिक्वेस्ट फर्जी के खिलाफ सुरक्षा। CSRF कैसे काम करता है आप इस लेख में पढ़ सकते हैं।
सुरक्षा को अक्षम करने के लिए, मैंने @csrf_exempt डेकोरेटर का उपयोग किया। लेकिन सभी को यह सुरक्षा प्रदान करने के लिए, लेकिन एक सरल तरीके से, मैंने एक गुप्त कुंजी का उपयोग किया, जो कि VKontakte वेबसाइट पर समूह प्रबंधन अनुभाग में पंजीकृत है।

कोड का यह टुकड़ा सर्वर से प्रसंस्करण अनुरोधों के लिए ज़िम्मेदार है जो यह हमारे वेबहूक को इवेंट प्रोसेसिंग के लिए कनेक्ट करने के लिए भेजेगा। आइए हमारे वेबहुक के "पुष्टि" को बस कहते हैं।
 if (data['type'] == 'confirmation'):# if VK server request confirmation """ For confirmation my server (webhook) it must return confirmation token, whitch issuing in administration web-panel your public group in vk.com. Using <content_type="text/plain"> in HttpResponse function allows you response only plain text, without any format symbols. Parametr <status=200> response to VK server as VK want. """ # confirmation_token from bot_config.py return HttpResponse(confirmation_token, content_type="text/plain", status=200) 

कृपया ध्यान दें कि मैं सभी कॉन्फ़िगरेशन सेटिंग्स को एक अलग बॉट कॉन्फ़िगरेशन फ़ाइल bot_config.py में रखता हूं और इसलिए इसे स्क्रिप्ट की शुरुआत में जोड़ता हूं :
 from bot_config import * # import token, confirmation_token and over constants from bot_config.py 

bot_config.py
 # -*- coding: utf-8 -*- """ Configuration file for VK bot """ # token issued on the VK group web-administration page token = '...' # confirmation token issued on the VK group web-administration page in "Callback API" section confirmation_token = '...' # secret key for cross site request forgery protection. It will be in each VK server request secret_key = '...' 

और कोड के इस टुकड़े में यह उपयोगकर्ता संदेशों को संसाधित करता है:
 if (data['type'] == 'message_new'):# if VK server send a message session = vk.Session() api = vk.API(session, v=5.5) user_id = data['object']['user_id'] # token from bot_config.py api.messages.send(access_token = token, user_id = str(user_id), message = "Hello, I'm bot!") return HttpResponse('ok', content_type="text/plain", status=200) 

अगर कुछ समझ में नहीं आ रहा है, तो आप पहले Django सेटअप के बारे में लेख पढ़ सकते हैं।

वेब सर्वर के लिए जादू । वेब सर्वर के लिए अनुरोधों के पते को कॉन्फ़िगर करने के लिए, मैं एफ़टीपी क्लाइंट फ़ाइलज़िला के माध्यम से डोमेन के साथ फ़ोल्डर में सर्वर पर गया और वहां " 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
    

"Bind" हमारे Webhook को बनाए गए VKontakte समूह में संदेश प्रसंस्करण के लिए।
ऐसा करने के लिए, हम VKontakte वेबसाइट (ऊपर स्क्रीनशॉट देखें) पर अपने समूह के प्रबंधन के लिए अनुभाग पर लौट आएंगे। हम "पता" फ़ील्ड में अपना वेबहूक पता दर्ज करेंगे
  https://mybot.mysite.ru/vk_bot/ 
और "पुष्टि" बटन पर क्लिक करें। यदि हमारी इंडेक्स (रिक्वेस्ट) फ़ंक्शन, /django/mybot/vk_bot/views.py फ़ाइल में लिखी गई है, तो सही तरीके से काम करती है, अर्थात इसमें टाइपोस और त्रुटियाँ नहीं हैं, एक हरे रंग का चेकमार्क दिखाई देगा, जो यह दर्शाता है कि सब कुछ ठीक है।

VKontakte वेबसाइट पर हमारे समूह को प्रबंधित करने के लिए, "इवेंट प्रकार" टैब में, "आने वाले संदेशों" बॉक्स की जाँच करें के लिए अनुभाग में VKontakte सर्वर से संदेश प्राप्त करने के लिए हमारे webhook के लिए।

परिणामस्वरूप, हमारी स्क्रिप्ट को ये संदेश 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 संदेश में एक "गुप्त" फ़ील्ड है। यह वही गुप्त कुंजी है जिसे मैंने Django CSRF में निर्मित सुरक्षा के बजाय VKontakte वेबसाइट के समूह प्रबंधन अनुभाग में पंजीकृत किया था, जिसे मुझे अक्षम करना था।

बॉट को स्मार्ट और बेहतर कैसे बनाया जाए?


आप उपयोगकर्ता के उत्तर के साथ एक डेटाबेस बना सकते हैं और उपयोगकर्ता के प्रश्न के अर्थ में निकटतम उत्तर को चुनने के लिए बॉट को सिखा सकते हैं। मैं इस बारे में एक अलग लेख में बात करूंगा।
वार्तालाप को बनाए रखने के लिए, उपयोगकर्ता इंटरैक्शन परिदृश्यों को प्रोग्राम करना संभव है, इसलिए बोलना आवश्यक है।

आपके रचनात्मक कार्यों में शुभकामनाएँ!

Source: https://habr.com/ru/post/hi429628/


All Articles