Webhook配置参考
jeessy2 opened this issue · 73 comments
可把大家常用的Webhook通知分享出来,只分享,不提问,无关的将被删除
企业微信
下载企业微信→左上角三横杠→全新创建企业→个人组件团队(创建个人的企业群聊),
进入群聊添加 [群机器人] 复制机器人Webhook地址填入ddns-go后台Webhook URL地址栏。
在RequestBody栏填入回调函数,格式:
{ "msgtype": "markdown","markdown": { "content": "公网IP变更:\n 新IPV6地址:#{ipv6Addr} \n 已解析的域名:#{ipv6Domains} \n 域名更新结果:#{ipv6Result}" } }
饭碗警告
链接:https://fwalert.com (含 aff,注册后会赠送 10 元余额)
支持通过 邮件(0.02元/次)、短信(0.1元/次)、电话(0.2元/次)、Telegram(免费)、饭碗警告App(免费) 的方式推送通知。
先点击右上角头像选择“联系方式”并在此对你所希望的通知渠道进行绑定,然后进入“转发规则”,点击加号新建规则,其中触发方式选择 Webhook,可参照下图添加模板变量,并依据你所设置的模板变量来设置通知正文,最后联系方式选择先前绑定的通知渠道即可。


保存转发规则后会生成一个 Webhook 地址,将该地址后添加 ?result=#{ipv6Result}&addr=#{ipv6Addr}(此处等号前的变量需与前面设置的一致) 填入 ddns-go 后台 Webhook URL 地址栏并保持 RequestBody 留空即可。
企业微信{"msgtype": "markdown","markdown": {"content": "#### 你的公网IP变了 \n - IPV4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n - IPV6地址:#{ipv6Addr}\n - 域名更新结果:#{ipv6Result} \n"}}
Apprise的邮箱推送
- apprise webhook url
https://你的公网域名:端口/notify/你的密钥 就是一个webhook url
"你的密钥"是自建的{key}或者token,可以换成任意一个 - 设置推送邮箱
进入https://你的公网域名:端口/cfg/你的密钥 配置一下
mailto://邮箱账号:授权码@qq.com?name=📢DDNS-GO - 配置DDNS-GO
在webhook url中填入第一步里的url
在request body中填入:
{ "title":
"公网IP变动了",
"format":
"html",
"body":
"新IPV4地址:#{ipv4Addr}
已解析的域名:#{ipv4Domains}
域名更新结果:#{ipv4Result}
------DDNS-GO------"}
*其中的"title"、"type"、"format"、"body"都是apprise定义的,其中的#{ipv4Addr}、#{ipv4Domains}、#{ipv4Result}是DDNS-GO定义的
我在ddns-go的webhook通知方面主要用的是“方糖”和“爱语飞飞”,两者都是在微信(个人版)上推送通知给我的。免费用户在方糖上每天可以推送5次,爱语飞飞现在好像还是免费不限次。我用得比较初级,在此只是告诉大家有这两个渠道。它们有没有其他推送方式,例如短信,邮件,丁丁等,我也没深入研究,可否实现更复杂的功能,我也没有研究。
http://www.pushplus.plus/send?
请问下 这个直接get日志提示成功,但是收不到消息
post又无法识别到RequestBody的内容
-
ntfy : 免费免注册可自建的多平台推送方案。
-
使用官方/公共服务器,推荐以 uuid 为 topic :
uuidgen:e056a473-c080-4f34-b49c-e62f9fcd1f9d- URL :
https://ntfy.sh/ - RequestBody :
{ "topic": "e056a473-c080-4f34-b49c-e62f9fcd1f9d", "message": "IPv4已变更:#{ipv4Addr},域名 #{ipv4Domains} 更新#{ipv4Result}", "title": "DDNS-GO Cloudflare 更新", "priority": 2, "actions": [{ "action": "view", "label": "管理界面", "url": "http://192.168.0.1:9876/" }] }- 客户端添加订阅topic:
e056a473-c080-4f34-b49c-e62f9fcd1f9d,可设置别名。
-
自建服务并且设置了认证:
- 生成
auth参数(*nix命令):echo -n "Basic `echo -n '<user>:<pass>' | base64`" | base64 | tr -d '='(替换<user>和<pass>),请结合https加密url,详细请参考ntfy文档。 - URL:
https://ntfy.example.com/?auth=<上一步生成的base64 auth参数> - RequestBody :
{ "topic": "ddns-go", "message": "IPv4已变更:#{ipv4Addr},域名 #{ipv4Domains} 更新#{ipv4Result}", "title": "DDNS-GO Cloudflare 更新", "priority": 2, "actions": [{ "action": "view", "label": "管理界面", "url": "http://192.168.0.1:9876/" }] }- 客户端在设置里更改默认服务器为自建:
https://ntfy.example.com/,设置用户名和密码,然后添加订阅topic:ddns-go。
- 生成
https://api.telegram.org/bot{your token}/sendmessage
测试失败,返回内容: {"ok":false,"error_code":400,"description":"Bad Request: chat not found"} ,返回状态码: 400
Gotify
首先,登录到 Gotify 的 WebUI,点击 APPS -> CREATE APPLICATION 来创建 Token,得到 Token 后回到 ddns-go。
然后,登录到 ddns-go,找到 Webhook,在 URL 处填入:
http://[IP]/message?token=[Token]
将 [IP] 替换为 Gotify 服务器的 IP,将 [Token] 替换为得到的 Token。
在 RequestBody 处填入:
{
"title": "你的公网 IP 变了",
"message": "IPv4 地址:#{ipv4Addr}\n域名更新结果:#{ipv4Result}",
"priority": 5,
"extras": {
"client::display": {
"contentType": "text/plain"
}
}
}参考:
像是使用本地搭建的通知服务(设置了证书),ddns访问内网地址会提示“无法验证由服务器提供的证书“,请问这个如何解决
像是使用本地搭建的通知服务(设置了证书),ddns访问内网地址会提示“无法验证由服务器提供的证书“,请问这个如何解决
通过添加选项 -skipVerify 跳过证书验证。
Syncology Chat 整合
http://localhost:5000/chat/webapi/entry.cgi?api=SYNO.Chat.External&method=incoming&version=2&token=AABBCC
payload={"text":"IPv6变了#{ipv6Addr},域名更新结果:#{ipv6Result}"}
GO-CQHTTP机器人
http://ip:5700/send_msg?user_id=接收QQ号码&message= IPv6变了#{ipv6Addr},域名更新结果:#{ipv6Result}
我在ddns-go的webhook通知方面主要用的是“方糖”和“爱语飞飞”,两者都是在微信(个人版)上推送通知给我的。免费用户在方糖上每天可以推送5次,爱语飞飞现在好像还是免费不限次。我用得比较初级,在此只是告诉大家有这两个渠道。它们有没有其他推送方式,例如短信,邮件,丁丁等,我也没深入研究,可否实现更复杂的功能,我也没有研究。
请教在ddnsgo具体配置iyuu的方法
http://www.pushplus.plus/send? 请问下 这个直接get日志提示成功,但是收不到消息 post又无法识别到RequestBody的内容
RequestBody里面需要传JSON
{
"content": "xxxx"
}apprise最新版header里要加一句这个
Content-Type: application/json
不然没法识别
Telegram测试成功,不是用楼上的方案,填写{your token}和,{your id},要把{}去掉
URL:https://api.telegram.org/bot{your token}/sendMessage?chat_id={your id}&text=IPV4变更#{ipv4Result},IPV6变更#{ipv6Result},注意看下QQ和Wechat是否能上网
请教在ddnsgo具体配置iyuu的方法
https://iyuu.cn/【token】.send?title=你的公网IP变了&desp=主人IPv4变了#{ipv4Addr} , 域名更新结果:#{ipv4Result}
请教在ddnsgo具体配置iyuu的方法
https://iyuu.cn/【token】.send?title=你的公网IP变了&desp=主人IPv4变了#{ipv4Addr} , 域名更新结果:#{ipv4Result}
需要把title改为text,没有title这个参数了
Telegram测试成功,不是用楼上的方案,填写{your token}和,{your id},要把{}去掉
URL:https://api.telegram.org/bot{your token}/sendMessage?chat_id={your id}&text=IPV4变更#{ipv4Result},IPV6变更#{ipv6Result},注意看下QQ和Wechat是否能上网
是不是失效了,我用不行提示404
使用CF 反代TG api,通知自建BOT
新建CF Workers,填入以下内容,并使用自定义域
const tg_host = "api.telegram.org";
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
var u = new URL(request.url);
u.host = tg_host;
var req = new Request(u, {
method: request.method,
headers: request.headers,
body: request.body
});
const result = await fetch(req);
return result;
}
- 例如:你的
自定义域为www.tiktok.com,那么api.telegram.org=www.tiktok.com
自建BOT
- 搜索
@BotFather,按提示创建自己的BOT
DDNS-GOWebhook填写
- URL:
# 注意:bot后直接接Token,没有其它符号
https://www.tiktok.com/bot<自建BOT Token>/sendmessage
- RequestBody:
{
"chat_id": "你自己的UserID",
"text": "主人!您的 IP 有变化\n\nIPv4: #{ipv4Result}\nIP: #{ipv4Addr}\n域名: telegram.org\n\nIPv6: #{ipv6Result}\nIP: #{ipv6Addr}\n域名: telegram.org"
}

