• C# Winfrom小黄鸡功能调用


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

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

    Winfrom版

    后台界面代码为

      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.Windows.Forms;
      9 using System.Threading;
     10 
     11 namespace 小贱鸡
     12 {
     13     public partial class Form1 : Form
     14     {
     15         private static string cookie = null;
     16         private string msg = "";
     17         private Thread th2 = null;
     18         private Thread th3 = null;
     19         private bool changed = false;
     20 
     21         public Form1()
     22         {
     23             InitializeComponent();
     24             simsimi.SetAllowUnsafeHeaderParsing20();
     25             Thread th = new Thread(new ThreadStart(Cookie_Thread));
     26             th2 = new Thread(new ThreadStart(Hi_Thread));
     27             th3 = new Thread(new ThreadStart(PowerOn_Thread));
     28             th.Start();
     29             th2.Start();
     30             th3.Start();
     31          }
     32 
     33         private void button1_Click(object sender, EventArgs e)
     34         {
     35             if (textBox1.Text != "")
     36             {
     37                 changed = true;
     38                 msg = textBox1.Text;
     39                 textBox1.Text = "";
     40                 richTextBox1.Text += String.Format("Me:{0}
    ", msg);
     41                 changed = false;
     42             }
     43         } 
     44 
     45         private static void Cookie_Thread()
     46         {
     47             cookie = simsimi.GetCookie();
     48         }
     49         private void PowerOn_Thread()
     50         {
     51             while (cookie == null)
     52             {
     53                 this.Invoke(new Action(Update_PowerText), null);
     54                 Thread.Sleep(1500);
     55             }
     56              this.Invoke(new Action(Update_PowerFinalText), null);
     57         }
     58         private void Update_PowerText()
     59         {
     60             richTextBox1.Text += "正在开鸡中。。。
    ";
     61         }
     62         private void Update_PowerFinalText()
     63         {
     64             richTextBox1.Text += "唔,终于开鸡了。
    小贱鸡:你好,我是小贱鸡。o(∩_∩)o
    ";
     65         }
     66         private void Hi_Thread()
     67         {
     68             while (true)
     69             {
     70                 while (changed)
     71                 {
     72                     this.Invoke(new Action(Update_Text), null);
     73                     break;
     74                 }
     75             }
     76         }
     77         private void Update_Text()
     78         {
     79             richTextBox1.Text += String.Format("小贱鸡:{0}
    ", simsimi.Hi_Simsimi(msg,cookie));
     80         }
     81 
     82         private void textBox1_KeyUp(object sender, KeyEventArgs e)
     83        {
     84             if (e.KeyValue == 13)
     85             {
     86                 if (textBox1.Text != "")
     87                 {
     88                     changed = true;
     89                     msg = textBox1.Text;
     90                     textBox1.Text = "";
     91                     richTextBox1.Text += String.Format("Me:{0}
    ", msg);
     92                     changed = false;
     93                 }          
     94             }
     95         }
     96 
     97         private void richTextBox1_TextChanged(object sender, EventArgs e)
     98         {
     99             //设定光标所在位置 
    100             this.richTextBox1.SelectionStart = richTextBox1.TextLength-1;
    101             //滚动到当前光标处 
    102             this.richTextBox1.ScrollToCaret();
    103         } 
    104 
    105     }
    106 }
    View Code

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

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Net;
      6 using System.IO;
      7 using System.IO.Compression;
      8 using System.Reflection;
      9 using Newtonsoft.Json;
     10 using Newtonsoft.Json.Linq;
     11  
     12 
     13 namespace 小贱鸡
     14 {
     15     class simsimi
     16     {
     17         /// <summary>
     18         /// Cookie
     19         /// </summary>
     20         /// <returns></returns>
     21         public static string GetCookie()
     22         {
     23             string Cookiesstr = null;
     24             CookieCollection cookies = new CookieCollection();
     25             HttpWebRequest request = null;
     26             request = (HttpWebRequest)WebRequest.Create("http://www.simsimi.com/talk.htm");
     27             request.CookieContainer = new CookieContainer();
     28             request.CookieContainer.Add(cookies);
     29             //Get the response from the server and save the cookies from the request..
     30             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
     31             Cookiesstr = request.CookieContainer.GetCookieHeader(request.RequestUri);
     32 
     33             return Cookiesstr;
     34         }
     35  
     36 
     37         public static string Hi_Simsimi(string que, string cookies)
     38         {
     39             string ans = "我们换个话题吧";
     40             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);
     41             HttpWebRequest hi_request = null;
     42             try
     43             {
     44                 hi_request = (HttpWebRequest)WebRequest.Create(url);
     45                 hi_request.Method = "GET";
     46                 hi_request.KeepAlive = true;
     47                 hi_request.ServicePoint.Expect100Continue = false;
     48 
     49                 hi_request.AllowWriteStreamBuffering = false;
     50                 //终端信息
     51                 hi_request.Accept = "application/json,text/javascript,*/*;q=0.01";
     52                 hi_request.Headers.Add("Accept-Language", "zh-cn");
     53                 hi_request.Headers.Add("Accept-Encoding", "gzip,deflate");
     54                 hi_request.Headers.Add("Cookie", cookies + ";simsimi_uid=1;");
     55                 hi_request.Referer = "http://www.simsimi.com/talk.htm";
     56                 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)";
     57                 hi_request.ContentType = "application/json;charset=utf-8";
     58 
     59                 hi_request.AllowAutoRedirect = false;
     60                 HttpWebResponse hi_response = (HttpWebResponse)hi_request.GetResponse();
     61                 StreamReader sr = new StreamReader(hi_response.GetResponseStream(), Encoding.UTF8);
     62                 ans = sr.ReadToEnd();
     63                 if (ans != "{}")
     64                 {
     65 
     66                     JObject jo = JObject.Parse(ans);
     67                     string[] ArrayList = jo.Properties().Select(item => item.Value.ToString()).ToArray();
     68                     if (ArrayList[0] == "200")
     69                     {
     70                         ans = ArrayList[6];
     71                     }
     72                     else
     73                     {
     74                         ans = "没有听懂,可以再说一遍吗?";
     75                     }
     76                 }
     77                 hi_request.Abort();
     78                 hi_response.Close();
     79             }
     80             catch (System.Exception e)
     81             {
     82 
     83                 Console.WriteLine(e.ToString());
     84                 //return e.ToString();
     85                 return "不好意思死鸡了⊙︿⊙重启下程序吧~";
     86             }
     87 
     88             return ans;
     89         }
     90 
     91       
     92  
     93         public static bool SetAllowUnsafeHeaderParsing20()
     94         {
     95             //Get the assembly that contains the internal class
     96             Assembly aNetAssembly = Assembly.GetAssembly(typeof(System.Net.Configuration.SettingsSection));
     97             if (aNetAssembly != null)
     98             {
     99                 //Use the assembly in order to get the internal type for the internal class
    100                 Type aSettingsType = aNetAssembly.GetType("System.Net.Configuration.SettingsSectionInternal");
    101                 if (aSettingsType != null)
    102                 {
    103                     //Use the internal static property to get an instance of the internal settings class.
    104                     //If the static instance isn't created allready the property will create it for us.
    105                     object anInstance = aSettingsType.InvokeMember("Section",
    106                       BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.NonPublic, null, null, new object[] { });
    107 
    108                     if (anInstance != null)
    109                     {
    110                         //Locate the private bool field that tells the framework is unsafe header parsing should be allowed or not
    111                         FieldInfo aUseUnsafeHeaderParsing = aSettingsType.GetField("useUnsafeHeaderParsing", BindingFlags.NonPublic | BindingFlags.Instance);
    112                         if (aUseUnsafeHeaderParsing != null)
    113                         {
    114                             aUseUnsafeHeaderParsing.SetValue(anInstance, true);
    115                             return true;
    116                         }
    117                     }
    118                 }
    119             }
    120             return false;
    121         }
    122     }
    123 }
    View Code
  • 相关阅读:
    Codeforces Beta Round #69 (Div. 2 Only)
    Codeforces Beta Round #67 (Div. 2)
    Codeforces Beta Round #65 (Div. 2)
    UmBasketella
    Codeforces Beta Round #63 (Div. 2)
    [agc004d]Teleporter
    [arc076f]Exhausted?
    NOIp模拟赛二十八
    CDQ分治笔记
    (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
  • 原文地址:https://www.cnblogs.com/xiao-bei/p/3987701.html
Copyright © 2020-2023  润新知