吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4090|回复: 27
收起左侧

[Python 原创] 使用百度UNIT给孩子做一个有界面的闲聊机器人

  [复制链接]
xhtdtk 发表于 2022-7-12 23:43
本帖最后由 xhtdtk 于 2022-7-13 12:40 编辑

为什么我想做这个
————————————————
现在作为一个机器人老师,在暑期课程的时候想给孩子们领略一下AI的魅力,于是用百度UNIT做了一个聊天机器人。


效果图

————————————————
微信图片编辑_20220712204146.jpg



实现的界面功能

————————————————
1、添加滚动条跟随显示最新消息
2、绑定组合键ctrl+enter发送消息
3、弄两个小头像




申请闲聊机器人流程

————————————————
1、有自己的百度账号

2、打开百度UNIT后,选择“云端版”的“免费试用”,然后填写身份信息,手机验证

2.png

3、大概看一下新手教程,然后添加自己的机器人

3.png


4、取名字,对话流程控制选择第一个

28.png

5、进入刚刚创建的机器人,选择“技能管理”,选择“添加技能”

5.png

6、在弹出的页面那里选择“技能管理页”

6.png

7、选择“添加预设技能”

7.png

8、找到“闲聊”后,选择“添加预设技能”,也有很多别的技能可以选择

8.png

9、返回刚刚弹出的页面,选择技能,添加到机器人

9.png

10、可以进行测试了

10.png

11.png

11、先查看”API接口3.0“,然后再获取API的AK和SK(等会获取access_token用)

12.png

12、获取Python代码示例

13.png

[Python] 纯文本查看 复制代码
# encoding:utf-8
import requests

access_token = '#####调用鉴权接口获取的token#####'
url = 'https://aip.baidubce.com/rpc/2.0/unit/service/v3/chat?access_token=' + access_token
post_data = "{"version":"3.0","service_id":"S10000","session_id":"","log_id":"7758521","request":{"terminal_id":"88888","query":"你好"}}"
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(url, data=post_data, headers=headers)
if response:
    print (response.json())

代码写的不够漂亮对不对,而且文字要转化为UTF8编码,使用他的代码会报错,建议使用我的代码
[Asm] 纯文本查看 复制代码
# encoding:utf-8
import requests
import json
access_token = '#####调用鉴权接口获取的token#####'
url = 'https://aip.baidubce.com/rpc/2.0/unit/service/v3/chat?access_token=' + access_token
post_data = {
        "version":"3.0",
        "service_id":"不是技能ID,是你的机器人ID",
        "session_id":"",
        "log_id":"日志ID随便填字母+数字",
        "request":{
                "terminal_id":"UNIT_DEV_+后缀随便填",
                "query":”聊天内容,比如你好“,
        }
}
post_data = json.dumps(post_data)
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(url, data=post_data, headers=headers)
lst=[]
if response:
        for eachRes in response.json()['result']['responses']:
                for eachActions in eachRes['actions']:
                        lst.append(eachActions['say'])
print(lst)


18.png

13、获取API的AK和SK(获取access_token用)

14.png

14、找到获取access_token的示例代码,获取access_token

15.png

16.png

[Python] 纯文本查看 复制代码
# encoding:utf-8
import requests 

# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
response = requests.get(host)
if response:
    print(response.json())


17.png

15、尝试一下

19.png
这是我自己设置的干预规则,讲完界面后我再说一下怎么设置{:17_1068:}


界面设置流程

————————————————
1、设置界面大小,界面名称
[Python] 纯文本查看 复制代码
from tkinter import *

top=Tk()
top.title('闲聊机器人')
top.geometry('800x600')

top.mainloop()

20.png

2、添加静态图片

[Python] 纯文本查看 复制代码
from tkinter import *
from PIL import Image, ImageTk

top=Tk()
top.title('闲聊机器人')
top.geometry('800x600')

img1=ImageTk.PhotoImage(file='xxxxxxx.png')#建议写绝对路径,图片像素我是宽230x高255
label_img1=Label(top,image=img1)
label_img1.place(x=543,y=10)
img2=ImageTk.PhotoImage(file='xxxxxxx.png')#建议写绝对路径,图片像素我是宽230x高255
label_img2=Label(top,image=img2)
label_img2.place(x=543,y=277)

top.mainloop()

21.png

3、设置聊天框(Listbox)和滚动条(Scrollbar),因为滚动条可以帮助我们跟随最新消息

