轻量的 WebHook 工具:歪脖虎克

本篇文章聊聊轻量的网络钩子(WebHook)工具:歪脖虎克。

写在前面

这是一篇迟到很久的文章,在 21 年和 22 年的时候,我分享过两篇关于轻量的计划任务工具 Cronicle 的文章:《轻量的定时任务工具 Cronicle:前篇》、《使用 Docker 和 Traefik 搭建轻量美观的计划任务工具》。随后在文章的评论区和聊天群里,以及一些关联的开源项目 issue 区里,我总是能够收到关于最佳使用实践的问题。

开源项目 WebHook 的新版本:歪脖虎克

我一般都会推荐将 Cron 工具和 WebHook 工具结合使用,说到具体的 WebHook 的时候,我当时一般都推荐“GitHub 上我 fork 的那个开源软件”:soulteary/webhook。

自 2020 年,项目就陷入停滞状态

四年前,在我 fork 的软件仓库几乎不在更新后,原始项目的技术债务堆积越来越严重。

最近正好在折腾异步流程比较多的模型应用,正好把这个项目也顺带做一个翻新(开源分叉)。关于项目具体分叉的原因,我会在文末再做详细展开。

好啦,让我们开始折腾。

前置知识

鉴于文章的读者可能是新用户,那么让我们从前置知识的展开开始吧。

什么是 WebHook

WebHook 是一种常见的网络软件功能,通常用于连接异步的处理过程。直接介绍 WebHook 是什么会比较无趣,我们不妨参考 zapier 的 “WebHook 和 API 的异同” 来更直观的了解下 WebHook 的工作模式。

WebHook 和 API 的异同

相比较我们熟悉的 API 调用,尽管他们都能够将数据从一个地方发送到另外一个地方,完成数据的交互,但是通常 WebHook 都是异步、单向的,不强制要求即刻返回数据结果。

通常情况下,支持 WebHook 的功能的软件中能够定义一些自定义回调函数(Custom Callback Function),来让其他的外部程序在合适的时候调用这些函数,让一些被预先定义好的程序被调用,特别适合一些场景:

  • 比如,常见的耗时比较久的程序执行完毕,推送信息到用户,可以回调一个通知接口。
  • 比如,常见的多次跳转的支付过程,当用户扫码授权后,银行接口会回调我们购买商品的平台,告诉平台用户付款了。

歪脖虎克(soulteary/WebHook)是什么

歪脖虎克(WebHook)是一个用 Go 语言编写的轻量可配置的实用工具,它允许你轻松、快速的创建 HTTP 服务(钩子)。

“歪脖虎克”

你可以使用它来执行配置好的命令。并且还能够将 HTTP 请求中的数据(如请求头内容、请求体以及请求参数)灵活的传递给你配置好的命令、程序。当然,它也允许根据具体的条件规则来便触发钩子。

举个例子,如果你使用的是 GitHub 或 Gitea,可以使用歪脖虎克设置一个钩子,在每次你推送更改到项目的某个分支时,这个钩子会在你运行服务的设备上运行一个“更新程序部署内容”的脚本。

如果你使用飞书、钉钉、企业微信或者 Slack,你也可以设置一个“传出 Webhook 集成”或“斜杠命令”,来在你的服务器上运行各种命令。我们可以通过聊天工具的“传入 Webhook 集成”功能处理接口的响应内容,直接向你或你的 IM 会话或频道报告执行结果。

歪脖虎克(WebHook)的项目目标非常简单,只做它应该做的事情

  • 接收请求
  • 解析请求头、请求体和请求参数
  • 检查钩子指定的运行规则是否得到满足
  • 最后,通过命令行参数或环境变量将指定的参数传递给指定的命令

至于具体的命令,从处理数据、存储数据到用远程命令打开空调、关闭电脑,一些都由你做主,你可以实现任何你想要的事情,它只负责在合适的时间点,接受执行指令。

准备工作

开始实战之前,需要先获取程序文件。

下载“歪脖虎克”程序

目前下载程序有两个方法,下载在 GitHub 上通过自动化构建工具构建完毕的内容。