webhook在slack上怎么配置?一直配置不好。
钉钉
{
"msgtype": "markdown",
"markdown": {
"title": "您的公网IP已变更:",
"text": "**公网IP已变更:** \n ------IPv4------ \n 域名更新结果:**<font color=\"warning\">#{ipv4Result}</font>** \n 新IPV4地址:#{ipv4Addr} \n 已解析的域名:#{ipv4Domains} \n ------IPv6------ \n 域名更新结果:**<font color=\"warning\">#{ipv6Result}</font>** \n 新IPv6地址:#{ipv6Addr} \n 已解析的域名:#{ipv6Domains} \n ------DDNS-GO------\n"
}
}
使用CF 反代TG api,通知自建BOT
新建CF Workers,填入以下内容,并使用
自定义域const tg_host = "api.telegram.org"; addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) async function handleRequest(request) { var u = new URL(request.url); u.host = tg_host; var req = new Request(u, { method: request.method, headers: request.headers, body: request.body }); const result = await fetch(req); return result; }
- 例如:你的
自定义域为www.tiktok.com,那么api.telegram.org=www.tiktok.com自建BOT
- 搜索
@BotFather,按提示创建自己的BOTDDNS-GO
Webhook填写
- URL:
# 注意:bot后直接接Token,没有其它符号 https://www.tiktok.com/bot<自建BOT Token>/sendmessage
- RequestBody:
{ "chat_id": "你自己的UserID", "text": "主人!您的 IP 有变化\n\nIPv4: #{ipv4Result}\nIP: #{ipv4Addr}\n域名: telegram.org\n\nIPv6: #{ipv6Result}\nIP: #{ipv6Addr}\n域名: telegram.org" }![]()
这个是不能用了吗,ddnsgo上webhook模拟测试总是有问题 Webhook调用失败! 异常信息:返回内容: error code: 522 ,返回状态码: 522
WxPusher
URL: https://wxpusher.zjiecode.com/api/send/message
RequestBody:
{
"appToken":"AT_xxx", //填入 AppToken
"content":"新的 IPv4 地址: #{ipv4Addr}\n影响域名: #{ipv4Domains}\n更新结果: #{ipv4Result}\n新的 IPv6 地址: #{ipv6Addr}\n影响域名: #{ipv6Domains}\n更新结果: #{ipv6Result}",
"summary":"IPv4: #{ipv4Addr} #{ipv4Result} | IPv6: #{ipv6Addr} #{ipv6Result}",
"contentType":1,
"topicIds":[
114514 //填入 TopicID
]
}gotify 自建的多平台推送方案。
URL: http://x.x.x.x.:port/message?token=AXWpiJam7V_rSwW
RequestBody: 为json格式
{
"title": "公网IP变动了",
"message": "新IPV4地址:#{ipv4Addr}\n已解析的域名:#{ipv4Domains}\n域名更新结果:#{ipv4Result}\n\n 新IPV6地址:#{ipv6Addr}\n已解析的域名:#{ipv6Domains}\n域名更新结果:#{ipv6Result}\n\n------DDNS-GO-----"
}
企业微信
下载企业微信→左上角三横杠→全新创建企业→个人组件团队(创建个人的企业群聊), 进入群聊添加 [群机器人] 复制机器人Webhook地址填入ddns-go后台Webhook URL地址栏。 在RequestBody栏填入回调函数,格式:
{ "msgtype": "markdown","markdown": { "content": "公网IP变更:\n 新IPV6地址:#{ipv6Addr} \n 已解析的域名:#{ipv6Domains} \n 域名更新结果:#{ipv6Result}" } }
2024/03/02 17:48:16 Webhook called successfully! Response body: {"errcode":0,"errmsg":"ok. WARNING: invalid character after json. "}
消息是推送过来了,但是日志里面显示错误

