查看: 302|回复: 0

[项目] 基于树莓派的图灵聊天机器人

[复制链接]

34

主题

0

好友

758

积分

举人

Rank: 4

  • TA的每日心情
    慵懒
    2014-11-28 09:29
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-7-19 09:58:53 |显示全部楼层
    对话界面如下:

    QQ截图20170719094952.png


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

    QQ截图20170719095011.png


    二、测试机器人
      上面我们已经有了机器人并拿到了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'])
    复制代码
    测试效果如下:

    QQ截图20170719095029.png


    三、接入贝壳
    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的类,拿来练手的。



                            



    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-10-23 04:57 , Processed in 0.130032 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部