聊天机器人

最近研究微信公众平台,搭建了一个微信聊天机器人,调用小黄鸡的公众接口,实现在线和小黄鸡聊天的功能。

接口调用不是很麻烦,不过是php版本,所以研究了一下C#的功能模块,

Winfrom版

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace 小贱鸡
{
    public partial class Form1 : Form
    {
        private static string cookie = null;
        private string msg = "";
        private Thread th2 = null;
        private Thread th3 = null;
        private bool changed = false;

        public Form1()
        {
            InitializeComponent();
            simsimi.SetAllowUnsafeHeaderParsing20();
            Thread th = new Thread(new ThreadStart(Cookie_Thread));
            th2 = new Thread(new ThreadStart(Hi_Thread));
            th3 = new Thread(new ThreadStart(PowerOn_Thread));
            th.Start();
            th2.Start();
            th3.Start();
         }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {
                changed = true;
                msg = textBox1.Text;
                textBox1.Text = "";
                richTextBox1.Text += String.Format("Me:{0}\n", msg);
                changed = false;
            }
        } 

        private static void Cookie_Thread()
        {
            cookie = simsimi.GetCookie();
        }
        private void PowerOn_Thread()
        {
            while (cookie == null)
            {
                this.Invoke(new Action(Update_PowerText), null);
                Thread.Sleep(1500);
            }
             this.Invoke(new Action(Update_PowerFinalText), null);
        }
        private void Update_PowerText()
        {
            richTextBox1.Text += "正在开鸡中。。。\n";
        }
        private void Update_PowerFinalText()
        {
            richTextBox1.Text += "唔,终于开鸡了。\n小贱鸡:你好,我是小贱鸡。o(∩_∩)o\n";
        }
        private void Hi_Thread()
        {
            while (true)
            {
                while (changed)
                {
                    this.Invoke(new Action(Update_Text), null);
                    break;
                }
            }
        }
        private void Update_Text()
        {
            richTextBox1.Text += String.Format("小贱鸡:{0}\n", simsimi.Hi_Simsimi(msg,cookie));
        }

        private void textBox1_KeyUp(object sender, KeyEventArgs e)
       {
            if (e.KeyValue == 13)
            {
                if (textBox1.Text != "")
                {
                    changed = true;
                    msg = textBox1.Text;
                    textBox1.Text = "";
                    richTextBox1.Text += String.Format("Me:{0}\n", msg);
                    changed = false;
                }
            }
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            //设定光标所在位置
            this.richTextBox1.SelectionStart = richTextBox1.TextLength-1;
            //滚动到当前光标处
            this.richTextBox1.ScrollToCaret();
        } 

    }
}

Code

