校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Django實現聊天機器人

Django實現聊天機器人

熱門標簽:市場上的電銷機器人 地圖標注面積 小蘇云呼電話機器人 北瀚ai電銷機器人官網手機版 北京電銷外呼系統加盟 所得系統電梯怎樣主板設置外呼 儋州電話機器人 朝陽手機外呼系統 佛山400電話辦理

演示效果如下所示:

實現原理

用戶在聊天界面調用Celery異步任務,Celery異步任務執行完畢后發送結果給channels,然后channels通過websocket將結果實時推送給用戶。對于簡單的算術運算,Celery一般自行計算就好了。對于網上查找詩人簡介這樣的任務,Celery會調用Python爬蟲(requests+parsel)爬取古詩文網站上的詩人簡介,把爬取結果實時返回給用戶。

接下來我們來看下具體的代碼實現吧。

第一步 安裝環境依賴

首先在虛擬環境中安裝django和以下主要項目依賴。本項目使用了最新版本,為3.X版本。

 # 主要項目依賴
 pip install django
 pip install channels
 pip install channels_redis
 pip install celery
 pip install redis
 pip install eventlet # windows only

 # 爬蟲依賴
 pip install requests
 pip install parsel

 新建一個名為myproject的項目,新建一個app名為bots。如果windows下安裝報錯,如何解決自己網上去找吧,很容易解決。修改settings.py, 將channels和chat加入到INSTALLED_APPS里,并添加相應配置,如下所示:

 INSTALLED_APPS = [
       'django.contrib.admin',
       'django.contrib.auth',
       'django.contrib.contenttypes',
       'django.contrib.sessions',
       'django.contrib.messages',
       'django.contrib.staticfiles',
       'channels', # channels應用     
       'bots', # bots應用
    ]

 # 設置ASGI應用
 ASGI_APPLICATION = 'myproject.asgi.application'

# 生產環境中使用redis做后臺,安裝channels_redis
import os
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [os.environ.get('REDIS_URL', 'redis://127.0.0.1:6379/2')],
        },
    },
}

最后將bots應用的urls.py加入到項目urls.py中去,這和常規Django項目無異。

 # myproject/urls.py
 from django.conf.urls import include
 from django.urls import path
 from django.contrib import admin
 
 urlpatterns = [
     path('bots/', include('bots.urls')),
     path('admin/', admin.site.urls),
 ]

第二步 配置Celery

pip安裝好Celery和redis后,我們要對其進行配置。分別修改myproject目錄下的__init__.py和celery.py(新建), 添加如下代碼:

# __init__.py
from .celery import app as celery_app
__all__ = ('celery_app',)

# celery.py
import os
from celery import Celery

# 設置環境變量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
# 實例化
app = Celery('myproject')

# namespace='CELERY'作用是允許你在Django配置文件中對Celery進行配置
# 但所有Celery配置項必須以CELERY開頭,防止沖突
app.config_from_object('django.conf:settings', namespace='CELERY')

# 自動從Django的已注冊app中發現任務
app.autodiscover_tasks()

# 一個測試任務
@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

接著修改settings.py, 增加如下Celery配置:

# Celery配置
CELERY_BROKER_URL = "redis://127.0.0.1:6379/0"
CELERY_TIMEZONE = TIME_ZONE

# celery內容等消息的格式設置,默認json
CELERY_ACCEPT_CONTENT = ['application/json', ]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

完整Celery配置見:Django進階:萬字長文教你使用Celery執行異步和周期性任務(多圖)

第三步 編寫機器人聊天主頁面

本例我們只需要利用django普通視圖函數編寫1個頁面,用于展示首頁(index)與用戶交互的聊天頁面。這個頁面對應的路由及視圖函數如下所示:

 # bots/urls.py
 from django.urls import path
 from . import views
 
 urlpatterns = [
     path('', views.index, name='index'),
 ]
 
 # bots/views.py
 from django.shortcuts import render
 
 def index(request):
     return render(request, 'bots/index.html', {})

