【Python简易问答机器人】

效果展示

实现步骤

1.在网页机器人web页面抓取请求的必要参数

        网址:http://nlp.xiaoi.com/

2.调用接口,获取问题回答结果

        使用requests调用接口,并对接口响应内容的“content”做了筛取

def robot_answers(question):
    """
    调用小i机器人接口,返回问题回答结果
    :param question: 问题
    :return:
    """
    try:
        # 小i机器人URL地址
        url = "http://nlp.xiaoi.com/robot/webrobot?"
        # 请求头
        headers = {
            'Connection': 'keep-alive ',
            'Accept-Encoding': 'gzip, deflate',
            'Accept': "*/*",
        }
        # 请求参数
        params = {
            "callback": "__webrobot_processMsg",
            "data": {
                "sessionId": "450a4cfaad194fc4be814166f4b8f22a",
                "robotId": "webbot",
                "userId": "001e6be7b3d04c8ca895d38fae23b37b",
                "body": {
                    "content": question
                },
                "type": "txt"
            }
        }
        # 发送请求
        res = requests.request(method="get", url=url, params=parse.urlencode(params), headers=headers)
        res_text = res.text
        # 筛选回答内容
        answer = re.findall(r'\"content\":\"(.+?)\\r\\n\"', res_text)[-1]
        bad_str = ['', '"']
        new_answer = [val for i, val in enumerate(re.split(r'[\\n\\r\\"]', answer.strip())) if val not in bad_str]
        return new_answer
    except Exception as err:
        info = f"出了点小问题!\n{repr(err)}\n{traceback.format_exc()}"
        return info


if __name__ == "__main__":
    print(robot_answers("讲个笑话"))

        运行结果:

 3.使用ttkbootstrap库编写GUI界面
from common.path_handle import icon_path
import ttkbootstrap as ttk


class SharkCoinRobot:

    def __init__(self, master):
        """SharkCoinRobot GUI"""
        self.text1 = None
        self.qe = None
        self.mf = None
        self.root = master
        self.question = ttk.StringVar()  # 生成一个StringVar对象,来保存问题输入框中的内容
        self.create_page()

    def create_page(self):
        """创建页面元素"""

        # 主控件
        self.mf = ttk.Frame(self.root)
        self.mf.pack()

        # 标题标签
        fontstyle = ttk.font.Font(size=22, weight="bold")
        ttk.Label(self.mf, text="标题", font=fontstyle, bootstyle="primary").pack(padx=20, pady=2)

        # 问题标签控件
        lf1 = ttk.LabelFrame(self.mf, text="问题:", bootstyle="success")
        lf1.pack(pady=10)
        # 问题输入框
        self.qe = ttk.Entry(lf1, textvariable=self.question, width=80, bootstyle="success")
        self.qe.pack(padx=2, pady=10, fill="both")
        # 问题提交按钮
        ttk.Button(lf1, text="发送", bootstyle="success", command=self.ask_task).pack(padx=50, pady=5)

        # 回答标签控件
        lf2 = ttk.LabelFrame(self.mf, text="回答:", bootstyle="primary")
        lf2.pack()
        # 回答显示text文本框
        self.text1 = ttk.Text(lf2, wrap=ttk.WORD)
        self.text1.pack(fill="both")

    def ask_task(self):
        """提交问题,获取答案"""
        pass


if __name__ == "__main__":
    root = ttk.Window(
        title="SCR",  # 窗口标题
        themename="cyborg"  # 主题
    )
    root.place_window_center()  # 窗口居中(问题:窗口左上角坐标居中?)
    root.iconbitmap(icon_path)  # 更改GUI图标
    SharkCoinRobot(root)  # 展示GUI界面
    root.mainloop()  # 进入消息循环(必需)

         运行结果:

 4.封装并完善,形成完整代码

        完善ask_task(),提交问题后将回答内容插入到文本框中;并将robot_answers()方法封装到SharkCoinRobot类中

import random
import re
import traceback
from tkinter import DISABLED, NORMAL
from urllib import parse
import requests
from common.path_handle import icon_path
import ttkbootstrap as ttk
from ttkbootstrap.dialogs import Messagebox