应用的类代码:应用接口用小黄鸡那边传回来的是一个json形式的内容,所以应用到json的解析问题,我应用的是网上通用的方法Newtonsoft.Json,可以从网上下载对应的DLL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.IO.Compression;
using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace 小贱鸡
{
    class simsimi
    {
        /// <summary>
        /// Cookie
        /// </summary>
        /// <returns></returns>
        public static string GetCookie()
        {
            string Cookiesstr = null;
            CookieCollection cookies = new CookieCollection();
            HttpWebRequest request = null;
            request = (HttpWebRequest)WebRequest.Create("http://www.simsimi.com/talk.htm");
            request.CookieContainer = new CookieContainer();
            request.CookieContainer.Add(cookies);
            //Get the response from the server and save the cookies from the request..
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Cookiesstr = request.CookieContainer.GetCookieHeader(request.RequestUri);

            return Cookiesstr;
        }

        public static string Hi_Simsimi(string que, string cookies)
        {
            string ans = "我们换个话题吧";
            string url = String.Format("http://www.simsimi.com/func/reqN?lc=ch&ft=0.0&req={0}&fl=http%3A%2F%2Fwww.simsimi.com%2Ftalk.htm", que);
            HttpWebRequest hi_request = null;
            try
            {
                hi_request = (HttpWebRequest)WebRequest.Create(url);
                hi_request.Method = "GET";
                hi_request.KeepAlive = true;
                hi_request.ServicePoint.Expect100Continue = false;

                hi_request.AllowWriteStreamBuffering = false;
                //终端信息
                hi_request.Accept = "application/json,text/javascript,*/*;q=0.01";
                hi_request.Headers.Add("Accept-Language", "zh-cn");
                hi_request.Headers.Add("Accept-Encoding", "gzip,deflate");
                hi_request.Headers.Add("Cookie", cookies + ";simsimi_uid=1;");
                hi_request.Referer = "http://www.simsimi.com/talk.htm";
                hi_request.UserAgent = "Mozilla/4.0(compatible;MSIE 7.0;Windows NT 6.1;Trident/5.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;.NET4.0C;.NET4.0E)";
                hi_request.ContentType = "application/json;charset=utf-8";

                hi_request.AllowAutoRedirect = false;
                HttpWebResponse hi_response = (HttpWebResponse)hi_request.GetResponse();
                StreamReader sr = new StreamReader(hi_response.GetResponseStream(), Encoding.UTF8);
                ans = sr.ReadToEnd();
                if (ans != "{}")
                {

                    JObject jo = JObject.Parse(ans);
                    string[] ArrayList = jo.Properties().Select(item => item.Value.ToString()).ToArray();
                    if (ArrayList[0] == "200")
                    {
                        ans = ArrayList[6];
                    }
                    else
                    {
                        ans = "没有听懂,可以再说一遍吗?";
                    }
                }
                hi_request.Abort();
                hi_response.Close();
            }
            catch (System.Exception e)
            {

                Console.WriteLine(e.ToString());
                //return e.ToString();
                return "不好意思死鸡了⊙︿⊙重启下程序吧~";
            }

            return ans;
        }

        public static bool SetAllowUnsafeHeaderParsing20()
        {
            //Get the assembly that contains the internal class
            Assembly aNetAssembly = Assembly.GetAssembly(typeof(System.Net.Configuration.SettingsSection));
            if (aNetAssembly != null)
            {
                //Use the assembly in order to get the internal type for the internal class
                Type aSettingsType = aNetAssembly.GetType("System.Net.Configuration.SettingsSectionInternal");
                if (aSettingsType != null)
                {
                    //Use the internal static property to get an instance of the internal settings class.
                    //If the static instance isn‘t created allready the property will create it for us.
                    object anInstance = aSettingsType.InvokeMember("Section",
                      BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.NonPublic, null, null, new object[] { });

                    if (anInstance != null)
                    {
                        //Locate the private bool field that tells the framework is unsafe header parsing should be allowed or not
                        FieldInfo aUseUnsafeHeaderParsing = aSettingsType.GetField("useUnsafeHeaderParsing", BindingFlags.NonPublic | BindingFlags.Instance);
                        if (aUseUnsafeHeaderParsing != null)
                        {
                            aUseUnsafeHeaderParsing.SetValue(anInstance, true);
                            return true;
                        }
                    }
                }
            }
            return false;
        }
    }
}

Code

时间: 2024-12-18 05:17:52

聊天机器人的相关文章

自己动手做聊天机器人教程