GitHub 程序发布页面

或者,使用 Docker 来快速下载程序。

# 下载最新的版本
docker pull soulteary/webhook:latest
# 下载指定版本的镜像
docker pull soulteary/webhook:3.4.5
# 下载包含了常用工具的镜像
docker pull soulteary/webhook:extend-3.4.5

当我们完成程序下载后,就可以开始使用啦。

查看软件文档(可选)

你可以在开源代码仓库的 docs 目录找到软件的中文使用文档,里面记录了:钩子的定义方法、具体的配置参数、如何解析和对请求参数进行调用命令参数绑定、各种常见的调用示例方法。

接下来,我们以一个简单的日常场景进行配置说明:使用 WebHook 和聊天工具进行联动,推送通知信息。

设置飞书的 WebHook 功能

其实我们日常使用的各种聊天工具,基本都支持使用 WebHook 方式进行交互。

嘿,你好呀👋

我这里以飞书为例,来实现一个能够从外部调用飞书 WebHook 发送消息的机器人。

和其他的聊天软件类似,在飞书里创建机器人的最简方案是先创建一个“聊天群组”。

创建一个飞书群

创建完毕后,戳开右上角的下拉菜单,找到“设置”选项。

找到设置菜单

进入设置选项后,能够看到群组的详细设置。

找到“机器人”菜单

点击“机器人”设置,能够看到一个新的弹出框,包含了许多不同类型的机器人。

添加一个“WebHook”机器人

这里,我们选择自定义机器人(WebHook)。

在机器人配置界面

在机器人配置界面中进行详细的自定义配置,比如可以设置个好看的头像,或者起个有趣的名字。

获得 WebHook 调用接口

点击确定,我们就能够得到 WebHook 程序调用所需要的接口地址啦。保存好地址,我们一会要用到。

获得 WebHook 调用接口

点击完成,机器人就被添加到群组中啦。

添加一个“WebHook”机器人

到这里为止,飞书的配置就完啦。

我们可以使用下面的命令,来验证接口是否能够被正确调用。

curl -X POST -H "Content-Type: application/json" --data '{"msg_type":"text","content":{"text":"嘿,你好呀👋"}}' \
    https://open.feishu.cn/open-apis/bot/v2/hook/6dca9854-381a-4bb9-a87b-33a222833e04

调用完毕,会出现类似下面的返回结果:

{"StatusCode":0,"StatusMessage":"success","code":0,"data":{},"msg":"success"}

在飞书的界面中,我们能够看到新出现的消息内容。

嘿,你好呀👋

接下来,我们来把“歪脖虎克”和飞书连接在一起,让程序内容能够动态化。

实战开始

在本文中,歪脖虎克可以将上面我们调用飞书 WebHook 接口的命令,赋予动态化调用的能力,并且提供更简单的调用接口,甚至提供额外的“接口验证”、关联的自动化处理信息能力。比如,当程序被调用的时候,能够根据具体的输入信息,结合上下文相关的资料,调用大模型接口,发送一段有趣的故事到群里。

考虑到复现的方便,我使用 Docker 环境的 “歪脖虎克”,直接使用二进制文件类似,只需要调整命令,在次不做赘述。

编写调用程序

我们先实现一个简单的程序,能够接收来自环境变量中的参数 $TEXT,并将参数中的内容传递到上面的飞书调用命令中(soulteary/webhook/example/lark/send-lark-message.sh):

#!/bin/sh