接下來我們編寫模板文件index.html,它的路徑位置如下所示:

 bots/
     __init__.py
     templates/
         bots/
             index.html
     urls.py
     views.py

index.html內容如下所示。

!DOCTYPE html>
html>
head>
    meta charset="utf-8"/>
    title>Django+Channels+Celery聊天機器人/title>
/head>
body>

textarea id="chat-log" cols="100" rows="20" readonly>/textarea>
br/>
input id="chat-message-input" type="text" size="100" 
      placeholder="輸入`help`獲取幫助信息."/>br/>input id="chat-message-submit" type="button" value="Send"/>
   script>
    var wss_protocol = (window.location.protocol == 'https:') ? 'wss://': 'ws://';
    var chatSocket = new WebSocket(
        wss_protocol + window.location.host + '/ws/bots/'
        );

    chatSocket.onopen = function(e) {
document.querySelector('#chat-log').value +=
('歡迎來到大江狗Django聊天機器人. 請輸入`help`獲取幫助信息.\n')}

    chatSocket.onmessage = function(e) {
        var data = JSON.parse(e.data);
        var message = data['message'];
        document.querySelector('#chat-log').value += (message + '\n');
    };

    chatSocket.onclose = function(e) {
document.querySelector('#chat-log').value +=
('Socket closed unexpectedly, please reload the page.\n')};

    document.querySelector('#chat-message-input').focus();
    document.querySelector('#chat-message-input').onkeyup = function(e) {
        if (e.keyCode === 13) {  // enter, return
            document.querySelector('#chat-message-submit').click();
        }
    };

    document.querySelector('#chat-message-submit').onclick = function(e) {
        var messageInputDom = document.querySelector('#chat-message-input');
        var message = messageInputDom.value;
        chatSocket.send(JSON.stringify({
            'message': message
        }));
     messageInputDom.value = '';
    };
/script>

/body>
/html>

第四步 編寫后臺websocket路由及處理方法

當 channels 接受 WebSocket 連接時, 它也會根據根路由配置去查找相應的處理方法。只不過channels的websocket路由不在urls.py中配置,處理函數也不寫在views.py。在channels中,這兩個文件分別變成了routing.py和consumers.py。

在bots應用下新建routing.py, 添加如下代碼。它的作用是將發送至ws/bots/的websocket請求轉由BotConsumer處理。

from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
    re_path(r'ws/bots/$', consumers.BotConsumer.as_asgi()),
]

注意:定義websocket路由時,推薦使用常見的路徑前綴 (如/ws) 來區分 WebSocket 連接與普通 HTTP 連接, 因為它將使生產環境中部署 Channels 更容易,比如nginx把所有/ws的請求轉給channels處理。

與Django類似,我們還需要把這個app的websocket路由加入到項目的根路由中去。編輯myproject/asgi.py, 添加如下代碼:

# myproject/asgi.py
import os

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
import chat.routing
import bots.routing

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    # websocket請求使用的路由
    "websocket": AuthMiddlewareStack(
        URLRouter(
            bots.routing.websocket_urlpatterns
        )
    )
})

接下來在bots應用下新建consumers.py, 添加如下代碼:

import json
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer

from . import tasks

COMMANDS = {
    'help': {
        'help': '命令幫助信息.',
    },
    'add': {
        'args': 2,
        'help': '計算兩個數之和, 例子: `add 12 32`.',
        'task': 'add'
    },
    'search': {
        'args': 1,
        'help': '通過名字查找詩人介紹,例子: `search 李白`.',
        'task': 'search'
    },
}