[Python] 纯文本查看 复制代码
from tkinter import *
from PIL import Image, ImageTk

top=Tk()
top.title('闲聊机器人')
top.geometry('800x600')

img1=ImageTk.PhotoImage(file='xxxxxxx.png')#建议写绝对路径,图片像素我是宽230x高255
label_img1=Label(top,image=img1)
label_img1.place(x=543,y=10)
img2=ImageTk.PhotoImage(file='xxxxxxx.png')#建议写绝对路径,图片像素我是宽230x高255
label_img2=Label(top,image=img2)
label_img2.place(x=543,y=277)

sb=Scrollbar(top)
sb.pack(side=RIGHT,fill=Y)

chatBox=Listbox(top,width=75,height=20,selectmode=EXTENDED,yscrollcommand=sb.set)
chatBox.place(x=10,y=10)
sb.config(command=chatBox.yview)

top.mainloop()

22.png

4、设置消息框(Text)

[Python] 纯文本查看 复制代码
from tkinter import *
from PIL import Image, ImageTk

top=Tk()
top.title('闲聊机器人')
top.geometry('800x600')

img1=ImageTk.PhotoImage(file='xxxxxxx.png')#建议写绝对路径,图片像素我是宽230x高255
label_img1=Label(top,image=img1)
label_img1.place(x=543,y=10)
img2=ImageTk.PhotoImage(file='xxxxxxx.png')#建议写绝对路径,图片像素我是宽230x高255
label_img2=Label(top,image=img2)
label_img2.place(x=543,y=277)

sb=Scrollbar(top)
sb.pack(side=RIGHT,fill=Y)

chatBox=Listbox(top,width=75,height=20,selectmode=EXTENDED,yscrollcommand=sb.set)
chatBox.place(x=10,y=10)
sb.config(command=chatBox.yview)

postBox=Text(top,width=75,height=10,wrap=WORD)
postBox.place(x=10,y=400)

top.mainloop()

23.png

5、设置发送按钮(Button)

[Python] 纯文本查看 复制代码
from tkinter import *
from PIL import Image, ImageTk

top=Tk()
top.title('闲聊机器人')
top.geometry('800x600')

img1=ImageTk.PhotoImage(file='xxxxxxx.png')#建议写绝对路径,图片像素我是宽230x高255
label_img1=Label(top,image=img1)
label_img1.place(x=543,y=10)
img2=ImageTk.PhotoImage(file='xxxxxxx.png')#建议写绝对路径,图片像素我是宽230x高255
label_img2=Label(top,image=img2)
label_img2.place(x=543,y=277)

sb=Scrollbar(top)
sb.pack(side=RIGHT,fill=Y)

chatBox=Listbox(top,width=75,height=20,selectmode=EXTENDED,yscrollcommand=sb.set)
chatBox.place(x=10,y=10)
sb.config(command=chatBox.yview)

postBox=Text(top,width=75,height=10,wrap=WORD)
postBox.place(x=10,y=400)

postButton=Button(top,bd=3,text='  发 送  ')
postButton.place(x=485,y=540)

top.mainloop()

24.png

6、封装闲聊机器人示例代码

[Python] 纯文本查看 复制代码
from tkinter import *
from PIL import Image, ImageTk
import random
import requests
import json

def postMessage(newMessage):
        access_token = '24.6ba370dea2b0a0adb18feceb9fbc366e.2592000.1659929073.282335-26663451'
        url = 'https://aip.baidubce.com/rpc/2.0/unit/service/v3/chat?access_token=' + access_token
        post_data = {
                "version":"3.0",
                "service_id":"S72063",
                "session_id":"",
                "log_id":"xht13724033518",
                "request":{
                        "terminal_id":"UNIT_DEV_XHT",
                        "query":newMessage,
                }
        }
        post_data = json.dumps(post_data)
        headers = {'content-type': 'application/x-www-form-urlencoded'}
        response = requests.post(url, data=post_data, headers=headers)
        lst=[]
        if response:
                for eachRes in response.json()['result']['responses']:
                        for eachActions in eachRes['actions']:
                                lst.append(eachActions['say'])
        return random.choice(lst)

top=Tk()
top.title('闲聊机器人')
top.geometry('800x600')

img1=ImageTk.PhotoImage(file='机器人1.png')
label_img1=Label(top,image=img1)
label_img1.place(x=543,y=10)
img2=ImageTk.PhotoImage(file='零橙教育1.png')
label_img2=Label(top,image=img2)
label_img2.place(x=543,y=277)

