.NET 搭建简单的通知服务

搭建简单的通知服务

Intro

很多情况下,我们都会遇到一些需要进行通知报警的场景,比如说服务器资源监控报警,抢到火车票后通知用户进行付款。

原来主要是用的钉钉群里的机器人来做的通知,周末看到原来做 【Server 酱】的大佬写了一个简单的基于企业微信的微信推送,代码是 PHP 的非常简单,可以参考:https://github.com/easychen/wecomchan

于是就自己尝试了一下写了一个 C# 版的,这样就可以直接推送到微信上,对于不怎么用钉钉的小伙伴来说就更为方便了。

有的时候我会帮朋友做一些小东西会需要做通知,比如上次给朋友监控自如上的一个房子,有一个房子待解冻,朋友想要租这个房子,想要在解冻的第一时间去签约这个房子,于是就写了一个简单的定时去刷房子状态的一个小程序,当房子状态变化的时候就发一个通知给我朋友,这样就可以即时租到自己心仪的房子了。

觉得通知功能还是挺实用的所以结合之前一直在用的钉钉推送和刚学到的微信推送,写了一个小示例来分享一下我用来通知推送的代码,详细参考后面的内容

钉钉推送

有用过钉钉的小伙伴可能都知道,钉钉群可以添加机器人,通过调用机器人的 Web Hook 来发送通知,用起来非常的方便。

