命令行下的聊天机器人

    • 原理
      • 接口
      • 语音
    • 代码实现
    • 效果
    • 总结

今天比较闲,简单的做了一个命令行下的聊天机器人,接口还是之前做android聊天机器人的时候申请的key,没想到现在还没有失效。╭(╯^╰)╮

先放个下载地址吧:

https://github.com/guoruibiao/chatter/raw/master/panda.rar


原理

接口

原理就是使用图灵机器人接口。网址如下:http://www.tuling123.com/

官网简易使用post的方式进行网络请求,所以最好也是按照官网的来。

发送的格式是一致的,但是返回的数据类型却不是一致的。这一点可以通过返回的JSON串中的code属性进行区分。

详细的信息,可以参照API中的讲解,异常的详细,(^__^) 嘻嘻……
http://www.tuling123.com/help/h_cent_webapi.jhtml?nav=doc

语音

这里和之前Android上写的不同,那就是添加了语音模块,也就是说,电脑会通过扬声器来和您对话。

依赖: pyttsx

详细的使用可以参考一下博主之前写过的这篇文章:
http://blog.csdn.net/Marksinoberg/article/details/52137547?locationNum=1&fps=1

代码实现

# coding:utf-8
import sys

reload(sys)
sys.setdefaultencoding('utf8')
#    __author__ = '郭 璞'
#    __date__ = '2016/10/31'
#    __Desc__ = 图灵机器人测试

import requests
import urllib, urllib2
import json
import jieba
import pyttsx
from random import randint

# 一次性初始化语音引擎,减少资源的打开关闭开销
engine = pyttsx.init()

# 对语句进行分词,分词列表中将包含查询所需的关键字,这里暂且用不到了(接口已经完成了此项任务)
def parseText(text):
    words = []
    words = jieba.cut(text, cut_all=True)
    return list(set(words))

# 根据post方式获取到返回信息
def getResult(url, payload):
    res = requests.post(url=url, data=payload)
    return res

def getData(url, payload):
    payload = urllib.urlencode(payload)
    req = urllib2.Request(url=url, data=payload)
    return urllib2.urlopen(req).read()

# 初始化语音引擎,让电脑读出来
def say(text):
    rate = engine.getProperty('rate')
    # 控制一下语速
    engine.setProperty('rate', rate - 64 + randint(10, 36))
    engine.say(text)
    engine.runAndWait()

# 根据返回的code来判断属于哪一类的json数据串,方便接下来的拆解,共有
# 10 0000 文本类
# 20 0000 链接类
# 30 2000 新闻类
# 30 8000 菜谱类
# 31 3000 儿歌类(仅针对于儿童版)
# 31 4000 诗词类(仅针对于儿童版)
def switch(result):
    code = result['code']

    if code == 100000:
        text = result['text']
        print text
        say(text)

    elif code == 200000:
        text = result['text']
        url = result['url']
        print text, url
        say(text + '.    不妨,点击后面的链接查看详情吧')

    elif code == 302000:
        text = result['text']

        newslist = result['list']
        # 循环读取每一个条目的新闻内容
        for item in range(len(newslist)):
            article = newslist[item]['article']
            source = newslist[item]['source']
            detailurl = newslist[item]['detailurl']

            print article, source, detailurl

    elif code == 308000:
        text = result['text']
        menu = result['list']

        # 循环的打出每一条菜谱的详细信息
        for item in menu:
            name = item['name']
            icon = item['icon']
            info = item['info']
            detailurl = item['detailurl']

            print name, icon, info, detailurl

    else:
        print '我竟无言以对,╭(╯^╰)╮'
        say('我表示不知道说什么好了')

# 根据关键字的不同,组装出不同的post数据,以便于获取不同的结果集
def main(url='http://www.tuling123.com/openapi/api', text='你好'):
    payload = {
        'key': '您申请的APPkey',
        'info': text,
        # userid 官网上说是针对每一个用户实现的不同的编号即可,这里随意指定不重复即可
        'userid': '1357924680'
    }
    # 将返回的数据以json的方式打开,并读取Reponse的内容部分
    # result = json.loads(getResult(url, payload).text)
    result = json.loads(getData(url, payload))
    # 根据code的不同,跳转到不同的分支,实现条件语句
    switch(result)

if __name__ == '__main__':
    print '嗨,我是专门为你打造的一个聊天机器人,随便和我聊些什么吧,我可以陪您聊天,给您讲笑话,查新闻,查航班,查车票,还能为您找菜谱呢(*^__^*) 嘻嘻……\n\n\n'.encode('gbk')
    username = raw_input('输入姓名后即可开始聊天,按Ctrl+C退出: '.encode('gbk'))
    question = raw_input('%s: '.encode('gbk') % username)
    while True:
        question = question.decode('gbk')
        main(text=question)
        print '---------------------------------------------------'
        question = raw_input('%s: '.encode('gbk') % username)
    print '( ^_^ )/~~拜拜'.encode('utf-8')

如上所示,你可能会对import部分感到好奇,明显requests,jieba模块都没有用到,为什么还要引入呢?

答案就是一开始博主想利用pyinstaller将其打包成一个exe文件的,奈何种种原因没能成功。
一开始以为是requests这种第三方模块的问题,就用urllib,urllib2重写了一下,发现还是失败了。

究其根本是pyinstaller工具未能成功的将pyttsx打包, 因此而失败。

为了给自己一个警醒(纪念),就没有删掉这些没用的代码。

效果

由于图片不能显示声音,所以演示的效果不太好。

总结

总的来说,这次没有什么难点,还是对基础模块的使用,图灵机器人这个平台确实是一个比较好的锻炼平台。比较适合用来练手和巩固基础的知识技能。