if [ -n "$TEXT" ]; then
    curl -X POST -H "Content-Type: application/json" --data {\"msg_type\":\"text\",\"content\":{\"text\":\"$TEXT\"}} \
        https://open.feishu.cn/open-apis/bot/v2/hook/6dca9854-381a-4bb9-a87b-33a222833e04
    echo "Send message successfully".
else
  echo "TEXT is empty"
fi

将上面的程序保存为 send-lark-message.sh (替换为你自己的飞书 API 地址)。然后我们对这个脚本赋予可执行权限:

chmod +x send-lark-message.sh

这里,我们也可以将上面的脚本程序替换成某些具备特定功能的程序,比如进行数据处理的程序,查询或者导出数据库文件的程序,调用大模型的能力等等。

编写配置文件

接下来,我们来编写一个让“歪脖虎克”来调用这个脚本的程序(soulteary/webhook/example/lark/hook-lark.yaml):

- id: lark
  execute-command: ./send-lark-message.sh
  command-working-directory: /app
  include-command-output-in-response: true
  include-command-out-in-response-on-error: true
  pass-environment-to-command:
    - source: url
      name: text
      envname: TEXT

我们将上面的内容保存为 hook-lark.yaml,“歪脖虎克” 的基本配置就准备完毕啦。

在上面的程序配置中,我们做了两件事,分别是:

  • 创建一个用于触发远程接口(飞书API)的脚本程序 send-lark-message.sh,能够在用户设置环境变量 TEXT 的时候,将环境变量内容传递到飞书发送消息参数中。
  • 创建了一个 id` 是 `lark 的 WebHook 配置,当 WebHook 被调用时,会自动调用位于 /app 目录的 send-lark-message.sh 脚本程序,将 URL 请求参数中的 text 内容转换为环境变量,传递给脚本程序,然后将脚本程序的执行结果展示给调用的用户。

编写容器配置文件或直接调用程序

为了稳定复现,我们再编写一个 docker-compose.yml 配置文件:

version: '2'

services:

  webhook:
    image: soulteary/webhook:extend-3.4.5
    ports:
      - 9000:9000
    environment:
      HOST: "0.0.0.0"
      PORT: 9000
      VERBOSE: true
      HOOKS: "/app/hook-lark.yaml"
    volumes:
      - ./hook-lark.yaml:/app/hook-lark.yaml
      - ./send-lark-message.sh:/app/send-lark-message.sh

保存这个配置文件和上面的两个配置到相同的目录后,我们执行 docker compose up,程序将运行在本机的 9000 端口。

如果你想直接运行程序,可以使用下面的命令:

./webhook --hooks ./example/lark/hook-lark.yaml --verbose 

一切顺利,你将看到类似下面的日志内容:

lark-webhook-1  | [webhook] 2024/04/06 07:52:11 version [3.4.5] starting
lark-webhook-1  | [webhook] 2024/04/06 07:52:11 setting up os signal watcher
lark-webhook-1  | [webhook] 2024/04/06 07:52:11 attempting to load hooks from /app/hook-lark.yaml
lark-webhook-1  | [webhook] 2024/04/06 07:52:11 os signal watcher ready
lark-webhook-1  | [webhook] 2024/04/06 07:52:11 found 1 hook(s) in file
lark-webhook-1  | [webhook] 2024/04/06 07:52:11 	loaded: lark
lark-webhook-1  | [webhook] 2024/04/06 07:52:11 serving hooks on http://0.0.0.0:9000/hooks/{id}

我们打开浏览器,访问 http://0.0.0.0:9000/hooks/lark?text=hey,将会很快得到下面的内容(命令行执行返回):

浏览器访问结果示意

当我们再次打开飞书的界面,能够看到消息已经发送到飞书中啦。当然,这个工具并非只能连接一个 API ,你可以通过它将一堆服务都关联起来,进行一些自动化操作,或者做一些需要定时、被动触发自动化处理的工作。

飞书中出现的“歪脖虎克”发送的消息

还记得之前文章提到的实现“计划任务”的 Cronicle 小工具吗?你可以通过类似这样的方法,将计划任务中的具体实现,都使用“歪脖虎克”来实现,而将任务调度和编排交给 Cronicle,这样的话,你可以分别维护不同的程序,甚至在合适的情况下,灵活的切换程序为其他的组件。

其他:为什么要进行开源分叉

在项目的文档中,我提到了主要有两个原因:

第一个是,原作者维护的 webhook 程序版本,是从比较陈旧的 Go 程序版本慢慢升级上来的。

其中,包含了许多不再被需要的内容,以及非常多的安全问题亟待修正。

第二个是,我在几年前曾经提交过一个改进版本的 PR,但是因为种种原因被作者忽略,与其继续使用明知道不可靠的程序,不如将它变的可靠。

这样,除了更容易从社区合并未被原始仓库作者合并的社区功能外,还可以快速对有安全风险的依赖作更新。除此之外,我希望这个程序接下来能够中文更加友好,包括文档。

开源项目贡献

当然,开源软件世界里,talk is cheap, code is everything.,目前看来,这个硬分叉项目应该是及格的吧 😄

最后

好啦,这篇文章就先写到这里,后面相关的文章中,我会试着分享一些更有趣的具体(偷懒)实践。

下篇文章再见。

–EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。

我们在里面会一起聊聊软硬件、HomeLab、编程上、生活里以及职场中的一些问题,偶尔也在群里不定期的分享一些技术资料。

关于交友的标准,请参考下面的文章:

苏洋:致新朋友:为生活投票,不断寻找更好的朋友

当然,通过下面这篇文章添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 😄

苏洋:关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2024年04月06日
统计字数: 7549字
阅读时间: 16分钟阅读
本文链接: https://soulteary.com/2024/04/06/lightweight-webhook-tool.html

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux(Ubuntu)中创建【samba】服务,用于和Windows系统之间共享文件

目录 1.先介绍一下什么是Samba 2.安装,配置服务 安装 配置(smb.conf) 配置用户 3.出现的问题(Failed to add entry for user XXXX) 4.创建文件夹 5.windows访问 1.先介绍一下什么是Samba Samba是一个开源的软…

2024.4.3-[作业记录]-day08-CSS 盒子模型(溢出显示、伪元素)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业 2024.4.3-学习笔记css溢出显示单行文本溢出显示省略号多行文本溢出显示省…

【Android】图解View的工作流程原理

文章目录 入口DecorView如何加载到Window中MeasureSpec MeasureView的测量ViewGroup的测量 LayoutView的layout() Draw1、绘制背景3、绘制View内容4、绘制子View6、绘制装饰 入口 DecorView如何加载到Window中 MeasureSpec 该类是View的内部类,封装View的规格尺寸…

C++资源重复释放问题

这不是自己释放了2次&#xff1b; 可能是类互相引用&#xff0c;有类似现象释放资源时引起&#xff1b;还不太了解&#xff1b; 类对象作为函数参数也会引起&#xff1b; 下面是一个简单示例&#xff1b; #include <iostream> #include <string.h> #include &l…

Spark-Scala语言实战(14)

在之前的文章中&#xff0c;我们学习了如何在spark中使用键值对中的fullOuterJoin&#xff0c;zip&#xff0c;combineByKey三种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点…

最优算法100例之36-扑克牌顺子

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了…

软考113-上午题-【计算机网络】-IPv6、无线网络、Windows命令

一、IPv6 IPv6 具有长达 128 位的地址空间&#xff0c;可以彻底解决 IPv4 地址不足的问题。由于 IPv4 地址是32 位二进制&#xff0c;所能表示的IP 地址个数为 2^32 4 294 967 29640 亿&#xff0c;因而在因特网上约有 40亿个P 地址。 由 32 位的IPv4 升级至 128 位的IPv6&am…

FaaF:利用事实作为评估RAG的函数方法

原文地址&#xff1a;faaf-facts-as-a-function-for-evaluating-rag 2024 年 4 月 5 日 在某些情况下&#xff0c;我们使用其他语言模型来验证RAG的输出结果&#xff0c;但这种方法并未能有效识别出数据生成过程中的错误和缺失。 论文解析 挑战 评估的可靠性和效率&#xff…

PyTorch之计算模型推理时间

一、参考资料 如何测试模型的推理速度 Pytorch 测试模型的推理速度 二、计算PyTorch模型推理时间 1. 计算CPU推理时间 import torch import torchvision import time import tqdm from torchsummary import summarydef calcCPUTime():model torchvision.models.resnet18()…

数据字典

文章目录 一、需求分析二、表设计&#xff08;两张表&#xff09;三、功能实现3.1 数据字典功能3.1.1 列表功能3.1.2 新增数据字典3.1.3 编辑数据字典 3.2 数据字典明细3.2.1 列表功能3.2.2 新增字典明细3.2.3 编辑字典明细 3.3 客户管理功能3.3.1 列表功能3.3.2 新增用户3.3.3…

页表基本原理

页表概念 CPU并不是直接访问物理内存地址&#xff0c;而是通过虚拟地址空间来间接访问物理内存地址&#xff1b;虚拟地址空间是操作系统为每个正在执行的进程分配一个逻辑地址&#xff1b;比如在32位系统(处理器和内存地址总线都是32位)&#xff0c;范围是0~(4G-1)&#xff1b…

docker基础学习指令

文章目录 [toc] docker基础常用指令一、docker 基础命令二、docker 镜像命令1. docker images2. docker search3. docker pull4. docker system df5. docker rmi1. Commit 命令 三、 docker 容器命令1. docker run2. docker logs3. docker top4. docker inspect5. docker cp6. …

CSS-语法、选择器

&#x1f4da;详见 W3scholl&#xff0c;本篇只做快速思维索引。 概述 CSS 是一种描述 HTML 文档样式的语言。 有三种插入样式表的方法&#xff1a; 外部 CSS内部 CSS行内 CSS &#x1f4c5; 外部 CSS 外部样式表存储在.css文件中。HTML 页面必须在 head 部分的<link&g…

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解 一、什么是Log4j2二、环境搭建三、简单使用Log4j2四、JDNI和RMI4.1、启动一个RMI服务端4.2、启动一个RMI客户端4.3、ldap 五、漏洞复现六、Python批量检测 参考视频&#xff1a;https://www.bilibili.com/video/BV1mZ4y1D7K…

深入浅出 -- 系统架构之Keepalived搭建双机热备

Keepalived重启脚本双机热备搭建 ①首先创建一个对应的目录并下载keepalived安装包&#xff08;提取码:s6aq&#xff09;到Linux中并解压&#xff1a; [rootlocalhost]# mkdir /soft/keepalived && cd /soft/keepalived [rootlocalhost]# wget https://www.keepalived.…

MYSQL 锁机制 与 MVCC多版本并发

MYSQL锁机制与优化以及MVCC底层原理 锁分类 乐观锁&#xff0c;悲观锁 从性能上分为乐观锁&#xff08;版本对比,版本一致就更新&#xff0c;不一致就不更新或CAS机制&#xff09;和悲观锁&#xff08;锁住资源等待&#xff09;&#xff0c;乐观锁适合读比较多的场景&#x…

无监督学习简介

无监督学习简介 一、定义和核心概念 无监督学习的定义 无监督学习是机器学习的一个关键分支&#xff0c;它涉及到从未标注数据中学习和提取信息。不同于其他学习类型&#xff0c;无监督学习的数据集没有提供任何显式的输出标签或结果。因此&#xff0c;这种学习方法的主要任务…

运放知识点总结

目录 一、运放基础知识 (operational amplifier) 1.由来 2.用途 3.符号 4.内部结构​编辑 5.虚短虚断 二、同相放大电路 &#xff08;Non-inverting Amplifier&#xff09; 三、反相放大电路 (Inverting Amplifier) 四、差分放大电路 (Difference Amplifier) 五、加法…

如何使用CSS构建一个瀑布流布局

如何使用CSS构建一个瀑布流布局 瀑布流布局是一种常见的网页布局方式&#xff0c;其中元素以不同的大小排列&#xff0c;且行与列之间没有不均匀的间隙。在瀑布流布局中&#xff0c;即使某一行或列中的元素较短&#xff0c;下一个元素也会占据空间。 如何实现瀑布流布局 实现…

MacOS Docker 可视化面板 Portainer

一、简介 Portainer 是一个可视化的容器镜像图形管理工具&#xff0c;使用 Portainer 可以轻松构建、管理和维护Docker 环境。 而且完全免费&#xff08;portainer-ce 是免费的&#xff0c;portainer-ee 是需要授权的&#xff0c;今天安装的是 portainer-ce 版本&#xff09;&…