xxtui - 个人消息推送 - 支持微信、企业微信、钉钉、Bark

絮絮念

由于之前对规则不熟悉,帖子被移除,第一次是因为没有加上推广标签,后来添加了标签后在始皇的帮助下得以恢复,第二次是始皇说是因为未接入LINUX DO Connect被举报移除。现在完成了LINUX DO Connect的接入,我新开一篇重新整理下,希望能够遵守论坛的规则。

在此非常感谢所有管理者对于论坛的辛勤付出,也理解大佬们面对海量信息的巡查和对违规内容的处理,这需要非常多的精力和耐心。我会尽量让自己的内容合规,不给大家添麻烦。

再次感谢始皇的耐心指引,如果内容又不妥之处或者需要调整,请告诉我,我第一时间调整。

真的是纯公益且无间接引流,希望各位佬友手下留情。

以下正文

如果你有接收消息的需求又不想折腾的话可以试试,xxtui是我个人闲暇之余的一个产物,免费给大家使用。

更新记录

2025年3月5日

  • 新增:关联账号可以解除绑定
  • 新增页面:常见问题
  • 优化部分提示信息

2025年3月3 日

  • 新增页面:账号管理
  • 接入LINUX DO Connect

2025年3月2日

  • 首页配置模块优化
  • 钉钉群机器人增加【加签】密钥

2025年2 月15日

  • 新增页面:消息记录

2025年1月13日

  • 渠道参数支持多选

2025年1月10日

  • 修复部分 bug

2025年1月1日

  • 网站重新排版
  • 微信内点击登录直接跳转

就佬友们关心的一些问题,我尝试解释一下

  1. 是否开源
    暂无打算
  2. 用户隐私
    微信扫码登录时平台仅获取openid作为用户唯一标识,未获取也未存储其它信息
  3. 数据安全
    因为个人使用,消息内容只能自己查看,查看消息的url也可分享,消息id由消息内容加盐之后的md5,url不泄露,消息数据就安全(服务器被攻击除外)
  4. 数据有效期
    目前永久有效,服务器有成本我大概率不会升级它,会选择定期删除并在记录页展示当前的过期规则
  5. 服务稳定性
    单机部署,并发不高,去年上线第一版后除日常优化升级之外,没有崩溃过

还在持续优化和构思新的功能,欢迎各位佬友提出宝贵意见~

29 个赞

挺好的,之前一直在用wxpusher,试试这个效果怎么样

9 个赞

感谢佬友支持 :face_with_peeking_eye:

10 个赞

佬,有个问题如果之前注册了账号绑定会提示已注册无法绑定

8 个赞

老哥,这。。。不是打击你,有个项目叫做青龙,你去他那找两个notify文件,比你这个功能还多。
这功能甚至都不是他的功能点

7 个赞

现在是这样的,被视为了两个用户 :grimacing:

12 个赞

这个逻辑最好改一下,不然会有问题

13 个赞

:rofl:我去瞧瞧,做的时候没想那么多

12 个赞

大佬,可否加个提醒模板,可否直接显示内容,使人一目了然的那种(省去点进去的步骤,或者说感兴趣再点进去)

13 个赞

这种账号统一,需要有一个主账号的体系做唯一标识,比如授权完成后还需要再次绑定账号或者手机号才能继续使用。

13 个赞

试试呀,,

14 个赞

可以使用当前登录渠道为主账号,待绑定账号为辅助,提示账号已存在,是否覆盖,如果是直接删除那个账号或者把两个账号合并

外层加信息太多容易被风控,我再找找合适的模版

from 参数可以自定义,在模版上会显示,目前是限制20字符内

钩子其实没什么大用途

addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
    const securityKey = 'aaaaaa'; // 密钥

    // 获取access_token
    async function getAccessToken(corpId, appSecret) {
        const url = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpId}&corpsecret=${appSecret}`;
        const response = await fetch(url);
        const data = await response.json();
        return data.access_token;
    }

    // 构造图文消息
    function buildNewsMessage(agentId, toUser, title, description, picUrl, url) {
        return JSON.stringify({
            "touser": toUser,
            "msgtype": "news",
            "agentid": agentId,
            "news": {
                "articles": [
                    {
                        "title": title,
                        "description": description,
                        "url": url,
                        "picurl": picUrl
                    }
                ]
            },
            "safe": 0
        });
    }

    // 发送消息
    async function sendMessage(accessToken, data) {
        const url = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${accessToken}`;
        const response = await fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: data
        });
        const result = await response.json();
        if (result.errcode === 0) {
            return '消息发送成功';
        } else {
            return '消息发送失败,错误码:' + result.errcode + ',错误信息:' + result.errmsg;
        }
    }

    // 解析请求体
    const {corpId, appSecret, agentId, toUser, key, ...otherData} = await request.json();

    // 验证密钥
    if (!key || key !== securityKey) {
        return new Response('密钥验证失败', {status: 403});
    }

    // 获取access_token
    const accessToken = await getAccessToken(corpId, appSecret);

    // 初始化消息内容
    let content = '';

    // 预处理参数并拼接内容
    for (const [key, value] of Object.entries(otherData)) {
        content += `${key}: ${value}\n`;
    }

    // 设置标题和内容
    const title = '推送消息';
    const description = content.trim();
    const picUrl = 'https://webhook.png'; // 根据实际情况替换
    const url = ''; // 根据实际情况替换

    // 构造并发送消息
    const messageData = buildNewsMessage(agentId, toUser || '@all', title, description, picUrl, url);
    const sendMessageResult = await sendMessage(accessToken, messageData);

    return new Response(sendMessageResult);
}
3 个赞

账号生成一个唯一id就好了,别用用户名或者邮箱作为唯一标识

可否加大字数的限制,我想用你这个工具发一些会议类、活动类的汇总提醒,谢谢

目前是LINUX DO Connect登录和微信扫码登录注册的用户体系共存,各自独立

缺点是需要用户自己在登录好一方的情况下绑定未注册的另一方

还有更简单的办法就是做账号注销,想绑定注销一个就行

1 个赞

需求大概多少,我尝试加大到3000?

我也是准备上一版注销,用来给有合并绑定账号的佬友使用