时间: 2024-08-02 03:20:59

命令行下的聊天机器人的相关文章

代码-在命令行下输入*程序为什么不能正确识别

问题描述 在命令行下输入*程序为什么不能正确识别 代码的功能:函数接受3个参数两个数字一个四则运算符,输出计算结果,列如输入3 + 5 输出3+5=15:函数加减除都能运算,为何输入* ( 乘)时程序不能正确识别,求各位大神解答: 代码如下 ![主函数!(http://img.ask.csdn.net/upload/201504/01/1427890049_29127.png)` ` ` 解决方案 是不是多输入了一个空格? 解决方案二: 关键在于你输入是怎么接收方式,从截图也就能看出来乘法和其他

命令行下也玩IPsec

在网络应用越来越广泛的今天,一个重要的问题就是有关计算机通信的安全性问题.作为网络系统管理员,一项基本职责就是保证数据在网络传输中,不能被未经授权的人访问.查看或修改,在这中间,同时要保证数据能加密传输.怎样做到这一点呢? Win2k网络中,我们可以通过IPSec来保护网络的安全.IPSec的全称是InternetProtocolSecurity,翻译成中文就是Internet协议安全.它的作用主要有两个:一个是保护IP数据包的内容,另外一点就是通过数据包筛选并实施受信任通讯来防御网络攻击.这对

提高linux命令行下工作效率

本文介绍一些命令行下提高工作效率的技巧,有助于提高学习的兴趣. 1.命令行下拷贝与粘贴 Linux安装后每次启动时都会自动运行一个gpm程序, 然后就可以用鼠标拷贝与粘贴了.具体做法是,按住鼠标左键拖动,使要拷贝的地方反白,这样拷贝的内容就会被粘贴在光标所在位置了. 2.快速进入某些目录 键入cd-可直接进入用户的home目录:键入cd-可进入上一个目录. 3.命令补齐 命令补齐是指当键入的字符足以确定目录下一个惟一的文件时,只须按Tab键就可以自动补齐该文件名的剩下部分. Linux下的有些文

如何在Linux 命令行下浏览天气预报

  Q: 我经常在 Linux 桌面查看天气预报.然而,是否有一种在终端环境下,不通过桌面小插件或者浏览器查询天气预报的方法? 其中有一个就是wego,一个终端下的小巧程序.使用基于ncurses 的接口,这个命令行程序允许你查看当前的天气情况和之后的预报.它也会通过一个天气预报的API 收集接下来5 天的天气预报. 在Linux 下安装 wego 安装 wego 相当简单.wego 是用 Go 编写的,引起第一个步骤就是安装Go 语言.然后再安装 wego. $ go get github.c

命令行下的抗毒精英

  一.TASKLIST--火眼金睛 如今的病毒越来越狡猾,常常不见首也不见尾.但许多病毒往往在进程这一环节中露出狐狸尾巴,因而查看进程是查杀病毒的一个重要的方法.命令行提供了进程查看的命令工具--Tasklist(Windows XP或更新版本).此命令与任务管理器一样可以显示活动进程的列表.但通过使用参数,可以看到任务管理器查看不到的信息,可以实现更强大的功能.使用参数"/M",运行"Tasklist /M"将显示每个任务加载的所有的DLL模块;使用参数&quo

如何把命令行下的执行结果保存(二)

前段时间我发过一篇类似的帖子[已解决]烂泥:如何把命令行下的执行结果保存(一),在这篇帖子中,我是把命令行下运行的结果保存在本机的.那么如果我想这个结果保存在局域网中另外一台机器该如何操作呢? 首先我们在一台机器,在此为了使试验更能接近实际我使用AD(IP:192.168.7.200)上新建一个共享文件夹123,并且把该文件夹的安全和共享设置为Everyone完全控制.如下图示: 相应的权限配置好后,我们就登陆另外一台机器(IP:192.168.7.150)哦. 在命令行中执行如下的命令:ipc

Linux有问必答:如何在命令行下压缩JPEG图像

Linux有问必答:如何在命令行下压缩JPEG图像 问题: 我有许多数码照相机拍出来的照片.我想在上传到Dropbox之前,优化和压缩下JPEG图片.有没有什么简单的方法压缩JPEG图片并不损耗他们的质量? 如今拍照设备(如智能手机.数码相机)拍出来的图片分辨率越来越大.甚至3630万像素的Nikon D800已经冲入市场,并且这个趋势根本停不下来.如今的拍照设备不断地提高着照片分辨率,使得我们不得不压缩后,再上传到有储存限制.带宽限制的云. 事实上,这里有一个非常简单的方法压缩JPEG图像.一

linux shell命令行下curl问题。。。,,

问题描述 linux shell命令行下curl问题...,, curl -d 之后收到网页的返回数据,是代表发送成功了么 如果是成功了,为什么我么有收到短信呢 如果没成功,应该怎么发送一个post数据呢 解决方案 关于curl命令行下载页面为空的问题 解决方案二: curl -d只是post的数据过去,你要看发挥的信息是否有提示成功.

Aria2一个命令行下运行、多协议、多来源下载工具

Aria2是一个命令行下运行.多协议.多来源http://www.aliyun.com/zixun/aggregation/10481.html">下载工具(HTTP/HTTPS.FTP.BitTorrent.Metalink),内建 XML-RPC 用户界面. Aria2是Linux 下一个不错的高速下载工具.由于它具有分段下载引擎,所以支持从多个地址或者从一个地址的多个连接来下载同一个文件.这样自然就大大加快了文件的下载速度.aria2 也具有断点续传功能,这使你随时能够恢复已经中断的