• C#_Winform_聊天机器人


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

    接口调用不是很麻烦,不过是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}
    ", 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 += "正在开鸡中。。。
    ";
            }
            private void Update_PowerFinalText()
            {
                richTextBox1.Text += "唔,终于开鸡了。
    小贱鸡:你好,我是小贱鸡。o(∩_∩)o
    ";
            }
            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}
    ", 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}
    ", 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
  • 相关阅读:
    HDOJ 1220 Cube
    LCIS(m*n) 最长公共上升子序列
    第二百九十七天 how can I 坚持
    第二百九十六天 how can I 坚持
    第二百九十五天 how can i 坚持
    第二百九十四天 how can I 坚持
    第二百九十三天 how can I 坚持
    第二百九十、一、二天 how can I 坚持
    第二百八十九天 how can I 坚持
    第二百八十八天 how can I坚持
  • 原文地址:https://www.cnblogs.com/ingstyle/p/4079120.html
Copyright © 2020-2023  润新知