sb=Scrollbar(top)
sb.pack(side=RIGHT,fill=Y)

chatBox=Listbox(top,width=75,height=20,selectmode=EXTENDED,yscrollcommand=sb.set)
chatBox.place(x=10,y=10)
sb.config(command=chatBox.yview)

postBox=Text(top,width=75,height=10,wrap=WORD)
postBox.place(x=10,y=400)

postButton=Button(top,bd=3,text='  发 送  ')
postButton.place(x=485,y=540)

top.mainloop()


7、按钮(Button)绑定事件

[Python] 纯文本查看 复制代码
from tkinter import *
from PIL import Image, ImageTk
import random
import requests
import json

def postMessage(newMessage):
        access_token =  '#####调用鉴权接口获取的token#####'
        url = 'https://aip.baidubce.com/rpc/2.0/unit/service/v3/chat?access_token=' + access_token
        post_data = {
                "version":"3.0",
                "service_id":"不是技能ID,是你的机器人ID",
                "session_id":"",
                "log_id":"日志ID随便填字母+数字",
                "request":{
                                "terminal_id":"UNIT_DEV_+后缀随便填",
                                "query":”聊天内容,比如你好“,
                }
        }
        post_data = json.dumps(post_data)
        headers = {'content-type': 'application/x-www-form-urlencoded'}
        response = requests.post(url, data=post_data, headers=headers)
        lst=[]
        if response:
                for eachRes in response.json()['result']['responses']:
                        for eachActions in eachRes['actions']:
                                lst.append(eachActions['say'])
        return random.choice(lst)

def getMessage():
        newMessage=postBox.get('1.0','end')#获取消息框(Text)信息
        chatBox.insert('end','老师:'+newMessage)#聊天框(Listbox)加入我发送的信息,并放在聊天框最下面
        repMessage=postMessage(newMessage)#获取聊天机器人的说话内容(刚刚我封装的代码)
        chatBox.insert('end','机器人:'+repMessage)#聊天框(Listbox)加入机器人发送的信息,并放在聊天框最下面
        chatBox.yview("moveto",1.0)#聊天框(Listbox)通过滚动条的功能跟随并显示最新消息
        postBox.delete('1.0','end')#清除消息框(Text)的内容

top=Tk()
top.title('闲聊机器人')
top.geometry('800x600')

img1=ImageTk.PhotoImage(file='机器人1.png')
label_img1=Label(top,image=img1)
label_img1.place(x=543,y=10)
img2=ImageTk.PhotoImage(file='零橙教育1.png')
label_img2=Label(top,image=img2)
label_img2.place(x=543,y=277)

sb=Scrollbar(top)
sb.pack(side=RIGHT,fill=Y)

chatBox=Listbox(top,width=75,height=20,selectmode=EXTENDED,yscrollcommand=sb.set)
chatBox.place(x=10,y=10)
sb.config(command=chatBox.yview)

postBox=Text(top,width=75,height=10,wrap=WORD)
postBox.place(x=10,y=400)

postButton=Button(top,bd=3,text='  发 送  ',command=getMessage)#绑定按钮事件
postButton.place(x=485,y=540)

top.mainloop()

25.png

8、绑定快捷建(ctrl+enter)

[Python] 纯文本查看 复制代码
from tkinter import *
from PIL import Image, ImageTk
import random
import requests
import json

def postMessage(newMessage):
        access_token = '#####调用鉴权接口获取的token#####'
        url = 'https://aip.baidubce.com/rpc/2.0/unit/service/v3/chat?access_token=' + access_token
        post_data = {
                "version":"3.0",
                "service_id":"机器人ID",
                "session_id":"",
                "log_id":"随便填写",
                "request":{
                        "terminal_id":"UNIT_DEV_XHT",
                        "query":newMessage,
                }
        }
        post_data = json.dumps(post_data)
        headers = {'content-type': 'application/x-www-form-urlencoded'}
        response = requests.post(url, data=post_data, headers=headers)
        lst=[]
        if response:
                for eachRes in response.json()['result']['responses']:
                        for eachActions in eachRes['actions']:
                                lst.append(eachActions['say'])
        return random.choice(lst)