自己动手做聊天机器人 一-涉及知识(2016-06-09) 自己动手做聊天机器人 二-初识NLTK库(2016-06-10) 自己动手做聊天机器人 三-语料与词汇资源(2016-06-12) 自己动手做聊天机器人 四-何须动手?完全自动化对语料做词性标注(2016-06-17) 自己动手做聊天机器人 五-自然语言处理中的文本分类(2016-06-21) 自己动手做聊天机器人 六-教你怎么从一句话里提取出十句话的信息(2016-06-22) 自己动手做聊天机器人 七-文法分析还是基于特征好啊(20

基于Perfect用Swift语言编写Slack聊天机器人

基于Perfect用Swift语言编写Slack聊天机器人 本项目是专门为Slack聊天机器人定制的模板服务器. 完整的源代码下载在Github https://github.com/PerfectServers/SlackBot 在本项目模板中,一个聊天机器人可以加入授权频道,读取频道内所有用户发送的"曲奇"并记录在案,而且可以直接答复用户的有关曲奇饼干的问题. 预备知识 在您决定编译.测试或者部署您自己的基于Perfect软件框架体系的聊天机器人之前,以下基础知识??不可或缺??:

vue-miniQQ——基于Vue2实现的仿手机QQ单页面应用(接入了聊天机器人,能够进行正常对话)

使用Vue2进行的仿手机QQ的webapp的制作,作品由个人独立开发,源码中进行了详细的注释. 由于自己也是初学Vue2,所以注释写的不够精简,请见谅. 项目地址 https://github.com/jiangqizheng/vue-MiniQQ 项目已实现功能 对话功能--想着既然是QQ总要能进行对话交流,所以在项目中接入了图灵聊天机器人,可以与列表中的每个人物进行对话. 左滑删除--左滑删除相关消息. 搜索页面--点击右上角搜索按钮,能够进入搜索页面,输入对应的单词或者数字,动态查找好友.

分分钟搭建自己的微信聊天机器人

利用图灵机器人分分钟搭建自己的微信聊天机器人 需要准备的资源: 图灵机器人账号 微信公共账号 点击访问 图灵机器人官网,快快注册,拥有自己的聊天机器人,可以在这里先体验一下 今天主要简述微信公共平台聊天机器人的搭建,首先需要注册微信公共账号,之后在图灵机器人网站上登录你的图灵账号,可以看到如截图所示的界面,在"机器人设定"界面可以进行机器人昵称.年龄.性别等信息的设定,在"机器人调教"界面可以教你的机器人回答特定问题,"知识库"可以导入知识库,增

QQ 聊天机器人API

QQ机器人是腾讯陆续推出的的人工智能聊天机器人的总称.都说小Q妹妹聪明好学,我们可以教她说话,也可以请他帮忙查询邮编.手机号,或者解释成语.翻译成语,据说她还会查询手机号码归属地.应用科学计算器. 可是,在查新闻.查列车.车航班.查团购.查价格.查优惠.查酒店.查餐厅.查彩票等方面,小Q妹妹就弱爆了,"逆水行舟,不进则退"小Q妹妹真应该被pass掉了.笔者已经开始使用一款功能更强的机器人--图灵机器人.试一下这个高智商的机器人,她永远有耐心陪您聊天,不怕你调戏她,就怕你被她调戏.点这里

微软聊天机器人Zo说:比起Windows喜欢Linux

微软推出的首款聊天机器人 Tay 因为口出秽语和种族主义言论而被下架,随后该公司又悄悄推出了 Zo .不过本月早些时候,Zo 还是不可避免地引发了一些争议.虽然这次它避开了政治言论,但却对某教圣典进行了一番批判,称之"太过暴力".更糟糕的是,Zo 这款聊天机器人的行为再次变得"古怪"-- 它竟然在回答用户提问时明确表示,比起 Windows 10.自己更喜欢 Linux . 事情是这样的,当被问及"你是否喜欢 Windows"时,Zo 先回答了&

Tensorflow打造聊天机器人

Tensorflow聊天机器人 聊天机器人也叫做对话系统,是一个热门领域.微软.facebook.苹果.google.微信.slack都在上面做了大的投入,这是一波新的试图改变人和服务交流的创业浪潮.例如operator x.ai,chatfuel,以及一些库例如botkit,微软的bot开发库. 许多公司都希望机器人可以自然对话,和人类没有区别.并且许多对外声明说用了NLP和深度学习技术来实现这个目标.但围绕AI这些天花乱坠的宣传有时候也很难区别现实和虚化的差别. 我要在这个系列文章里将一些构

初识BOT聊天机器人

最近在想毕业设计做什么,因为在看Python,所以想做个Python项目,浏览网页看到了"BOT",据说这个今年(应该是过去的2016,还没适应~)有点火哈.闭关时间有点久,有点跟不上时代潮流了. BOT是什么?既然谈潮流这么高大上的东西当然不是简单指LOL里面的下路了.这里的BOT指的是ChatBot--聊天机器人. 这个我知道,微软小冰嘛,有调戏过.正好我一直想做一个用来提醒自己任务,安排时间的东西,可以和这个联系在一起,没毛病,继续百度Google. BOT的过去和现在 过去的B

用 AIML 开发人工智能聊天机器人

借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人.AIML 指的是 Artificial Intelligence Markup Language (人工智能标记语言),它不过是简单的可 XML (扩展标记语言)形式.本文的示例代码将带你初步领略如何借助 Python 创建属于你的人工智能聊天机器人. AIML 是什么? AIML由Richard Wallace发明.他设计了一个名为 A.L.I.C.E.  (Artificial Linguistics Internet

【智能聊天机器人】小花猫的成长之路——1.初生

大家好,我是大花猫~ 为了响应慕女神MM的号召,我也来把最近开始学习HTML5移动webApp开发的一些心得和经验分享出来~ 先自我介绍一下,我是一枚位于魔都上海的处女座Android攻城狮(- - )~ 一次机缘巧合情况下来到慕课网,并跟着<慕课网2048私人定制>这个教学视频学着写了一个属于我自己的2048(升职版),又在机缘巧合情况下参加了慕课举办的2048源码比赛,又机缘巧合下拿了一等奖!0.0 ! 从此爱上了慕课网~~~ -------以上为开场白,下面进入主题-------- 我这