当前位置:   article > 正文

聊天机器人的实现(基于C#和图灵API)_c# 图灵机器人api secret

c# 图灵机器人api secret

今日闲来无事,脑洞大开,决定写一个聊天机器人。

当然,我们去自己实现人工智能的聊天对话功能是不现实了,即使去做,也要花费大量的时间精力,最后可能也搞不出来。于是,从网上搜索相关的API接口,于是,找到了这个:http://www.tuling123.com/openapi/

感觉虽然和微软的小冰和韩国的小黄鸡还有些差距,不过也还好,就这样吧。

先上效果图(比较丑。。。)



图灵机器人API的使用非常简单,用一个http的get形式获取,就会返回一个json数据,再解析json数据即可

举例说来就是:

如果发送过去这个:

请求示例: http://www.tuling123.com/openapi/api?key=KEY&info=你漂亮么

其中的KEY是在注册图灵API的时候提供给你的

那么返回的就是这样的一个json数据:

{

"code":100000,

"text":"恩恩,害羞ing……"

}

很简单的样子...


下面开始着手去做了

首先,把要解决的问题罗列出来:

1,使用什么工具编写

2,如何使用http get

3,如何解析json数据


下面逐一解决:

问题一:使用什么工具编写

最初打算使用python来着,简单易用,还可以跨平台。

但是吧。。。由于图灵API返回的数据是utf-8编码的,Python对于utf-8编码的转换很复杂,总是报错,上网查询好久无果,只好退而求其次,使用C#编写吧。

(没使用C和C++主要是界面描画很麻烦,C本身描画界面就需要借助第三方的东西,C++用MFC感觉太复杂了。Java学的不好。。。)


问题二:怎么使用Http get

参考如下代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Net;
  7. using System.IO;
  8. namespace HttpGetter
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. String url = "http://www.csdn.net"; //设定要get的地址
  15. Encoding encoding = Encoding.GetEncoding("utf-8"); //设定编码格式
  16. String data = HttpGet(url, encoding);
  17. if (data != "")
  18. {
  19. Console.WriteLine(data);
  20. }
  21. Console.ReadLine();
  22. }
  23. public static string HttpGet(string url, Encoding encoding)
  24. {
  25. string data = "";
  26. try
  27. {
  28. WebRequest request; //使用url发出请求的类
  29. request = WebRequest.Create(url);
  30. request.Credentials = CredentialCache.DefaultCredentials; //使用默认的身份验证
  31. request.Timeout = 10000; //设定超时
  32. WebResponse response; //提供响应的类
  33. response = request.GetResponse();
  34. data = new StreamReader(response.GetResponseStream(), encoding).ReadToEnd(); //获取数据
  35. }
  36. catch (System.Exception e)
  37. {
  38. Console.WriteLine(e.Message);
  39. }
  40. return data;
  41. }
  42. }
  43. }

上面的代码是在C#命令行中运行的,之后会制造一个界面,做成一个窗口形式的程序


问题三:如何解析json数据

这个问题搞得很头大,C#自带的json解析感觉比较复杂,玩不转。只好下载了一个第三方的json解析工具:Newtonsoft.Json

安装这个很简单,但是如果网络不好,会出现下载失败的问题

以我使用的VS2013为例,

工具 -> NuGet程序包管理器 -> 程序包管理器控制台

之后再出现的控制台上输入这个:

install-package newtonsoft.json

之后,如果之前没下载过得话,会联网进行下载,下载完成之后,就可以使用Newtonsoft.Json的工具类了


下面开始编码吧


应用界面的实现


界面的实现,就是两个Textbox,一个按钮,和一个图片框。

一个TextBox作为输入框,一个作为聊天记录的现实,按钮作为提交按钮,图片框里放一张你喜欢的机器人头像就好(哆啦A梦,阿童木,阿拉蕾随意。。。)

可能需要调整的细节有:

聊天记录的TextBox不允许用户输入,所以ReadOnly属性要置为True

软件希望按下回车能够自动提交输入内容,所以,窗体的AcceptButton要设定为窗体上的那个按钮。


制造url


想要正常的与机器人交流,必须要遵循机器人的规则,这里要按照如下格式进行对话的提交:

http://www.tuling123.com/openapi/api?key=KEY&info=TEXT

上面的KEY是在注册图灵机器人账号的时候得到的,是一串很长的数字加字母