def getMessage():
        newMessage=postBox.get('1.0','end')#获取消息框(Text)信息
        chatBox.insert('end','老师:'+newMessage)#聊天框(Listbox)加入我发送的信息,并放在聊天框最下面
        repMessage=postMessage(newMessage)#获取聊天机器人的说话内容(刚刚我封装的代码)
        chatBox.insert('end','机器人:'+repMessage)#聊天框(Listbox)加入机器人发送的信息,并放在聊天框最下面
        chatBox.yview("moveto",1.0)#聊天框(Listbox)通过滚动条的功能跟随并显示最新消息
        postBox.delete('1.0','end')#清除消息框(Text)的内容

def getMessageBindCE(Nothing):#绑定快捷键需要加一个可能没有用的参数
        newMessage=postBox.get('1.0','end')#获取消息框(Text)信息
        chatBox.insert('end','老师:'+newMessage)#聊天框(Listbox)加入我发送的信息,并放在聊天框最下面
        repMessage=postMessage(newMessage)#获取聊天机器人的说话内容(刚刚我封装的代码)
        chatBox.insert('end','机器人:'+repMessage)#聊天框(Listbox)加入机器人发送的信息,并放在聊天框最下面
        chatBox.yview("moveto",1.0)#聊天框(Listbox)通过滚动条的功能跟随并显示最新消息
        postBox.delete('1.0','end')#清除消息框(Text)的内容

top=Tk()
top.title('闲聊机器人')
top.geometry('800x600')

img1=ImageTk.PhotoImage(file='机器人1.png')
label_img1=Label(top,image=img1)
label_img1.place(x=543,y=10)
img2=ImageTk.PhotoImage(file='零橙教育1.png')
label_img2=Label(top,image=img2)
label_img2.place(x=543,y=277)

sb=Scrollbar(top)
sb.pack(side=RIGHT,fill=Y)

chatBox=Listbox(top,width=75,height=20,selectmode=EXTENDED,yscrollcommand=sb.set)
chatBox.place(x=10,y=10)
sb.config(command=chatBox.yview)

postBox=Text(top,width=75,height=10,wrap=WORD)
postBox.place(x=10,y=400)

postButton=Button(top,bd=3,text='  发 送  ',command=getMessage)
postButton.place(x=485,y=540)

top.bind("<Control-Return>",getMessageBindCE)#绑定快捷键

top.mainloop()





设置干预规则
————————————————
1、在”我的闲聊“选择自己的技能
29.png

2、设置干预规则
30.png

3、重新上线发布
31.png

4、效果
32.png


最后的话

————————————————
一分学习,一分经验,换来一份总结
我越来越觉得Python是一个存放工具的大箱子,各种库是给我们使用的工具,我越来越敬仰制作箱子和工具的人
我也只是站在他们的肩膀上

————————————
好像后面会自动添加重复的图片,我也不知道
###请自动忽略后面没用的图片###






4.png
4.png
17.png
26.png
27.png

免费评分

参与人数 11威望 +1 吾爱币 +29 热心值 +11 收起 理由
bjznhxy + 1 + 1 谢谢@Thanks!
lztym + 1 + 1 用心讨论,共获提升!
苏紫方璇 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Bakerhacker + 1 + 1 谢谢@Thanks!
xuejiqiao + 1 + 1 我很赞同!
夫子点灯 + 1 谢谢@Thanks!
heimaojingzhang + 1 + 1 热心回复!666
bestplay200 + 1 + 1 热心回复!
motto + 1 + 1 谢谢@Thanks!
pizazzboy + 1 + 1 谢谢@Thanks!
为之奈何? + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

judgecx 发表于 2022-7-13 00:56
要是语音对话孩子可能更感兴趣了

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
xhtdtk + 1 + 1 我很赞同!

查看全部评分

 楼主| xhtdtk 发表于 2022-7-13 11:18
有礼貌的牛 发表于 2022-7-13 09:51
感谢楼主,能问一下当机器人老师需要会什么语言才能教小朋友?

一般是scratch,python,c++
掌握其中一个就好
alongzhenggang 发表于 2022-7-13 00:11
king100 发表于 2022-7-13 00:25
挺好的智能机器人,AI的雏形,伟大的一步
甘霖之霜 发表于 2022-7-13 01:15
厉害,学习一下做做试试
TakeKeyEasy 发表于 2022-7-13 01:28
你这个过程很丰富,必须赞一个
yyl530 发表于 2022-7-13 05:10
学习了  谢谢
wkxq 发表于 2022-7-13 06:32
好详细的教程呀
龍謹 发表于 2022-7-13 06:40
向大神学习PY。
jinxin6670 发表于 2022-7-13 06:59
这个好玩,有效果图吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表