步骤一:获取自定义机器人Webhook

  1. 打开机器人管理页面。以PC端为例,打开PC端钉钉,点击头像,选择机器人管理

  2. 在机器人管理页面选择自定义机器人,输入机器人名字并选择要发送消息的群,同时可以为机器人设置机器人头像。

  3. 完成必要的安全设置,勾选我已阅读并同意《自定义机器人服务及免责条款》,然后单击完成

    目前有3种安全设置方式,请根据需要选择一种:

  • 自定义关键词:最多可以设置10个关键词,消息中至少包含其中1个关键词才可以发送成功。

    例如添加了一个自定义关键词:监控报警,则这个机器人所发送的消息,必须包含监控报警这个词,才能发送成功。

  • 加签

  • IP地址(段):设定后,只有来自IP地址范围内的请求才会被正常处理。支持两种设置方式:IP地址和IP地址段,暂不支持IPv6地址白名单,格式如下。

    格式说明
    1.1.1.1开发者的出口公网IP地址(非局域网地址)
    1.1.1.0/24用CIDR表示的一个网段

  1. timestamp+"\n"+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。

    参数说明
    timestamp当前时间戳,单位是毫秒,与请求调用时间误差不能超过1小时。
    secret密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串。

  2. 把 timestamp和第一步得到的签名值拼接到URL中。

    https://oapi.dingtalk.com/robot/send?access_token=XXXXXX&timestamp=XXX&sign=XXX
    

    参数说明
    timestamp第一步使用到的时间戳。
    sign第一步得到的签名值。

  • 完成安全设置后,复制出机器人的 Webhook 地址,可用于向这个群发送消息,格式如下:

    https://oapi.dingtalk.com/robot/send?access_token=XXXXXX 
    

    请保管好此Webhook 地址,不要公布在外部网站上,泄露后有安全风险

  • 通常建议使用关键词就可以了(之前的版本其实可以都不设置,后来的版本添加了限制,上面的几种方式需要选一种,推荐使用关键词方式,简单暴力)

    钉钉机器人推送代码:

    // 钉钉机器人推送用的 WebHook 地址
    private const string DingBotWebHookUrl ="https://oapi.dingtalk.com/robot/send?access_token=";public static async Task MainTest()
    {using var httpClient = new HttpClient();using var response = await httpClient.PostAsync(DingBotWebHookUrl,new StringContent(new {msgtype = "text", text = new {content = $"Test... {DateTime.Now:yyyy-MM-dd HH:mm:ss}"}}.ToJson(), Encoding.UTF8, "application/json"));var result = await response.Content.ReadAsStringAsync();Console.WriteLine($"发送钉钉消息通知,result:{result}");
    }
    

    企业微信推送

    这个是根据大佬的这个项目改的 https://github.com/easychen/wecomchan,原来项目的代码是 PHP 的,我改成了 C# 的,有需要的可以参考一下,现在的代码里比较简单没有对 access_token 做缓存,实际使用的时候建议进行缓存,token 快过期的时候再去申请新的 token。

    使用企业微信推送需要先注册一个企业微信号,不需要进行认证,用微信注册就好了,注册步骤引用大佬的介绍

    第一步,注册企业

    用电脑打开企业微信官网,注册一个企业

    第二步,创建应用

    注册成功后,点「管理企业」进入管理界面,选择「应用管理」 → 「自建」 → 「创建应用」

    应用名称填入「Server酱」,应用logo可以到这里下载,可见范围选择公司名。

    创建完成后进入应用详情页,可以得到应用ID( agentid )①,应用Secret( secret )②。

    注意:secret推送到手机端时,只能在企业微信客户端中查看。

    第三步,获取企业ID

    进入「我的企业」页面,拉到最下边,可以看到企业ID③,复制并填到上方。

    推送UID直接填 @all ,推送给公司全员。

    第四步,推送消息到微信

    进入「我的企业」 → 「微信插件」,拉到下边扫描二维码,关注以后即可收到推送的消息。

    上面的应用 id 和 logo 可以自定义,不必和上面保持一致

    钉钉的推送较为简单,直接调用一次接口就可以了,微信的稍微麻烦一些,需要先获取一下 access_token,然后再调用发消息的接口

    推送示例代码如下:

    // 企业 id
    private const string CorpId = "ww3508de6cad12eebd";
    // 应用 id
    private const string AppId = "1000003";
    // 应用 secret
    private const string AppSecret = "";
    // 要推送的用户,"@all" 表示全员推送
    private const string ToUid = "@all";public static async Task MainTest()
    {var getTokenUrl =$"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CorpId.UrlEncode()}&corpsecret={AppSecret.UrlEncode()}";using var httpClient = new HttpClient();var responseStr = await httpClient.GetStringAsync(getTokenUrl);Console.WriteLine(responseStr);var accessToken = JsonNode.Parse(responseStr)["access_token"].GetValue<string>();var sendMessageUrl =$"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={accessToken.UrlEncode()}";using var response = await httpClient.PostAsJsonAsync(sendMessageUrl,new{touser = ToUid,msgtype = "text",agentid = AppId,text = new {content = $"Test {DateTime.Now:yyyy-MM-dd HH:mm:ss}"}});responseStr = await response.Content.ReadAsStringAsync();Console.WriteLine(responseStr);
    }
    

    推送示例输出结果如下:

    More

    感觉还是钉钉的推送更简单一些,直接调用一次就好了,access_token 是固定的

    使用微信推送的时候最好考虑缓存 access_token ,不能频繁调用 gettoken 接口,否则会受到频率拦截

    上面的示例代码可以从 Github 获取

    References

    • https://github.com/WeihanLi/SamplesInPractice/tree/master/notificationSample

    • https://developers.dingtalk.com/document/app/custom-robot-access

    • https://github.com/easychen/wecomchan

    • https://work.weixin.qq.com/api/doc/90000/90003/90487

    • https://work.weixin.qq.com/api/doc/90000/90135/90236

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#程序设计教程 唐大仕pdf_C# 添加PDF水印

概述一般我们在向文档添加水印时&#xff0c;会分为直接添加文字水印和加载图片添加图片水印两种情况。常见的&#xff0c;在添加文字水印时会多以声明文档版权、权威性的文字、标语或者名称等&#xff1b;同样的&#xff0c;图片水印也通常可以是某组织的LOGO、印章、或者其他…

电脑病毒竟然被程序员当宠物养!网友:这些都是我逝去的青春

