效果展示
实现步骤
1.在网页机器人web页面抓取请求的必要参数
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电脑上都能打开啦