企业微信
下载企业微信→左上角三横杠→全新创建企业→个人组件团队(创建个人的企业群聊), 进入群聊添加 [群机器人] 复制机器人Webhook地址填入ddns-go后台Webhook URL地址栏。 在RequestBody栏填入回调函数,格式:
{ "msgtype": "markdown","markdown": { "content": "公网IP变更:\n 新IPV6地址:#{ipv6Addr} \n 已解析的域名:#{ipv6Domains} \n 域名更新结果:#{ipv6Result}" } }2024/03/02 17:48:16 Webhook called successfully! Response body: {"errcode":0,"errmsg":"ok. WARNING: invalid character after json. "} 消息是推送过来了,但是日志里面显示错误
把填写的Webhook放到 在线json网站 中,如果报错就肯定是你填的Webhook不对,有语法错误
企业微信 - 机器人
创建企业内部群聊,进入群聊,右上角三个点->群机器人->添加 [群机器人],复制机器人Webhook地址填入ddns-go后台Webhook URL地址栏,在RequestBody栏填入回调函数,
RequestBody格式:
{ "msgtype": "text", "text": { "content": "°o.O【公网IP变更通知】O.o°
⋆⌁⌁⌁⋆⌁⌁❤︎⌁⌁⌁⋆⌁⌁⌁❤︎⌁⌁⋆⌁⌁⌁⋆
IPv4:#{ipv4Addr}
域名:#{ipv4Domains}
结果:解析#{ipv4Result}
𓆟𓆜𓆞𓆝𓆟𓆜𓆞𓆝𓆟𓆜
IPv6:#{ipv6Addr}
域名:#{ipv6Domains}
结果:解析#{ipv6Result}" } }
用的方糖(Server酱),示例中只是推送title,把Body也一起加进去了:
https://sctapi.ftqq.com/Token.send?title=公网IP更新了&desp=新的IPv4地址<#{ipv4Addr}>,已解析域名<#{ipv4Domains}>,IPv4域名更新结果<#{ipv4Result}>。新的IPv6地址<#{ipv6Addr}>,已解析域名<#{ipv6Domains}>,IPv6域名更新结果<#{ipv6Result}>。
预览图:

pushdeer
URL: https://api2.pushdeer.com/message/push?pushkey=yourkey
RequestBody:
{
"title": "你的公网IP变了",
"text": "\n ipv4是:#{ipv4Addr} \n 域名更新结果:#{ipv4Result} \n 更新的域名是:#{ipv4Domains}",
"type": "markdown"
}
使用CF 反代TG api,通知自建BOT
新建CF Workers,填入以下内容,并使用
自定义域const tg_host = "api.telegram.org"; addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) async function handleRequest(request) { var u = new URL(request.url); u.host = tg_host; var req = new Request(u, { method: request.method, headers: request.headers, body: request.body }); const result = await fetch(req); return result; }
- 例如:你的
自定义域为www.tiktok.com,那么api.telegram.org=www.tiktok.com自建BOT
- 搜索
@BotFather,按提示创建自己的BOTDDNS-GO
Webhook填写
- URL:
# 注意:bot后直接接Token,没有其它符号 https://www.tiktok.com/bot<自建BOT Token>/sendmessage
- RequestBody:
{ "chat_id": "你自己的UserID", "text": "主人!您的 IP 有变化\n\nIPv4: #{ipv4Result}\nIP: #{ipv4Addr}\n域名: telegram.org\n\nIPv6: #{ipv6Result}\nIP: #{ipv6Addr}\n域名: telegram.org" }![]()
现在主要问题是域名被qiang, 用这个方案可以解决
anpush
可以推送至

免费账户,每天30条
post请求:
curl --location --request POST 'https://api.anpush.com/push/your_token'
--header 'Content-Type: application/x-www-form-urlencoded'
--data-urlencode 'title=your_title'
--data-urlencode 'content=your_content'
--data-urlencode 'channel=your_channel'
get请求:
curl --location --request GET 'https://api.anpush.com/push/your_token?title=your_title&content=your_content&channel=your_channel'
支持markdown格式的消息内容
用文本格式可在微信中直接看
Webhook地址填入ddns-go后台Webhook URL地址栏。 在RequestBody栏填入回调函数,格式:
我目前也是这样做的,只能使用text格式,markdown的话,个人微信看不了,只能跳转到企业微信,你有什么办法不
用文本格式可在微信中直接看
Webhook地址填入ddns-go后台Webhook URL地址栏。 在RequestBody栏填入回调函数,格式:我目前也是这样做的,只能使用text格式,markdown的话,个人微信看不了,只能跳转到企业微信,你有什么办法不
企业微信中拉入个人微信号
24年最新使用CF 反代TG api,通知自建BOT
新建CF Workers,填入以下内容,并使用自定义域
/**
* Helper functions to check if the request uses
* corresponding method.
*
*/
const Method = (method) => (req) => req.method.toLowerCase() === method.toLowerCase();
const Get = Method('get');
const Post = Method('post');
const Path = (regExp) => (req) => {
const url = new URL(req.url);
const path = url.pathname;
return path.match(regExp) && path.match(regExp)[0] === path;
};
/*
* The regex to get the bot_token and api_method from request URL
* as the first and second backreference respectively.
*/
const URL_PATH_REGEX = /^\/bot(?<bot_token>[^/]+)\/(?<api_method>[a-z]+)/i;
/**
* Router handles the logic of what handler is matched given conditions
* for each request
*/
class Router {
constructor() {
this.routes = [];
}
handle(conditions, handler) {
this.routes.push({
conditions,
handler,
});
return this;
}
get(url, handler) {
return this.handle([Get, Path(url)], handler);
}
post(url, handler) {
return this.handle([Post, Path(url)], handler);
}
all(handler) {
return this.handler([], handler);
}
route(req) {
const route = this.resolve(req);
if (route) {
return route.handler(req);
}
const description = 'No matching route found';
const error_code = 404;
return new Response(
JSON.stringify({
ok: false,
error_code,
description,
}),
{
status: error_code,
statusText: description,
headers: {
'content-type': 'application/json',
},
}
);
}
/**
* It returns the matching route that returns true
* for all the conditions if any.
*/
resolve(req) {
return this.routes.find((r) => {
if (!r.conditions || (Array.isArray(r) && !r.conditions.length)) {
return true;
}
if (typeof r.conditions === 'function') {
return r.conditions(req);
}
return r.conditions.every((c) => c(req));
});
}
}
/**
* Sends a POST request with JSON data to Telegram Bot API
* and reads in the response body.
* @param {Request} request the incoming request
*/
async function handler(request) {
// Extract the URl method from the request.
const { url, ..._request } = request;
const { pathname: path, search } = new URL(url);
// Leave the first match as we are interested only in backreferences.
const { bot_token, api_method } = path.match(URL_PATH_REGEX).groups;
// Build the URL
const api_url = 'https://api.telegram.org/bot' + bot_token + '/' + api_method + search;
// Get the response from API.
const response = await fetch(api_url, _request);
const result = await response.text();
const res = new Response(result, _request);
res.headers.set('Content-Type', 'application/json');
return res;
}
/**
* Handles the incoming request.
* @param {Request} request the incoming request.
*/
async function handleRequest(request) {
const r = new Router();
r.get(URL_PATH_REGEX, (req) => handler(req));
r.post(URL_PATH_REGEX, (req) => handler(req));
const resp = await r.route(request);
return resp;
}
/**
* Hook into the fetch event.
*/
addEventListener('fetch', (event) => {
event.respondWith(handleRequest(event.request));
});什么都不要动直接复制粘贴进去。其他步骤和以前一直。
然后添加workers的路由,指向这个workers。
也可以不做。
### 这个地址需要外网访问
https://api.telegram.org/bot<bot的token>/sendMessage?chat_id=<tg用户的id>&text=<发送内容>### 这个地址在国内就可以访问
https://tg.你的域名/bot<bot的token>/sendMessage?chat_id=<tg用户的id>&text=<发送内容>QQ机器人LLOneBot
LLOneBot如何安装,自己看:
https://llonebot.github.io/
LLOneBot下载: 需要版本QQNT
https://github.com/super1207/install_llob/releases/download/0.0.4/llob_install.exe
然后启用HTTP 默认3000端口
在DDNS-GO如下写就行了 user_id 写需要发送消息的QQ号
URL:http://localhost:3000/send_private_msg?user_id=QQ号
RequestBody:
{"message": "公网IP变更:\n\n域名更新结果:#{ipv6Result} \n\n新IPV6地址:#{ipv6Addr} \n\n已解析的域名:#{ipv6Domains} "}
ddns-telegram-bot是不是挂了,提示“Webhook调用失败! 异常信息:Post "https://ddns-bot.vercel.app/api/hook/xxxxxxxxx?": dial tcp 173.236.182.137:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.”
ddns-telegram-bot是不是挂了,提示“Webhook调用失败! 异常信息:Post "https://ddns-bot.vercel.app/api/hook/xxxxxxxxx?": dial tcp 173.236.182.137:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.”
最新的方法不需要那么烦了!我重新搭建了一下。https://blog.gitiid.com/posts/f22264fb/
企业微信应用
需要搭配cloudflare worker使用
RequestBody:
{
"touser" : "@all",
"msgtype" : "text",
"agentid" : 替换为您的企业应用ID,
"text" : {
"content" : "公网IP变更:\n 新IPV6地址:#{ipv6Addr} \n 已解析的域名:#{ipv6Domains} \n 域名更新结果:#{ipv6Result}"
},
"safe":0,
"enable_id_trans": 0,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}
粘贴到worker,添加自定义域名
const CORP_ID = ""; // 替换为您的企业微信 企业ID
const CORP_SECRET = ""; // 替换为您的企业微信应用的secret
// 获取新的 access_token
async function getAccessToken() {
const cache = caches.default; // 使用 Cloudflare Worker 的默认缓存
const tokenUrl = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${CORP_ID}&corpsecret=${CORP_SECRET}`;
const cachedResponse = await cache.match(tokenUrl);
// 如果缓存中有响应,直接返回 access_token
if (cachedResponse) {
const data = await cachedResponse.json();
return data.access_token; // 缓存自动管理过期,无需手动检查
}
// 如果缓存没有命中,重新请求 access_token
const response = await fetch(tokenUrl);
const data = await response.json();
if (data.errcode === 0) {
// 微信返回成功
const cacheData = JSON.stringify({
access_token: data.access_token,
});
// 设置缓存,同时使用 expirationTtl 自动过期
await cache.put(
tokenUrl,
new Response(cacheData, {
headers: { "Content-Type": "application/json" },
}),
{ expirationTtl: data.expires_in } // 微信返回的有效时间,通常为 7200 秒
);
// 返回新的 access_token
return data.access_token;
} else {
// 抛出错误
throw new Error(`获取access_token失败: ${data.errmsg}`);
}
}
// 发送消息
async function sendMessage(request) {
try {
// 获取新的 access_token
const accessToken = await getAccessToken();
// 使用获取到的 access_token 发送消息
const sendUrl = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${accessToken}`;
const body = await request.text();
const sendResponse = await fetch(sendUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body,
});
const sendData = await sendResponse.json();
// 返回消息发送结果
return new Response(JSON.stringify(sendData), {
headers: { "Content-Type": "application/json" },
});
} catch (error) {
// 返回错误信息
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
headers: { "Content-Type": "application/json" },
});
}
}
addEventListener("fetch", (event) => {
const { request } = event;
if (request.method === "POST") {
// 处理POST请求
event.respondWith(sendMessage(request));
} else {
// 对于其他方法返回405 Method Not Allowed
event.respondWith(
new Response("仅支持POST请求", {
status: 405,
headers: { "Content-Type": "text/plain" },
})
);
}
});
@0-RTT 大佬 这个弄完之后提示Webhook调用成功! 返回数据:{"errcode":60020,"errmsg":"not allow to access from your ip, hint: [1733377389466644205102395], from ip: 172.70.210.90, more info at https://open.work.weixin.qq.com/devtool/query?e=60020"}
@0-RTT 大佬 这个弄完之后提示
Webhook调用成功! 返回数据:{"errcode":60020,"errmsg":"not allow to access from your ip, hint: [1733377389466644205102395], from ip: 172.70.210.90, more info at https://open.work.weixin.qq.com/devtool/query?e=60020"}
现在新建的需要配置白名单ip,应用管理有 企业可信IP 这个选项。我的应用是之前建的,不需要配置这个就可以使用。
企业微信
下载企业微信→左上角三横杠→全新创建企业→个人组件团队(创建个人的企业群聊),进入群聊添加[群机器人]复制机器人Webhook地址填入ddns-go后台Webhook URL地址栏。 RequestBody栏填入回调函数,完整格式:
{"msgtype": "text","text": {"content": "公网IP变了 \n - IPV4地址:#{ipv4Addr} \n - 已解析的域名:#{ipv4Domains} \n - 域名更新结果:#{ipv4Result} \n - IPV6地址:#{ipv6Addr}\n - 已解析的域名:#{ipv6Domains} \n - 域名更新结果:#{ipv6Result} \n"}}
更新结果如图
Home Assistant(推送到手机端)
- 配置—自动化与场景—创建自动化—创建新的自动化
- 添加一个Webhook触发器

