概述

个人微信通知,这个功能我不止一次想要实现了!并不是为别人,而是为了方便自己。因为一旦有了这个功能,太多需要自己花心思去关注的事情就都可以全权交给程序来监控,并在需要时向自己发送提醒,简直是大解放。这篇记录就是向你分享,我是如何借助 Server酱 来实现这个通知功能的,如果你觉得有用,也可以将其引入到你自己的项目中,从此享受自己订阅自己的轻松。

Title


一、简单说明

简单说两句,不知道各位有没有遇到这种境况,对于网络上某些需要持续关注的事情,可以通过程序来监控其变化,但是却苦于将捕获到的变化及时地让自己知道。

  • 例如对于考研人来说,通常需要在相关的时间段内关注相关高校的通知发布,但是时不时去刷官网又感觉让自己分心;

  • 又如自己服务器或站点上有一些自己关心的数据出现或数据异常时,希望自己能够及时知悉;

  • 再如一些需要花很长时间去跑的程序,肯定希望在程序跑完出结果后的第一时间就告诉你:“嘿,我完了!”/大雾。

对于我们这些码农来说,实现这些信息的监控和收集通常来说非常容易,但好像并没有一个简单好用的办法能将这些我们关心的数据变动及时地推送给自己,而不仅仅是简单地通过一堆 log 记录下来而已。

而就在今天,我意外地发现了 Server酱(ServerChan) 这一个人通知推送神器,可以通过极简的一条 GET 请求完成消息推送,可谓简到了极致,简致了!本篇就是记录基于 ServerChan 的个人微信通知的封装。

至于 ServerChan 的具体介绍,大家可以自行去官网了解。

当然,你也可以选择邮件方式实现推送,但是显然没有 ServerChan 来的简单和通用。

二、准备工作

1. 获取SCKEY

获取 SCKEY 的方法非常简单,进入 ServerChan 后用 Github 帐号登录网站,即刻便可得到你的专属 SCKEY。

2. 绑定微信

点击导航栏的 [微信推送],用微信扫描二维码关注公众号并在页面中 [检查结果并确认绑定] 即可。

3. 测试一下

直接在 [发送消息] 页面的在线发送消息工具中填写标题和消息内容,点击发送消息就可以测试通知效果了。

或者直接将下面的 [你的SCKEY] 替换成你的 SCKEY 然后直接在浏览器中访问也可以测试,不出意外的话你的微信很快就收到测试消息了。

https://sc.ftqq.com/你的SCKEY.send?text=测试消息

Title

图1 ServerChan自带的在线测试工具

三、封装一下

这么好用的神器,肯定是造个轮子好上路了,这里我直接创建 .Net Standard 类库,方便以后在任何需要通知功能的项目中直接引用。

using System;
using System.IO;
using System.Net;
using System.Text;
namespace Sunwish.Notifier
{
    /// <summary>
    /// 籍由公众号向指定微信推送消息
    /// </summary>
    public class WechatNotifier
    {
        /// <summary>
        /// Server酱 SCKEY,从 http://sc.ftqq.com/ 获取并绑定微信生效
        /// </summary>
        public string SCKEY { get; set; }

        readonly string baseUrl = @"https://sc.ftqq.com/";

        /// <summary>
        /// 
        /// </summary>
        /// <param name="SCKEY">Server酱 SCKEY,从 http://sc.ftqq.com/ 获取</param>
        public WechatNotifier(string SCKEY)
        {
            this.SCKEY = SCKEY;
        }

        /// <summary>
        /// 推送通知
        /// </summary>
        /// <param name="title">通知标题</param>
        /// <param name="content">通知正文</param>
        /// <returns></returns>
        public bool SendNotifier(string title, string content)
        {
            string url = BuildUrl(SCKEY, title, content);
            string retnMessage = HttpGet(url);
            return retnMessage.IndexOf("success") != -1;
        }

        private string BuildUrl(string sckey, string title, string content)
        {
            return baseUrl + sckey + ".send?text=" + title + "&desp=" + content;
        }

        /// <summary>
        /// 获取HTTP GET请求的返回文本
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        private string HttpGet(string url)
        {
            string result = String.Empty;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream stream = response.GetResponseStream();
            if (stream != null)
            {
                using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("GB2312")))
                {
                    result = reader.ReadToEnd();
                    reader.Close();
                }
            }
            return result;
        }
    }
}

四、再测一下

随便打开一个项目,安装刚刚打包的 Nuget 包,然后在相关位置编码进行消息推送。经过几次实测,基本上每一次都在3秒以内就接收到了微信提醒,可以说推送的还是非常及时的。

Title

图2 安装自己写的 Nuget 包

Title

图3 在相关位置调用消息推送

Title

图4 在微信收到了消息推送通知

Title

图5 消息详情页

五、小结

Emmm,总的来说,这应该可以算是一个能够提升码农幸福感的小玩意儿吧hhh,毕竟很多时候功能本身是好实现的,但是总感觉你和你的程序之间是隔离的,它跑它的,你测你的,没有一种稳定的交互感,可一旦你的程序可以自动向你汇报时,一切就不一样了,好像瞬间多了一个知心小助手/捂脸。

注意事项

ServerChan 推送页面采用 Parsedown 1.7.3 进行渲染,语法可以参考这里。在 Markdown 语法中,两个空行才是换行,所以在推送消息中,需要换行的地方需要两次换行的。