class BotConsumer(WebsocketConsumer):
    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        response_message = '請輸入`help`獲取命令幫助信息。'
        message_parts = message.split()
        if message_parts:
            command = message_parts[0].lower()
            if command == 'help':
                response_message = '支持的命令有:\n' + '\n'.join(
                    [f'{command} - {params["help"]} ' for command, params in COMMANDS.items()])
            elif command in COMMANDS:
                if len(message_parts[1:]) != COMMANDS[command]['args']:
                    response_message = f'命令`{command}`參數錯誤,請重新輸入.'
                else:
                    getattr(tasks, COMMANDS[command]['task']).delay(self.channel_name, *message_parts[1:])
                    response_message = f'收到`{message}`任務.'
                    
        async_to_sync(self.channel_layer.send)(
            self.channel_name,
            {
                'type': 'chat.message',
                'message': response_message
            }
        )

    def chat_message(self, event):
        message = event['message']

        # Send message to WebSocket
        self.send(text_data=json.dumps({
            'message': f'[機器人]: {message}'
        }))

上面代碼中最重要的一行如下所示。BotConsumer在接收到路由轉發的前端消息后,對其解析,將當前頻道名和解析后的參數一起交由Celery異步執行。Celery執行任務完成以后會將結果發到這個頻道,這樣就實現了channels和Celery的通信。

getattr(tasks, COMMANDS[command]['task']).delay(self.channel_name, *message_parts[1:])

第五步 編寫Celery異步任務

在bots目錄下新建`tasks.py`,添加如下代碼:

from asgiref.sync import async_to_sync
from celery import shared_task
from channels.layers import get_channel_layer
from parsel import Selector
import requests

channel_layer = get_channel_layer()

@shared_task
def add(channel_name, x, y):
    message = '{}+{}={}'.format(x, y, int(x) + int(y))
    async_to_sync(channel_layer.send)(channel_name, {"type": "chat.message", "message": message})
    print(message)

@shared_task
def search(channel_name, name):
    spider = PoemSpider(name)
    result = spider.parse_page()
    async_to_sync(channel_layer.send)(channel_name, {"type": "chat.message", "message": str(result)})
    print(result)

class PoemSpider(object):
    def __init__(self, keyword):
        self.keyword = keyword
        self.url = "https://so.gushiwen.cn/search.aspx"
        
    def parse_page(self):
        params = {'value': self.keyword}
        response = requests.get(self.url, params=params)
        if response.status_code == 200:
            # 創建Selector類實例
            selector = Selector(response.text)
            # 采用xpath選擇器提取詩人介紹
            intro = selector.xpath('//textarea[starts-with(@id,"txtareAuthor")]/text()').get()
            print("{}介紹:{}".format(self.keyword, intro))
            if intro:
                return intro

        print("請求失敗 status:{}".format(response.status_code))
        return "未找到詩人介紹。"

以上兩個任務都以channel_name為參數,任務執行完畢后通過channel_layer的send方法將結果發送到指定頻道。

注意:

- 默認獲取channel_layer的方式是調用接口:channels.layers.get_channel_layer()。如果是在consumer中調用接口的話可以直接使用self.channel_layer。

- 對于channel layer的方法(包括send()、group_send(),group_add()等)都屬于異步方法,這意味著在調用的時候都需要使用await,而如果想要在同步代碼中使用它們,就需要使用裝飾器asgiref.sync.async_to_sync

第六步 運行看效果

如果不出意外,你現在的項目布局應該如下所示。說實話,整個項目一共沒幾個文件,Python的簡潔和效率真是出了名的好啊。

連續運行如下命令,就可以看到我們文初的效果啦。

 # 啟動django測試服務器
 python manage.py makemigrations
 python manage.py migrate
 python manage.py runserver
 
 # windows下啟動Celery需eventlet
 # 啟動Celery前確定redis服務已開啟哦
 Celery -A myproject worker -l info -P eventlet

小結

本文我們使用Django + Channels + Celery + Redis打造了一個聊天機器人,既會算算術,還會查古詩文。借用這個實現原理,你可以打造非常有趣的實時聊天應用哦,比如在線即時問答,在線客服,實時查詢訂單,Django版的siri美女等等。

Django Channels + Websocket + Celery聊天機器人項目源碼地址:https://github.com/shiyunbo/django-channels-chatbot

