回答

收藏

基于树莓派的图灵聊天机器人

Raspberry Pi Raspberry Pi 5086 人阅读 | 0 人回复 | 2017-07-19

对话界面如下:



一、获取机器人
首先去图灵机器人官网注册一个账号并新建一个其它类机器人。新建完成后在“我的机器人》机器人详情》接入”页面即可看到每一个机器人的API KEY,如下图所示:



二、测试机器人
  上面我们已经有了机器人并拿到了key现在新建一个程序测试下
  1. import requests
  2. import json
  3. from datetime import datetime

  4. key = '***'  #替换成你的key
  5. while True:
  6.     data = str(input('请输入:'))
  7.     data =  {"key":key,"info":data}
  8.     postdata = json.dumps(data)
  9.     r = requests.post('http://www.tuling123.com/openapi/api',data=postdata)
  10.     rend_data = r.text
  11.     updata = json.loads(rend_data)
  12.     rend_data = ''
  13.     #根距接收的数据类型选择 say 方式
  14.     if updata['code'] == 100000:
  15.         print( updata['text'])
  16.     if updata['code'] == 200000:
  17.         print( updata['text'])
  18.         print( updata['url'])
  19.     if updata['code'] == 308000:
  20.         temp = (updata['list'])
  21.         for i in range(0,len(temp)):
  22.             client_data = dict(temp[i])
  23.             print(client_data['icon'])
  24.             print(client_data['name'])
  25.             print(client_data['info'])
  26.             print(client_data['detailurl'])
  27.     if updata['code'] == 302000:
  28.         temp = (updata['list'])
  29.         for i in range(0,len(temp)):
  30.             client_data = dict(temp[i])
  31.             print(client_data['article'])
  32.             print(client_data['icon'])
  33.             print(client_data['source'])
  34.             print(client_data['detailurl'])
复制代码
测试效果如下:



三、接入贝壳
1、新建一个文件并保存为config.py 用来保存配置。代码如下:
  1. #!/uer/bin/python3
  2. # -*- coding:utf-8 -*-
  3. #===================
  4. # bitiot.net 配置
  5. #===================
  6. class bigiot:
  7.     host = 'www.bigiot.net'
  8.     port = 8181
  9.     deviceid = '***'            #设备ID
  10.     apikey = '***'              #key
  11.     iputid1 = '***'             #数据接口,备用
  12.     checkin = {
  13.         "M":"checkin",
  14.         "ID":deviceid,
  15.         "K":apikey
  16.         }

  17. #===========================
  18. # 图灵机器人配置
  19. # http://www.tuling123.com/
  20. #===========================
  21. class tulin:
  22.     key = '***'                #机器人key
  23.     host = 'http://www.tuling123.com/openapi/api'
