企業微信開發[windows服務定時發送消息]

背景

最近項目上要實現連接企業微信的接口,然後發送消息,並且是定時發送消息,所以針對這塊做了研究並且實現了方案


What is windows服務

最常見的大家應該都是dos窗口或者是form窗口,而windows服務就是實現當你的服務開啓,則他就開啓,當你把他的服務關閉則他也就是關閉,通常只要我們開啓之後,電腦不關機,那麼他就一直運行着,它是可以長時間運行的可執行應用程序,他不需要界面,非常適合與在服務器上運行,


如何創建windows服務

這裏寫圖片描述


這裏寫圖片描述


這裏寫圖片描述


這裏寫圖片描述


這裏寫圖片描述



安裝服務服務

  • 必須以管理員的身份運行
  • 打開vs的dos界面
  • 輸入自己vs中Framwork的版本號,例如
  • d:\Windows\Microsoft.NET\Framework\v4.0.30319 回車
  • 找到自己的應該程序(在我們的項目中bin下的begun下有一個exe應用程序)
  • 在dos中輸入:
    E:\TestApp\Winform\WinServiceTest\WinServiceTest\bin\Debug\XX.exe表示項目生成的exe文件位置

  • 這個時候打開服務你就會看見自己的服務了
    這裏寫圖片描述


代碼編寫

獲取accesstoken

  public static string getAccessToken()
          {
              //企業的唯一id
              string appid = "不可以泄密哦";
              //密包 ,。
              string appsecret = "不可以泄密哦";


            //實例化一個access_token 
            string access_token = null;
            //傳送的地址和id,還是密保
            string url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + appid + "&corpsecret=" + appsecret;

            string jsonReturn = "";

            //用於發送和接受Http數據
            //使用system.net命名空間 
            //他有一點跟我們普通的對象不一樣,就是他不是用new不出來的對象,使用.Cretate()方法創建                                                                               
            HttpWebRequest httprequest = (HttpWebRequest)WebRequest.Create(url);
            //請求的方式爲get類型
            httprequest.Method = "GET";
           //讀取服務器返回的信息
            HttpWebResponse response = (HttpWebResponse)httprequest.GetResponse();
            using (Stream steam = response.GetResponseStream())
            {
                //我們使用stock表示把一個文本發送到機器中,而使用Encode發送給我們可以識別的數字
                StreamReader reader = new StreamReader(steam, Encoding.GetEncoding("gb2312"));
                //表示一次性的返回整個信息
                jsonReturn = reader.ReadToEnd();
                //關閉數據流
                steam.Close();
            }
              JObject jo = JObject.Parse(jsonReturn);
               access_token = jo["access_token"].ToString();
               return access_token;
             }           
          }

編寫接口發

          string AgentId = "1000003";

          string postText = "{\"touser\" :\"@all\",\"toparty\" : \"@all\",\"totag\" : \"@all\",\"msgtype\" : \"text\",\"agentid\" : " + AgentId + ",\"text\" : {\"content\" : \"我是王大美人\n加油。\"},\"safe\":0}";

          //轉化爲字節流的形式byte[],處了有utf-8的形式還有GB2312的形式,還有default形式,但是utf-8解決亂碼問題
          //達到95%,而default達到90%
          Encoding encoding = Encoding.GetEncoding("utf-8");
          //調用方法把字符串中的所有字符編碼爲一個字節序列
          byte[] bytesToPost = encoding.GetBytes(postText);
          //執行post提交方法,把地址和內容傳輸過去
          string res = Post(url, bytesToPost);
          //輸出字符串,展現
          Console.WriteLine(res);
      }

post方式提交

 private static string Post(string url, byte[] bytesToPost)
          {
              //判斷我的鏈接地址字符串是否爲空,他的空表示的是“ ”
              //用這種方式寫的好處是方便閱讀,而且快上百萬毫秒以上
              if (String.IsNullOrEmpty(url))
                  return "url參數爲空值";
              //判斷內容是否爲空
              if (bytesToPost == null)
                  return "post數據爲空值";
              string ResponseString = "";
              //創建一個請求
              HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
              //如果存在太多數目的alive的http請求,大於你設置的,那麼當你再次提交同樣的http的request,調用GetResponse就會發生超時,所以我們設置爲50
              System.Net.ServicePointManager.DefaultConnectionLimit = 50;
              //TCP中一個可以檢測死鏈接的機制,可以不用false
              request.KeepAlive = false;
              //提交方式爲post提交
              request.Method = "POST";
              //內容的類型
              request.ContentType = "text/xml";//提交xml   
              //內容的長度,表示http的頭
              request.ContentLength = bytesToPost.Length;
              //寫入到internet中的Stream,用戶傳輸
              Stream writer = request.GetRequestStream();
              //把當前的流寫入字符序列,第一代表字節,第二是從0的位置開始,第三個是長度
              writer.Write(bytesToPost, 0, bytesToPost.Length);
              //來自internet的資源相應
              HttpWebResponse HttpWebRespon = (HttpWebResponse)request.GetResponse();
              //1要讀取的流,2要轉換爲的字節編碼,把指點的字節編碼轉換爲制定的流
              StreamReader myStreamReader = new StreamReader(HttpWebRespon.GetResponseStream(), Encoding.UTF8);
              //從流的當前爲值到流的最後字節的位置
              ResponseString = myStreamReader.ReadToEnd();
              myStreamReader.Close();
              //清除流中所有的緩衝區
              writer.Flush();
              if (writer != null)
              {
                  writer.Close();
              }
              if (request != null)
              {
                  //取消對資源的相應
                  request.Abort();
              }
              return ResponseString;
          }

windows服務代碼

   public partial class Service1 : ServiceBase
    {
        //定時器  
        System.Timers.Timer t = null;  

        public Service1()
        {
            InitializeComponent();
            //啓用暫停恢復  
            base.CanPauseAndContinue = true;

            //每5秒執行一次  
            t = new System.Timers.Timer(5000);
            //設置是執行一次(false)還是一直執行(true);  3600000

            t.AutoReset = true;
            //是否執行System.Timers.Timer.Elapsed事件;  
            t.Enabled = true;
            //到達時間的時候執行事件(theout方法);  
            t.Elapsed += new System.Timers.ElapsedEventHandler(theout);  
        }

        protected override void OnStart(string[] args)
        {
            string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "啓動";


        }

        protected override void OnStop()
        {
            string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止";

        }

        public void theout(object source, System.Timers.ElapsedEventArgs e)
        {
            send.SendWechat();  

        }  

展現成功

這裏寫圖片描述


總結

這一次算是自己對自己的一個突破把!很開心實現這個功能!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章