以上就是Django實現聊天機器人的詳細內容,更多關于Django 聊天機器人的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Python實戰整活之聊天機器人
  • Python如何實現機器人聊天
  • vue.js實現h5機器人聊天(測試版)
  • python操作微信自動發消息的實現(微信聊天機器人)
  • Python使用20行代碼實現微信聊天機器人
  • jquery實現聊天機器人
  • 基于python的itchat庫實現微信聊天機器人(推薦)
  • nodejs實現聊天機器人功能
  • Python QQBot庫的QQ聊天機器人
  • 使用python接入微信聊天機器人
  • python微信聊天機器人改進版(定時或觸發抓取天氣預報、勵志語錄等,向好友推送)

標簽:定西 酒泉 江蘇 龍巖 寧夏 商丘 金融催收 云南

巨人網絡通訊聲明:本文標題《Django實現聊天機器人》,本文關鍵詞  Django,實現,聊天,機器人,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Django實現聊天機器人》相關的同類信息!
  • 本頁收集關于Django實現聊天機器人的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产高清在线观看免费不卡| 午夜欧美一区二区三区在线播放| 国产精品嫩草99a| 亚洲伊人伊色伊影伊综合网| 国产露脸91国语对白| 欧美日韩精品一区二区三区蜜桃| 国产日韩欧美在线一区| 五月婷婷久久综合| 日本国产一区二区| 欧美高清在线一区二区| 精品一区二区三区免费视频| 色先锋资源久久综合| 国产日韩欧美精品在线| 麻豆精品视频在线| 欧美日韩成人一区| 一区二区在线观看免费视频播放| 福利电影一区二区三区| 精品久久久久久亚洲综合网| 日韩av在线播放中文字幕| 日本丶国产丶欧美色综合| 国产精品久久久久久久久免费丝袜| 日韩福利视频网| 欧美人牲a欧美精品| 亚洲h动漫在线| 欧美午夜精品久久久久久超碰| 国产精品福利一区| 不卡的电影网站| 国产色综合一区| 丁香一区二区三区| 欧美国产乱子伦| 成人亚洲一区二区一| 欧美国产精品专区| 99久久国产综合精品麻豆| 国产精品毛片无遮挡高清| 9l国产精品久久久久麻豆| 亚洲欧美在线视频观看| 99在线精品视频| 亚洲另类中文字| 欧美伊人久久大香线蕉综合69| 有坂深雪av一区二区精品| 欧美色视频在线观看| 日韩va亚洲va欧美va久久| 日韩区在线观看| 国产精品自在欧美一区| 国产精品久久久久久久久免费樱桃| 99精品欧美一区二区三区综合在线| 综合久久久久久久| 欧美日韩小视频| 免费观看30秒视频久久| 国产亚洲一区二区三区| 不卡影院免费观看| 午夜欧美电影在线观看| 精品少妇一区二区三区免费观看| 国产乱子轮精品视频| 最好看的中文字幕久久| 在线看国产一区| 九九国产精品视频| 亚洲视频一区二区在线观看| 欧美日本高清视频在线观看| 国内精品国产三级国产a久久| 中文字幕免费不卡在线| 欧美日韩三级视频| 国产成人av电影免费在线观看| 亚洲精品你懂的| 日韩午夜激情视频| 91精品1区2区| 国内不卡的二区三区中文字幕| 中文字幕在线一区二区三区| 911精品产国品一二三产区 | 91精品国产乱码| 成人一道本在线| 免费一级片91| 亚洲美女免费视频| 26uuu国产日韩综合| 色婷婷av一区二区三区软件| 久久99精品国产麻豆婷婷洗澡| 综合在线观看色| 久久蜜臀精品av| 欧美老肥妇做.爰bbww视频| 国产成人av电影在线| 日韩精品电影在线观看| 中文字幕一区二区视频| 欧美精品一区二区三区高清aⅴ | 欧美国产一区视频在线观看| 欧美日韩一区二区三区在线| 精品午夜一区二区三区在线观看| 亚洲综合丁香婷婷六月香| 久久亚洲春色中文字幕久久久| 欧美三级视频在线播放| 99re这里都是精品| 国产a久久麻豆| 国产一区福利在线| 捆绑调教美女网站视频一区| 亚洲午夜精品网| 亚洲青青青在线视频| 国产女人aaa级久久久级| 精品国产乱码91久久久久久网站| 欧美日韩精品免费观看视频| 91蜜桃传媒精品久久久一区二区| 粉嫩aⅴ一区二区三区四区五区| 国产最新精品精品你懂的| 午夜久久久久久久久| 亚洲欧美日韩电影| 尤物视频一区二区| 亚洲一区日韩精品中文字幕| 中文字幕亚洲一区二区av在线| 国产精品美女久久久久久久久| 欧美国产乱子伦| 国产精品理伦片| 久久精品视频免费| 久久精品亚洲一区二区三区浴池| 欧美成人欧美edvon| 久久综合给合久久狠狠狠97色69| 日韩一区二区三| 精品区一区二区| 国产欧美一区二区在线观看| 久久夜色精品一区| 久久精品欧美日韩| 日本一区二区成人| 亚洲欧美日韩中文播放| 一区二区在线观看免费| 亚洲在线视频一区| 亚洲成人手机在线| 久久精品国产网站| 国产综合久久久久久鬼色 | 国产精品色噜噜| 自拍偷拍亚洲欧美日韩| 亚洲制服丝袜在线| 免费成人结看片| 国产成人av电影在线播放| 不卡视频在线看| 欧美日韩一区二区欧美激情| 69av一区二区三区| 欧美精品一区二区在线观看| 中文字幕精品—区二区四季| 亚洲精品久久久蜜桃| 水蜜桃久久夜色精品一区的特点| 久久激情五月婷婷| 成人性生交大片免费| 欧美色图在线观看| 久久久久久久久伊人| 亚洲三级在线免费观看| 三级在线观看一区二区| 国产乱码字幕精品高清av | 久久天天做天天爱综合色| 国产精品乱码一区二三区小蝌蚪| 一区二区三区在线影院| 激情五月婷婷综合网| 91麻豆国产在线观看| 欧美一个色资源| 亚洲色图另类专区| 国内精品免费**视频| 欧美在线影院一区二区| 欧美精品一区二区高清在线观看| 亚洲人精品午夜| 国产乱国产乱300精品| 欧美日产在线观看| 中文字幕中文字幕在线一区 | 麻豆成人综合网| 91在线观看视频| 精品国产网站在线观看| 伊人一区二区三区| 国产福利不卡视频| 日韩视频国产视频| 亚洲图片欧美色图| 粉嫩久久99精品久久久久久夜| 欧美精品aⅴ在线视频| 亚洲天堂精品视频| 风间由美性色一区二区三区| 在线观看91精品国产麻豆| 亚洲日本成人在线观看| 国产精品123区| 精品处破学生在线二十三| 午夜一区二区三区视频| 色综合色狠狠天天综合色| 国产精品系列在线| 韩国视频一区二区| 91精品国产黑色紧身裤美女| 亚洲女同ⅹxx女同tv| 国产成人精品aa毛片| 2014亚洲片线观看视频免费| 偷拍一区二区三区四区| 欧美在线观看一区| 最新国产精品久久精品| 成人一级视频在线观看| 久久久久9999亚洲精品| 激情久久五月天| 欧美xingq一区二区| 免费成人结看片| 日韩一区二区三区观看| 日韩成人伦理电影在线观看| 欧美色图片你懂的| 亚洲第一二三四区| 欧美系列日韩一区| 亚洲午夜电影在线| 欧美日韩久久久一区| 香蕉成人啪国产精品视频综合网 | 天堂久久久久va久久久久| 欧美人牲a欧美精品| 丝袜美腿一区二区三区|