全世界只有3.14 % 的人关注了数据与算法之美起电脑病毒&#xff0c;大家第一时间应该是想到的熊猫烧香&#xff0c;木马等等吧。很多电脑病毒破坏力惊人&#xff0c;熊猫烧香在当年也是让全国人民都陷入一种恐慌状态。但对于我们程序员来说&#xff0c;看过的病毒跟吃的米一样多…

.NET5 WPF进阶教程

↑↑↑ 点击左上角蓝字关注我&#xff0c;为您提供技术新动态。本期内容一、概要本系列将继《.net wpf快速入门教程》带领大家了解wpf&#xff0c;帮助各位在初级向中级过渡的中掌握基本该具备的能力。本系列视频长度大约在15分钟到30分钟左右&#xff0c;视频内容不仅仅会讲解…

python二维列表写入excel_用Python实现合并excel列表

python操作excel主要用到xlrd和xlwt这两个库&#xff0c;即xlrd是读excel&#xff0c;xlwt是写excel的库。安装xlrd模块&#xff0c;在安装好python的环境下&#xff0c;打开cmd&#xff0c;输入pip install xlrd 回车。安装好后&#xff0c;再输入pip install xlrd回车&#x…

C语言入门经典材料领走不谢!

小天从大学开始&#xff0c;便开启资料收集功能。近几年以大数据的飞速发展&#xff0c;计算机科技进入新的发展阶段&#xff0c;再加上日常的深入研究&#xff0c;小天收集整理了丰富的C语言资料&#xff0c;内容涵盖“入门经典”&#xff0c;“考试必备材料”等。截止到今天&…

vue html引入图片,vue引入图片的几种方式

情况1&#xff1a;图片在/public目录下把图片放到与index.html同级的目录下情况1-1.png方式1因为vue编译后会生成index.html&#xff0c;所以我们将图片与index.html放在同一目录下&#xff0c;相当于在index.html中使用引入图片情况2&#xff1a;图片在/src/assets目录下把图片…

WPF 分页控件的简单实现

想做个分页控件&#xff0c;想了想逻辑实现太复杂了&#xff0c;这不&#xff0c;用奇怪的方式实现了它&#xff0c;就如这张图一样。。。看看效果&#xff1a;下面就直接粘代码喽&#xff1a;新建一个Pagination类&#xff1a;using System; using System.Collections.Generic…

两向量点乘坐标运算_高三数学冲刺复习之向量小题的题型总结(含好用的补充公式)...

高考中&#xff0c;向量小题常从以下几个方面来考查&#xff1a;1、平面向量的有关概念与平面向量的线性运算&#xff0c;主要考查向量的加法、减法运算&#xff0c;考查向量的数乘运算及其几何意义。2、考查平面向量的坐标&#xff1a;主要考查平面向量基本定理及其意义&#…

全球最厉害的14位程序员!

全世界只有3.14 % 的人关注了数据与算法之美导读&#xff1a;全球最厉害的14位程序员是谁&#xff1f;一起来看下让我们膜拜的这些大神都有哪些&#xff1f;&#xff08;排名不分先后&#xff09;01 Jon Skeet个人名望&#xff1a;程序技术问答网站Stack Overflow总排名第一的大…

.net5或.net6(Preview) 之 顶级语句

创建一个控制台项目&#xff0c;.net5或.net6(Preview)&#xff0c;在Program.cs中写如下代码&#xff0c;F5&#xff0c;能顺利跑起来&#xff0c;没有Program类&#xff0c;没有Main函数。这是C#9带来的顶级语句的功能。System.Console.WriteLine("你好,C#");其实这…

班尼机器人维修方法_梅州市ABB机器人控制器维修中心

梅州市ABB机器人控制器维修中心库卡机器人KSP600-3X64库卡KSP控制器驱动器报警KSP600-3X64/00198268KSP600-3x20/ECMAS3D2224BE531/KSP600-3x40/ECMAS3D4444BE531/产品名称:库卡KSP600-3X64伺服包维修库卡KR控制系统伺服包型号:库卡机器人驱动模块KSP600-3x20/ECMAS3D2224BE531…

