当前位置:   article > 正文

Python对接腾讯“智能闲聊”实现一个聊天机器人_用python接入腾讯云智能闲聊api

用python接入腾讯云智能闲聊api

最近在使用腾讯语音合成时发现了一个有趣的东西:智能闲聊

好奇之下点了进去,发现是一个智能聊天的功能。然后就顺势根据这个api写了一个简单的聊天机器人。

好了,废话不多说,下面来一步一步实现聊天机器人

1:在腾讯ai开放平台创建一个应用。

2:获得该应用的app_id和app_key

3:分析开发文档

开发文档地址:https://ai.qq.com/doc/nlpchat.shtml

可以看到,要实现这个功能,需要访问如下的地址来请求数据:

https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat

而要访问这个地址获得数据还需要携带一些参数,才能获得想要的结果。如下:

app_id:应用的标识,刚才已经复制过。必须是 int 类型的

time_stamp:时间戳,这个参数需要实时获取。后边代码里可以实现。(int类型)

nonce_str:随机的字符串,用来保证签名(sign)不被预测。代码里会实现。

sign:每次请求的签名。需要根据官方提供的算法进行计算获得。

session:会话标识。(具体从哪获得这个不太清楚,但是我随便写的10000可以用)。

question:你的问题。(最长不能超过100个汉字,(utf8编码格式下一个汉字占3个字节))。

 

关于签名(sign)的计算方法,可以看到官方文档提供的算法如下:

官方文档写的比较模糊,关于这个算法具体的分析可以看我的另一篇博客:

         https://blog.csdn.net/hungpangzi/article/details/84334325

这里不再赘述。

关于这个获得数据的http请求还有一些限制:

4:根据开发文档写代码

<1>:首先定义一个基础类(因为腾讯ai开放平台的很多api的调用方式都差不多,只是参数略有不同。因此该类的作用就是将这些共同的代码写出来,预留出的接口可以供不同的功能使用。)

  1. class BaseClass:
  2. def __init__(self, url):
  3. """
  4. :param url:api的访问地址
  5. """
  6. self.URL = url;
  7. self.APP_ID = 000000000000; # 你自己的app_id
  8. self.APP_KEY = "xxxxxxxxx"; # 你自己的app_key
  9. # params属性需要用户后来修改,添加对应api所需的参数
  10. # 这里列举出的参数都是共有的,特有的参数需要用户自己传入
  11. self.params = {
  12. 'app_id' : self.APP_ID,
  13. 'time_stamp' : None,
  14. 'nonce_str' : None,
  15. };
  16. # 调用接口返回的结果
  17. self.result = None;
  18. def __get_sign(self):
  19. """
  20. 计算获得sign的方法
  21. :return:None
  22. """
  23. # 获得时间戳(秒级),防止请求重放
  24. time_stamp = int(time.time());
  25. # 获得随机字符串,保证签名不被预测
  26. nonce_str = ''.join(random.sample(string.ascii_letters + string.digits, 10))
  27. # 组合参数(缺少sign,其值要根据以下获得)
  28. self.params['time_stamp'] = time_stamp;
  29. self.params['nonce_str'] = nonce_str;
  30. # 计算获得sign的值
  31. before_sign = '';
  32. # 对key排序拼接
  33. for key in sorted(self.params):
  34. before_sign += f'{key}={quote(str(self.params[key]).encode("utf-8"))}&';
  35. # 将应用秘钥以app_key为键名,拼接到before_sign的末尾
  36. before_sign += f"app_key={self.APP_KEY}";
  37. # 对获得的before_sign进行MD5加密(结果大写),得到借口请求签名
  38. sign = hashlib.md5(before_sign.encode("utf-8")).hexdigest().upper();
  39. # 将请求签名添加进参数字典
  40. self.params["sign"] = sign;
  41. def get_result(self):
  42. """
  43. 该方法用于调用api,获得返回的结果
  44. :return: None
  45. """
  46. # 完善params参数,将sign添加进参数字典
  47. self.__get_sign();
  48. params = urllib.parse.urlencode(self.params).encode("utf-8");
  49. req = request.Request(url=self.URL, data=params);
  50. # 设置超时10秒,重试3次
  51. count = 0;
  52. while True:
  53. try:
  54. count += 1;
  55. self.result = request.urlopen(req, timeout=10);
  56. break;
  57. except Exception as e:
  58. print(e)
  59. print(f"连接超时,正在进行第{str(count)}次重连")
  60. if count <= 3:
  61. continue;
  62. else:
  63. break;
  64. def do_result(self):
  65. """
  66. 处理结果的方法
  67. :return: None
  68. """
  69. pass;
  70. def run(self):
  71. """
  72. 主运行方法
  73. :return: None
  74. """
  75. pass;

<2>:实现智能闲聊功能。(定义TencentChat类继承上边的基类)

  1. class TencetChat(BaseClass):
  2. def __init__(self, question):
  3. """
  4. :param question: 聊天的问题
  5. """
  6. super(TencetChat, self).__init__("https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat");
  7. self.params["session"] = "10000" # 这个是我随便写的,可以使用。
  8. self.question = question;
  9. def deal_question(self):
  10. """
  11. 对提出的问题进行处理,限制长度和类型
  12. :return: None
  13. """
  14. if not isinstance(self.question, str):
  15. raise TypeError(f"question参数必须是 ‘str’ 类型的,不能是 ‘{type(self.question)}’ 类型的!!!");
  16. else:
  17. if len(self.question.encode("utf-8")) > 300:
  18. raise ValueError("question参数的长度必须小于300个字节(utf-8格式下)")
  19. else:
  20. self.params["question"] = self.question;
  21. self.do_result();
  22. def do_result(self):
  23. """
  24. 处理结果
  25. :return:None
  26. """
  27. self.get_result();
  28. if self.result:
  29. res = json.loads(self.result.read().decode("utf-8"));
  30. # print(res)
  31. if not res["msg"] == "ok":
  32. self.answer = "我好像出错了:"+res["msg"];
  33. else:
  34. self.answer = res["data"]["answer"];
  35. else:
  36. self.answer="我尝试了4次,但还是失败了,只能说我尽力了。";
  37. def run(self):
  38. """
  39. 运行方法
  40. :return:None
  41. """
  42. self.deal_question();
  43. if __name__ == '__main__':
  44. chat = TencentChat("你好");
  45. chat.run();
  46. print("智能闲聊:"+chat.answer);

<3>:为了方便的使用,可以实现一个方法,用来持久化对话,代码如下:

  1. # 整合之后的一个聊天程序
  2. def complete_chat():
  3. """
  4. 一个完整的聊天的方法
  5. :return: None
  6. """
  7. print("欢迎使用智能闲聊,下面开始聊天吧(输入quit退出聊天):")
  8. print("*"*50)
  9. while True:
  10. question = input("我:");
  11. if question == "quit":
  12. break;
  13. t_chat = TencetChat(question);
  14. t_chat.run();
  15. answer = t_chat.answer;
  16. print("智能闲聊:",answer);
  17. if __name__ == '__main__':
  18. complete_chat();

一个简单的聊天程序就实现了。

以上代码可以直接复制粘贴使用。

完整代码可到我的GitHub获取:https://github.com/shyorange/InterestingProgram

=================转载请注明出处=============================================

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/337097
推荐阅读
相关标签
  

闽ICP备14008679号