TEXT是你的问话内容


Json数据解析


Newtonsoft提供的JSON解析器还是比较容易使用的。(要using Newtonsoft.Json;)

首先,用一个String类型的变量存放要解析的Json数据,之后,创建Json解析类

JsonReader reader = new JsonTextReader(new StringReader(data));

之后,调用reader.Read()进行解析。

每一次read,都取得了这一次解析的内容,

比如:

你输入“你好”,

得到的Json数据为:{"code":100000,"text":"你好啊,希望你今天过的快乐"}

在控制台程序中重复执行:

Console.WriteLine(reader.TokenType + "\t\t" + reader.ValueType + "\t\t" + reader.Value);

reader.Read();

得到的输出为:

StartObject
PropertyName System.Stringcode
Integer System.Int64100000
PropertyName System.Stringtext
String System.String你也好 嘻嘻
EndObject

参考官网提供的文档,如果返回码code为100000,则表明这是一个文本数据,text是返回的对话内容

图灵API还提供了诸如航班电影等一系列的返回形式,原理基本相同,这里只实现对于文本类型返回值的处理。

根据这个规则,就可以写一个很傻的解析程序:

  1. while (reader.Read())
  2. {
  3. if (reader.TokenType == JsonToken.PropertyName
  4. && reader.ValueType == Type.GetType("System.String")
  5. && Convert.ToString(reader.Value) == "code")
  6. {
  7. /* 如果当前Value是code,读取下一条,查看code的值 */
  8. reader.Read();
  9. switch (Convert.ToInt32(reader.Value))
  10. {
  11. case 100000:
  12. /* 返回码为文本类数据 */
  13. reader.Read();
  14. reader.Read();
  15. tbxHistory.AppendText("Robot: " + reader.Value + "\n");
  16. break;
  17. default:
  18. break;
  19. }
  20. }
  21. }
中间两个reader.Read();是用来跳过text标示的那一次数据,这里只是节约时间,后期可以根据官方文档做一个解析更全面,更安全的程序。