c# 获取当前活动窗口句柄,获取窗口大小及位置

2019独角兽企业重金招聘Python工程师标准>>> 需调用API函数 需在开头引入命名空间 using System.Runtime.InteropServices; 获取当前窗口句柄:GetForegroundWindow() [DllImport("user32.dll", CharSet CharSet.Auto, ExactSpelling true)] public stat…

Uno 平台 一 WinUI终极跨平台方案(二)

上篇《Uno 平台 一 WinUI终极跨平台方案&#xff08;一&#xff09;》简单介绍了Uno平台3.6版本的更新内容&#xff0c;大家评论里持怀疑态度的人很多&#xff0c;主要还是Uno平台非微软官方发布&#xff0c;咱们.net技术方向的已经习惯于在微软一家技术支持下&#xff0c;最多…

java 方法执行结束局部变量释放_Java方法执行的内存模型

Java虚拟机栈&#xff1a;Java方法执行的内存模型Java虚拟机栈&#xff1a;Java方法执行的内存模型Java方法执行的内存模型当前线程&#xff1a;当前栈帧局部变量表操作数栈动态链接返回地址等信息...栈帧3栈帧2栈帧1线程3线程2线程1每个方法一被调用&#xff0c;就会有一个栈帧…

程序员单身真的是有理由的吗?

全世界只有3.14 % 的人关注了数据与算法之美因为特殊职业的缘故程序员身边的女孩可谓是少之又少工作忙碌&#xff0c;没时间谈恋爱所有单身也就不足为奇了不过&#xff0c;通过我们观察&#xff0c;还是有不少程序员早早脱了单至于&#xff0c;脱单失败的各位&#xff0c;那真的…

瞒不住了,难怪.NET进大厂这么难!

六一儿童节&#xff0c;代表着金三银四铜五的跳槽季正式过去了&#xff0c;几家欢喜几家愁&#xff01;既看到微软腾讯阿里百度的大厂offer&#xff0c;又不禁羡慕30k、40k、50k的高薪&#xff0c;当然更多的&#xff0c;其实还是各种面试被怼的故事。成功的经验五花八门&#…

华为Mate30与大疆手机云台3_更便捷更从容,大疆DJI OM 4手机云台使用体验

不多不少&#xff0c;距离2019年的8月正好过去了一年。在去年8月&#xff0c;大疆为消费者带来了全新的手机云台——OSMO Mobile 3&#xff0c;其最大特点莫过于采用可折叠式的机身设计以及那仅为405g的云台重量&#xff0c;让手机云台随身携带不再是一种累赘&#xff0c;而是一…

数理思维这样培养才有效,从小就赢在方法上,每本不足3元!!

▲卢sir特别推荐点击上图进入玩酷屋重视教育的家长会发现&#xff0c;以前盛行的“学好数理化&#xff0c;走遍天下都不怕”&#xff0c;现在教育部和学校都超重视的STEAM教育&#xff0c;数学和物理一直都是其中最为重要的学科。从长远的教育来看&#xff0c;数理思维好的孩子…

16 个 Linux 服务器监控命令和watch

如果你想知道你的服务器正在做干什么&#xff0c;你就需要了解一些基本的命令&#xff0c;一旦你精通了这些命令&#xff0c;那你就是一个 专业的 Linux 系统管理员。 有些 Linux 发行版会提供 GUI 程序来进行系统的监控&#xff0c;例如 SUSE Linux 就有一个非常棒而且专业的工…

计算机的科学原理是什么,人工智能的工作原理是什么?

原标题&#xff1a;人工智能的工作原理是什么&#xff1f;人工智能的工作原理是&#xff1a;计算机会通过传感器(或人工输入的方式)来收集关于某个情景的事实。计算机将此信息与已存储的信息进行比较&#xff0c;以确定它的含义。计算机会根据收集来的信息计算各种可能的动作&a…