- 添加动作—设备,在里面选择要推送的手机
- 消息:
{{trigger.json['msg']}},标题:{{trigger.json['title']}}

- 点击Webhook ID输入框内的粘贴按钮,获取链接,填入URL栏

- RequestBody如下填写
{
"title": "IP地址已更新",
"msg": "IPv4 更新#{ipv4Result}\n地址:#{ipv4Addr}\n域名:#{ipv4Domains}\nIPv6 更新#{ipv6Result}\n地址:#{ipv6Addr}\n域名:#{ipv6Domains}"
}企业微信应用
需搭配cfworkes、自备企业微信代理,可设置cf服务密码
RequestBody:
{
"passwd": "[设置的密码,示例为1234567890]",
"title": "[拟定的标题(非必须]",
"description": "IP变化\n\nIPv4: #{ipv4Result}\nIP: #{ipv4Addr}\n域名: #{ipv4Domains}\n\nIPv6: #{ipv6Result}\nIP: #{ipv6Addr}\n域名: #{ipv6Domains}",
"corpid": "[企业ID]",
"corpsecret": "[应用secret]",
"agentid": "[应用agentid]",
"apiproxy": "[企业微信代理 域名 或者 IP+端口 ,仅需要填写https://到/中间的 域名 或者 IP+端口 !]"
}
例:
{
"passwd": "1234567890",
"title": "",
"description": "IP变化\n\nIPv4: #{ipv4Result}\nIP: #{ipv4Addr}\n域名: #{ipv4Domains}\n\nIPv6: #{ipv6Result}\nIP: #{ipv6Addr}\n域名: #{ipv6Domains}",
"corpid": "1234567890",
"corpsecret": "1234567890",
"agentid": "100001",
"apiproxy": "GITHUB.COM"
}
cfworkes代码:
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
let passwd, content, msg, corpid, corpsecret, agentid, apiproxy;
if (request.method === 'POST') {
const requestBody = await request.json()
passwd = requestBody.passwd
content = requestBody.title
msg = requestBody.description
corpid = requestBody.corpid
corpsecret = requestBody.corpsecret
agentid = requestBody.agentid
apiproxy = requestBody.apiproxy
} else if (request.method === 'GET') {
const url = new URL(request.url)
passwd = url.searchParams.get('passwd')
content = url.searchParams.get('title')
msg = url.searchParams.get('description')
corpid = url.searchParams.get('corpid')
corpsecret = url.searchParams.get('corpsecret')
agentid = url.searchParams.get('agentid')
apiproxy = url.searchParams.get('apiproxy')
} else {
return new Response("只接受GET和POST请求", { status: 405 })
}
// Debug output
console.log(`passwd: ${passwd}, title: ${content}, description: ${msg}, corpid: ${corpid}, corpsecret: ${corpsecret}, agentid: ${agentid}, apiproxy: ${apiproxy}`)
// Password validation
if (passwd !== '1234567890') { //按需修改此处的密码!!!
return new Response("密码错误", { status: 403 })
}
// Check for missing parameters
if (!msg || !corpid || !corpsecret || !agentid || !apiproxy) {
return new Response("缺少必要的参数", { status: 400 })
}
const getTokenUrl = `https://${apiproxy}/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${corpsecret}`
try {
const tokenResponse = await fetch(getTokenUrl, { method: 'POST' })
const tokenData = await tokenResponse.json()
const accessToken = tokenData.access_token
const sendMessageUrl = `https://${apiproxy}/cgi-bin/message/send?access_token=${accessToken}`
let textContent = content ? `${content}\n${msg}` : `${msg}`
const data = JSON.stringify({
touser: "@all",
msgtype: "text",
agentid: parseInt(agentid), // Ensure agentid is an integer
text: {
content: textContent
},
safe: 0
})
// Debug output
console.log(`Request data: ${data}`)
const messageResponse = await fetch(sendMessageUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: data
})
const messageData = await messageResponse.json()
const errmsg = messageData.errmsg
if (errmsg === "ok") {
return new Response("发送成功!", { status: 200 })
} else {
return new Response(`发送失败,${errmsg}`, { status: 500 })
}
} catch (error) {
return new Response(`请求失败: ${error.message}`, { status: 500 })
}
}
企业微信
wecom
{
"msgtype": "template_card",
"template_card": {
"card_type": "text_notice",
"source": {
"icon_url": "https://raw.githubusercontent.com/jeessy2/ddns-go/master/favicon.ico",
"desc": "DDNS-GO",
"desc_color": 0
},
"main_title": {
"title": "DDNS-GO DNS 更新",
"desc": "Location: 北京-东城区"
},
"emphasis_content": {
"title": "#{ipv4Addr}",
"desc": "#{ipv4Domains}"
},
"sub_title_text": "详细信息",
"horizontal_content_list": [
{
"keyname": "IPv4 地址",
"value": "#{ipv4Addr}"
},
{
"keyname": "IPv4 解析结果",
"value": "#{ipv4Result}"
},
{
"keyname": "关联域名",
"value": "#{ipv4Domains}"
},
{
"keyname": "IPv6 地址",
"value": "#{ipv6Addr}"
},
{
"keyname": "IPv6 解析结果",
"value": "#{ipv6Result}"
},
{
"keyname": "关联域名",
"value": "#{ipv6Domains}"
}
],
"card_action": {
"type": 1,
"url": "https://work.weixin.qq.com/?from=openApi",
"appid": "APPID",
"pagepath": "PAGEPATH"
}
}
}
slack
{"blocks":[{"type":"header","text":{"type":"plain_text","text":"DDNS-GO DNS 更新","emoji":true}},{"type":"section","text":{"type":"mrkdwn","text":"*Location:* 北京-东城区"}},{"type":"section","fields":[{"type":"mrkdwn","text":"*IPv4 地址:* #{ipv4Addr}"},{"type":"mrkdwn","text":"*IPv6 地址:* #{ipv6Addr}"},{"type":"mrkdwn","text":"*IPv4 解析结果:* #{ipv4Result}"},{"type":"mrkdwn","text":"*IPv6 解析结果:* #{ipv6Result}"},{"type":"mrkdwn","text":"*关联域名 (IPv4):* #{ipv4Domains}"},{"type":"mrkdwn","text":"*关联域名 (IPv6):* #{ipv6Domains}"}]},{"type":"section","text":{"type":"mrkdwn","text":"*详细信息*"}},{"type":"actions","elements":[{"type":"button","text":{"type":"plain_text","text":"查看详情","emoji":true},"url":"http://192.168.1.1:9876/","action_id":"button-action"}]}]}
Home Assistant(推送到手机端)
- 配置—自动化与场景—创建自动化—创建新的自动化
- 添加一个Webhook触发器
- 添加动作—设备,在里面选择要推送的手机
- 消息:
{{trigger.json['msg']}},标题:{{trigger.json['title']}}
- 点击Webhook ID输入框内的粘贴按钮,获取链接,填入URL栏
- RequestBody如下填写
{
"title": "IP地址已更新",
"msg": "IPv4 更新#{ipv4Result}\n地址:#{ipv4Addr}\n域名:#{ipv4Domains}\nIPv6 更新#{ipv6Result}\n地址:#{ipv6Addr}\n域名:#{ipv6Domains}"
}
最终效果:
请问一下,这个手机端推送能不能查询历史推送信息,有的时候想要查询更改过的IP
Home Assistant(推送到手机端)
- 配置—自动化与场景—创建自动化—创建新的自动化
- 添加一个Webhook触发器
- 添加动作—设备,在里面选择要推送的手机
- 消息:
{{trigger.json['msg']}},标题:{{trigger.json['title']}}
- 点击Webhook ID输入框内的粘贴按钮,获取链接,填入URL栏
- RequestBody如下填写
{
"title": "IP地址已更新",
"msg": "IPv4 更新#{ipv4Result}\n地址:#{ipv4Addr}\n域名:#{ipv4Domains}\nIPv6 更新#{ipv6Result}\n地址:#{ipv6Addr}\n域名:#{ipv6Domains}"
}
最终效果:请问一下,这个手机端推送能不能查询历史推送信息,有的时候想要查询更改过的IP
可以的
配置-自动化里面找到设置好的自动化,点开最右边三个点-信息,点击红框中的小图标(历史)就可以查询了
Slack
Webhook URL
https://hooks.slack.com/services/xxx
Request Body
{
"text": "Your IP address has been changed.",
"attachments": [
{
"color": "good",
"fields": [
{
"title": "DNS Name",
"value": "#{ipv4Domains}"
},
{
"title": "New IP Address",
"value": "#{ipv4Addr}"
},
{
"title": "Update Result",
"value": "#{ipv4Result}"
}
]
}
]
}
Sample Result
WxPusher
URL:
https://wxpusher.zjiecode.com/api/send/messageRequestBody:{
"appToken":"AT_xxx", //填入 AppToken
"content":"新的 IPv4 地址: #{ipv4Addr}\n影响域名: #{ipv4Domains}\n更新结果: #{ipv4Result}\n新的 IPv6 地址: #{ipv6Addr}\n影响域名: #{ipv6Domains}\n更新结果: #{ipv6Result}",
"summary":"IPv4: #{ipv4Addr} #{ipv4Result} | IPv6: #{ipv6Addr} #{ipv6Result}",
"contentType":1,
"topicIds":[
114514 //填入 TopicID
]
}
提示 Webhook中的 RequestBody JSON 无效,请问如何解决
WxPusher
URL: https://wxpusher.zjiecode.com/api/send/message
RequestBody:
{
"appToken": "AT_Z", //填入 AppToken
"content": "新的 IPv4 地址: #{ipv4Addr}\n影响域名: #{ipv4Domains}\n更新结果: #{ipv4Result}\n新的 IPv6 地址: #{ipv6Addr}\n影响域名: #{ipv6Domains}\n更新结果: #{ipv6Result}",
"summary": "IPv4: #{ipv4Addr} #{ipv4Result} | IPv6: #{ipv6Addr} #{ipv6Result}",
"contentType": 1,
"uids": ["UID_111"] //UID
}