基本差不多了,最终附上所有代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using Newtonsoft.Json;//json解析用
  11. using System.IO;
  12. using System.Net;
  13. namespace ChatRobot
  14. {
  15. public partial class ChatRobotForm : Form
  16. {
  17. const String KEY = "XXXXXXXXXXXXXXXXXXXXX"; //这里是注册时得到的key
  18. public ChatRobotForm()
  19. {
  20. InitializeComponent();
  21. }
  22. private void btnCommit_Click(object sender, EventArgs e)
  23. {
  24. String input = tbxInput.Text;
  25. string url = "http://www.tuling123.com/openapi/api?key=" + KEY + "&info=" + input;
  26. /* 清空输入框 */
  27. tbxInput.Text = "";
  28. /* 将输入内容放入聊天记录窗口中 */
  29. tbxHistory.AppendText("You: " + input + "\n");
  30. Encoding encoding = Encoding.GetEncoding("utf-8");
  31. String data = HttpGet(url, encoding);
  32. JsonReader reader = new JsonTextReader(new StringReader(data));
  33. while (reader.Read())
  34. {
  35. //tbxHistory.AppendText(reader.TokenType + "\t\t" + reader.ValueType + "\t\t" + reader.Value + "\n");
  36. if (reader.TokenType == JsonToken.PropertyName
  37. && reader.ValueType == Type.GetType("System.String")
  38. && Convert.ToString(reader.Value) == "code")
  39. {
  40. /* 如果当前Value是code,读取下一条,查看code的值 */
  41. reader.Read();
  42. switch (Convert.ToInt32(reader.Value))
  43. {
  44. case 100000:
  45. /* 返回码为文本类数据 */
  46. reader.Read();
  47. reader.Read();
  48. tbxHistory.AppendText("Robot: " + reader.Value + "\n");
  49. break;
  50. default:
  51. break;
  52. }
  53. }
  54. }
  55. }
  56. public static string HttpGet(string url, Encoding encoding)
  57. {
  58. string data = "";
  59. try
  60. {
  61. WebRequest request; //使用url发出请求的类
  62. request = WebRequest.Create(url);
  63. request.Credentials = CredentialCache.DefaultCredentials; //使用默认的身份验证
  64. request.Timeout = 10000; //设定超时
  65. WebResponse response; //提供响应的类
  66. response = request.GetResponse();
  67. data = new StreamReader(response.GetResponseStream(), encoding).ReadToEnd(); //获取数据
  68. }
  69. catch (System.Exception e)
  70. {
  71. Console.WriteLine(e.Message);
  72. }
  73. return data;
  74. }
  75. }
  76. }
  77. namespace ChatRobot
  78. {
  79. partial class ChatRobotForm
  80. {
  81. ///
  82. /// 必需的设计器变量。
  83. ///
  84. private System.ComponentModel.IContainer components = null;
  85. ///
  86. /// 清理所有正在使用的资源。
  87. ///
  88. /// 如果应释放托管资源,为 true;否则为 false。
  89. protected override void Dispose(bool disposing)
  90. {
  91. if (disposing && (components != null))
  92. {
  93. components.Dispose();
  94. }
  95. base.Dispose(disposing);
  96. }
  97. #region Windows 窗体设计器生成的代码
  98. ///
  99. /// 设计器支持所需的方法 - 不要
  100. /// 使用代码编辑器修改此方法的内容。
  101. ///
  102. private void InitializeComponent()
  103. {
  104. System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ChatRobotForm));
  105. this.btnCommit = new System.Windows.Forms.Button();
  106. this.tbxInput = new System.Windows.Forms.TextBox();
  107. this.tbxHistory = new System.Windows.Forms.TextBox();
  108. this.pictureBox1 = new System.Windows.Forms.PictureBox();
  109. ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
  110. this.SuspendLayout();
  111. //
  112. // btnCommit
  113. //
  114. this.btnCommit.Location = new System.Drawing.Point(303, 290);
  115. this.btnCommit.Name = "btnCommit";
  116. this.btnCommit.Size = new System.Drawing.Size(118, 27);
  117. this.btnCommit.TabIndex = 0;
  118. this.btnCommit.Text = "确定";
  119. this.btnCommit.UseVisualStyleBackColor = true;
  120. this.btnCommit.Click += new System.EventHandler(this.btnCommit_Click);
  121. //
  122. // tbxInput
  123. //
  124. this.tbxInput.Location = new System.Drawing.Point(12, 216);
  125. this.tbxInput.Multiline = true;
  126. this.tbxInput.Name = "tbxInput";
  127. this.tbxInput.Size = new System.Drawing.Size(409, 68);
  128. this.tbxInput.TabIndex = 1;
  129. //
  130. // tbxHistory
  131. //
  132. this.tbxHistory.Location = new System.Drawing.Point(109, 9);
  133. this.tbxHistory.Multiline = true;
  134. this.tbxHistory.Name = "tbxHistory";
  135. this.tbxHistory.ReadOnly = true;
  136. this.tbxHistory.Size = new System.Drawing.Size(311, 194);
  137. this.tbxHistory.TabIndex = 2;
  138. //
  139. // pictureBox1
  140. //
  141. this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
  142. this.pictureBox1.Location = new System.Drawing.Point(12, 12);
  143. this.pictureBox1.Name = "pictureBox1";
  144. this.pictureBox1.Size = new System.Drawing.Size(91, 87);
  145. this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
  146. this.pictureBox1.TabIndex = 3;
  147. this.pictureBox1.TabStop = false;
  148. //
  149. // ChatRobotForm
  150. //
  151. this.AcceptButton = this.btnCommit;
  152. this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
  153. this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  154. this.ClientSize = new System.Drawing.Size(433, 329);
  155. this.Controls.Add(this.pictureBox1);
  156. this.Controls.Add(this.tbxHistory);
  157. this.Controls.Add(this.tbxInput);
  158. this.Controls.Add(this.btnCommit);
  159. this.Name = "ChatRobotForm";
  160. this.Text = "聊天机器人";
  161. ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
  162. this.ResumeLayout(false);
  163. this.PerformLayout();
  164. }
  165. #endregion
  166. private System.Windows.Forms.Button btnCommit;
  167. private System.Windows.Forms.TextBox tbxInput;
  168. private System.Windows.Forms.TextBox tbxHistory;
  169. private System.Windows.Forms.PictureBox pictureBox1;
  170. }
  171. }

好了,代码很短,只有不到100行,还是有很多功能有待实现,后续还会不断改进的(如果有时间的话。。。)


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

闽ICP备14008679号