复制代码
2、新建一个文件并保存为function.py 用来存放函数。代码如下:
  1. #!/uer/bin/python3
  2. # -*- coding:utf-8 -*-
  3. import requests
  4. import socket
  5. import time
  6. import json
  7. from config import bigiot as big
  8. from config import tulin as t
  9. from datetime import datetime

  10. address =(big.host, big.port)
  11. checkin = json.dumps(big.checkin)
  12. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  13. #=============================
  14. # bigiot
  15. # 2016/12/21
  16. #=============================
  17. class bigiot:
  18.     def big_line(self):            #连接贝壳平台   
  19.         while True:
  20.             try:
  21.                 s.connect(address)
  22.                 print(address)
  23.                 time.sleep(2)        
  24.             except:
  25.                 print('连接失败!尝试重新连接...')
  26.                 time.sleep(2)
  27.             else:
  28.                 s.sendall(checkin.encode('utf-8'))
  29.                 s.sendall(b'\n')
  30.                 print(checkin)
  31.                 break
  32.     def keep_online(self,t):        #在线状态检察
  33.         if time.time() - t > 40:    #每40S'{"M":"status"}'一次
  34.             s.sendall(b'{"M":"status"}\n')
  35.             print('[{0}]-->check status'.format(datetime.now()))
  36.             return time.time()
  37.         else:
  38.             return t
  39.     def say(self,id,coutent):       #发送指令(say方式)
  40.         __coutent = {"M":"say","ID":id, "C":coutent}
  41.         __coutent = json.dumps(__coutent)
  42.         s.sendall(__coutent.encode('utf-8'))
  43.         s.sendall(b'\n')
  44.     def process(self,b_data):       #解析平台数据
  45.         global msg
  46.         msg = b_data
  47.         print('[{0}]-->{1}'.format(datetime.now(),msg))
  48.         if msg['M'] == 'connected':
  49.             s.sendall(checkin.encode('utf-8'))
  50.             s.sendall(b'\n')
  51.         if msg['M'] == 'say':
  52.             bigiot.chitchat(msg['C']) #调用机器人函数
  53.         if msg['M'] == 'login':
  54.             bigiot.say(msg['ID'], '你好!我是小冰,请问有什么可以帮你!')
  55.         msg.clear()
  56.     def chitchat(self,data):        #机器人
  57.         __data =  {"key":t.key,"info":data}
  58.         __postdata = json.dumps(__data)
  59.         r = requests.post(t.host,data=__postdata)
  60.         __rend_data = r.text
  61.         __updata = json.loads(__rend_data)
  62.         __rend_data = ''
  63.         print('[{0}]-->{1}'.format(datetime.now(),__updata['code']))
  64.         #根距接收的数据类型选择 say 方式
  65.         if __updata['code'] == 100000:
  66.             bigiot.say(msg['ID'], __updata['text'])
  67.         if __updata['code'] == 200000:
  68.             bigiot.say(msg['ID'], __updata['text'])
  69.             bigiot.say(msg['ID'], __updata['url'])
  70.         if __updata['code'] == 308000:
  71.             __temp = (__updata['list'])
  72.             for i in range(0,len(__temp)):
  73.                 __client_data = dict(__temp[i])
  74.                 bigiot.say(msg['ID'], __client_data['detailurl'])
  75.                 bigiot.say(msg['ID'], __client_data['info'])
  76.                 bigiot.say(msg['ID'], __client_data['name'])
  77.                 bigiot.say(msg['ID'], __client_data['icon'])
  78.         if __updata['code'] == 302000:
  79.             __temp = (__updata['list'])
  80.             for i in range(0,len(__temp)):
  81.                 __client_data = dict(__temp[i])
  82.                 bigiot.say(msg['ID'], __client_data['detailurl'])
  83.                 bigiot.say(msg['ID'], __client_data['source'])
  84.                 bigiot.say(msg['ID'], __client_data['icon'])
  85.                 bigiot.say(msg['ID'], __client_data['article'])
  86.         __updata = ''
  87. bigiot = bigiot()
复制代码
3、新建一个文件并保存为tcp_client.py 代码如下:
  1. #!/uer/bin/python3
  2. # -*- coding:utf-8 -*-
  3. import function
  4. import time
  5. fs = function.s
  6. bigiot = function.bigiot
  7. bigiot.big_line()  #调用big_line()连接bigiot.net
  8. fs.settimeout(0)   
  9. t1 = t2 =time.time()
  10. while True:
  11.     try:
  12.         temp = fs.recv(1024)
  13.         t1 = time.time()
  14.     except:
  15.         time.sleep(2)
  16.         t1 = bigiot.keep_online(t1)
  17.         pass
  18.     else:
  19.         try:
  20.             msg = eval(str(temp,encoding = 'utf-8'))
  21.             t2 = time.time()
  22.         except:
  23.             '''
  24.             如果90s内没有收到平台返回的数据,
  25.             则认定为掉线,并重新调用big_line()
  26.             函数
  27.             '''
  28.             if time.time() - t2 > 90:  
  29.                 bigiot.big_line()
  30.         else:
  31.             bigiot.process(msg)
  32.             msg.clear()
复制代码
把上面三个方件放在一个方件夹内,然后启动tcp_client.py
现在你的机器人也上线了^-^

四、一些问题
1、这套代码在PC的运行正常,树莓派上也没问题;但在树莓派上运行时机器人回答的比较慢,我的是大概5秒才收到返回信息而PC是秒回。至于是什么原因造成不太清楚还望大神指点。
2、在function.py中的process()函数中加入了对{"M":"login"}的返回,如果你现在有两个设备在相互say将有可能陷入无限循环,当然你也可以去掉对{"M":"login"}的处理。
3、由于本人是刚学python所以代码中对错误的处理都比较‘暴力’,当遇到错误时只会跳过并不会输出错误信息;如你要调试代码请用python IDLE 调试或自行更改错误处理方式。这种错误处      理方式极不推荐可其它的我还没学会-_-!
4、不要问我为什么把非要用类,上面说过了,我现在刚学python的类,拿来练手的。



                        



关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条