WxPusher
URL:
https://wxpusher.zjiecode.com/api/send/messageRequestBody:
{
"appToken":"AT_xxx", //填入 AppToken
"content":"新的 IPv4 地址: #{ipv4Addr}\n影响域名: #{ipv4Domains}\n更新结果: #{ipv4Result}\n新的 IPv6 地址: #{ipv6Addr}\n影响域名: #{ipv6Domains}\n更新结果: #{ipv6Result}",
"summary":"IPv4: #{ipv4Addr} #{ipv4Result} | IPv6: #{ipv6Addr} #{ipv6Result}",
"contentType":1,
"topicIds":[
114514 //填入 TopicID
]
}提示 Webhook中的 RequestBody JSON 无效,请问如何解决
看我的 成功了
WxPusher
URL:
https://wxpusher.zjiecode.com/api/send/messageRequestBody:
{
"appToken":"AT_xxx", //填入 AppToken
"content":"新的 IPv4 地址: #{ipv4Addr}\n影响域名: #{ipv4Domains}\n更新结果: #{ipv4Result}\n新的 IPv6 地址: #{ipv6Addr}\n影响域名: #{ipv6Domains}\n更新结果: #{ipv6Result}",
"summary":"IPv4: #{ipv4Addr} #{ipv4Result} | IPv6: #{ipv6Addr} #{ipv6Result}",
"contentType":1,
"topicIds":[
114514 //填入 TopicID
]
}提示 Webhook中的 RequestBody JSON 无效,请问如何解决
看我的 成功了
我就说呢,一直失败,不过我已经改用爱语飞飞了,感觉更好用。
WxPusher 网址:https://wxpusher.zjiecode.com/api/send/message
请求主体:
{ "appToken": "AT_Z", //填入 AppToken "content": "新的 IPv4 地址: #{ipv4Addr}\n 影响域名: #{ipv4Domains}\n更新结果: #{ipv4Result}\n新的 IPv6 地址: #{ipv6Addr}\n 影响域名: #{ipv6Domains}\n更新结果: #{ipv6Result}", "summary": "IPv4: #{ipv4Addr} #{ipv4Result} | IPv6: #{ipv6Addr} #{ipv6Result}", "contentType": 1, "uids": ["UID_111"] //UID }
测试一开始提示这个Webhook调用成功! 返回数据:{"code":1005,"msg":"服务器错误:Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported,这个错误是你传如的Content-Type传入不正确导致的,解决方案请参考:https://blog.csdn.net/jie11447416/article/details/109145869","data":null,"success":false}
增加Content-Type: application/json之后提示
返回数据:{"code":1005,"msg":"接口 [/api/send/message] 出现异常:Unexpected character ('/' (code 47)): maybe a (non-standard) comment? (not recognized as one since Feature 'ALLOW_COMMENTS' not enabled for parser)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 2, column: 22]","data":null,"success":false}
WXWork
{
"msgtype": "markdown",
"markdown": {
"content": "# IP地址已改变
>IPV4地址:#{ipv4Addr}
>更新结果:#{ipv4Result}
>IPV6地址:#{ipv6Addr}
>更新结果:#{ipv6Result}"
}
}
telegrame推送服务可以用这个代码免费部署到deno, ddns-go-telegram-webhook
resend
URL
https://api.resend.com/emails
RequestBody
{
"from": "DDNS-GO <onboarding@resend.dev>",
"to": ["delivered@resend.dev"],
"subject": "DDNS 更新通知",
"html": "<!DOCTYPE html><html lang=\"zh-CN\"><head><meta charset=\"UTF-8\"><title>DDNS更新通知</title><style>body{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;background-color:#f7f7f7;margin:0;padding:20px}.container{max-width:600px;margin:auto;background-color:#fff;border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,0.1);padding:30px}h2{color:#333;margin-top:0}table{width:100%;border-collapse:collapse;margin-top:15px}td{padding:10px;border-bottom:1px solid #eee}td.label{font-weight:bold;color:#555;width:150px;background-color:#f0f0f0}.footer{text-align:center;margin-top:30px;font-size:12px;color:#999}</style></head><body><div class=\"container\"><h2>📡 DDNS更新通知</h2><p>以下是最近一次动态DNS更新的详细信息:</p><table><tr><td class=\"label\">IPv4 地址</td><td>#{ipv4Addr}</td></tr><tr><td class=\"label\">IPv4 状态</td><td>#{ipv4Result}</td></tr><tr><td class=\"label\">IPv4 域名</td><td>#{ipv4Domains}</td></tr><tr><td class=\"label\">IPv6 地址</td><td>#{ipv6Addr}</td></tr><tr><td class=\"label\">IPv6 状态</td><td>#{ipv6Result}</td></tr><tr><td class=\"label\">IPv6 域名</td><td>#{ipv6Domains}</td></tr></table><div class=\"footer\">本邮件由系统自动发送,请勿回复。</div></div></body></html>"
}
Headers
Authorization: Bearer re_xxxxxxxxx
Content-Type: application/json
预览

自行构建docker容器:https://github.com/icstudiochina/ddnsgo-tg-webhook
docker部署
docker run -d \
--name my-ddns-bot \
-p 5000:8000 \
-e TELEGRAM_BOT_TOKEN="<YourBotToken>" \
-e TELEGRAM_CHAT_ID="<YourChatID>" \
--restart always \
icstudiocn/ddnsgo-tg-webhook:latest
预览
OneBot
我来做个OneBot V11 HTTP的 。OneBot v12不清楚 没用过。 支持natcap\llonebot\ws-plugin这种用onebot连接QQ私人机器人的
群聊有鉴权:
URL
http(s)://{填你的Onebot HTTP的URL}/send_group_msg?access_token={填写你的鉴权Token}
RequestBody
{
"group_id": {填你的QQ群号},
"message": "【DDNS-GO运行结果】\n你的公网IP变了\n主人IPv4变了#{ipv4Addr}\n域名更新为#{ipv4Domains}\n域名更新结果: #{ipv4Result}",
"auto_escape": false
}
示例
https://www.123.com/send_group_msg?access_token=123456
{
"group_id": 123456789,
"message": "【DDNS-GO运行结果】\n你的公网IP变了\n主人IPv4变了#{ipv4Addr}\n域名更新为#{ipv4Domains}\n域名更新结果: #{ipv4Result}",
"auto_escape": false
}
私聊有鉴权:
URL
http(s)://{填你的Onebot HTTP的URL}/send_private_msg?access_token={填写你的鉴权Token}
RequestBody
{
"user_id": {填你的用户QQ},
"message": "【DDNS-GO运行结果】\n你的公网IP变了\n主人IPv4变了#{ipv4Addr}\n域名更新为#{ipv4Domains}\n域名更新结果: #{ipv4Result}",
"auto_escape": false
}
示例
https://www.123.com/send_private_msg?access_token=123456
{
"user_id": 123456789,
"message": "【DDNS-GO运行结果】\n你的公网IP变了\n主人IPv4变了#{ipv4Addr}\n域名更新为#{ipv4Domains}\n域名更新结果: #{ipv4Result}",
"auto_escape": false
}
运行结果截图如下


