class SharkCoinRobot:

    def __init__(self, master):
        """SharkCoinRobot GUI"""
        self.text1 = None
        self.qe = None
        self.mf = None
        self.root = master
        self.question = ttk.StringVar()  # 生成一个StringVar对象,来保存问题输入框中的内容
        self.create_page()

    def create_page(self):
        """创建页面元素"""

        # 主控件
        self.mf = ttk.Frame(self.root)
        self.mf.pack()

        # 标题标签
        fontstyle = ttk.font.Font(size=22, weight="bold")
        ttk.Label(self.mf, text="鲨币机器人", font=fontstyle, bootstyle="primary").pack(padx=20, pady=2)

        # 问题标签控件
        lf1 = ttk.LabelFrame(self.mf, text="问题写这头:", bootstyle="success")
        lf1.pack(pady=10)
        # 问题输入框
        self.qe = ttk.Entry(lf1, textvariable=self.question, width=80, bootstyle="success")
        self.qe.pack(padx=2, pady=10, fill="both")
        # 问题提交按钮
        ttk.Button(lf1, text="50一次", bootstyle="success", command=self.ask_task).pack(padx=50, pady=5)

        # 回答标签控件
        lf2 = ttk.LabelFrame(self.mf, text="回答看这哈:", bootstyle="primary")
        lf2.pack()
        # 回答显示text文本框
        self.text1 = ttk.Text(lf2, wrap=ttk.WORD)
        self.text1.config(state=DISABLED)  # 默认text文本框不可编辑
        self.text1.pack(fill="both")

    def ask_task(self):
        """提交问题,获取答案"""
        # 获取问题输入框的内容
        question = self.question.get()
        if question == "":  # 若问题输入框内容为空,则提示
            Messagebox.show_info(title="你被肉三杀死了!", message="还想空手套白狼?")
        else:  # 若不为空,则提交问题并展示回答内容
            # 清空问题输入框
            self.question.set("")
            # 设置文本框可编辑
            self.text1.config(state=NORMAL)

            # 向text文本框中插入问题和表情符号
            self.text1.insert('end', f"\U0001f4ac {question}")
            # 向text文本框中插入换行符
            self.text1.insert("end", "\n")
            # 获取问题回答内容
            answer = self.robot_answers(question)
            # 生成随机表情符号
            emoji = self.random_emoji()
            # 向text文本框中插入表情符号
            self.text1.insert("end", f"{emoji} ")
            # 向text文本框中插入回答内容和换行符
            for i, v in enumerate(answer):
                self.text1.insert("end", v)
                self.text1.insert("end", "\n")
            # 向text文本框中插入换行符
            self.text1.insert("end", "\n")
            # 设置文本框内容超出显示范围时自动滚动到底部
            self.text1.see(ttk.END)

            # 设置文本框不可编辑
            self.text1.config(state=DISABLED)

    @staticmethod
    def robot_answers(question):
        """
        调用小i机器人接口,返回问题回答结果
        :param question: 问题
        :return:
        """
        try:
            # 小i机器人URL地址
            url = "http://nlp.xiaoi.com/robot/webrobot?"
            # 请求头
            headers = {
                'Connection': 'keep-alive ',
                'Accept-Encoding': 'gzip, deflate',
                'Accept': "*/*",
            }
            # 请求参数
            params = {
                "callback": "__webrobot_processMsg",
                "data": {
                    "sessionId": "450a4cfaad194fc4be814166f4b8f22a",
                    "robotId": "webbot",
                    "userId": "001e6be7b3d04c8ca895d38fae23b37b",
                    "body": {
                        "content": question
                    },
                    "type": "txt"
                }
            }
            # 发送请求
            res = requests.request(method="get", url=url, params=parse.urlencode(params), headers=headers)
            res_text = res.text
            # 筛选回答内容
            answer = re.findall(r'\"content\":\"(.+?)\\r\\n\"', res_text)[-1]
            bad_str = ['', '"']
            new_answer = [val for i, val in enumerate(re.split(r'[\\n\\r\\"]', answer.strip())) if val not in bad_str]
            return new_answer
        except Exception as err:
            info = f"出了点小问题!\n{repr(err)}\n{traceback.format_exc()}"
            print(info)
            return ["AR生病了,需要50块看医生!"]

    @staticmethod
    def random_emoji():
        emoji_list = ["\U0001f40c", "\U0001f40d", "\U0001f40e", "\U0001f40d", "\U0001f411", "\U0001f412", "\U0001f414"]
        return "".join(random.sample(emoji_list, 1))


if __name__ == "__main__":
    root = ttk.Window(
        title="SCR",  # 窗口标题
        themename="cyborg"  # 主题
    )
    root.place_window_center()  # 窗口居中(问题:窗口左上角坐标居中?)
    root.iconbitmap(icon_path)  # 更改GUI图标
    SharkCoinRobot(root)  # 展示GUI界面
    root.mainloop()  # 进入消息循环(必需)
5. pyinstaller将程序打包为可执行的exe文件(参考文章

        这样在任意一台windows电脑上都能打开啦

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值