Greasy Fork

Greasy Fork is available in English.

WorkTile通知脚本

监听消息通知进行提示

当前为 2022-10-20 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         WorkTile通知脚本
// @namespace    YXKJ.WorkTile.lzg
// @license      MIT
// @version      0.1
// @description  监听消息通知进行提示
// @author       Lzg
// @match        https://*.worktile.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=worktile.com
// @grant        GM_xmlhttpRequest
// @connect      qyapi.weixin.qq.com
// ==/UserScript==
// 获取数据
function getApiData(url,method = 'GET',data) {
    let header = {}
    if(method === 'POST') {
        header = {'Content-Type': 'application/json'}
    }
    return new Promise(resolve => GM.xmlHttpRequest({
        header,
        method,
        url,
        data,
        onload: function (response) {
            if (response.status >= 200 && response.status < 400) {
                resolve(response.responseText);
            } else {
                console.error(`Error getting ${url}:`, response.status, response.statusText, response.responseText);
                resolve();
            }
        },
        onerror: function (response) {
            console.error(`Error during GM.xmlHttpRequest to ${url}:`,response);
            resolve(response);
        }
    }));
}



(function() {
    'use strict';
    // https://dtgf20221013065733307.worktile.com/api/user/me?t=1666150680508
    // https://dtgf20221013065733307.worktile.com/api/user/me

    const originUrl = window.location.origin
    let timeStamp = (new Date).getTime()
    const time = 5000
    var userinfo = false
    var projectName = ''
    const tipsObj = {infodata:[]}
    let notificationPush = false
    const WebHookUrl = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=8cf1621a-d9f3-47cb-8a94-7692aee68f90'
    // 检测是否登录(借助原本网站会跳页的性质只需获取一次)
    getApiData(originUrl + '/api/user/me?t=' + timeStamp).then((res)=>{
           const jsonData = res && JSON.parse(res)
           userinfo = jsonData?.data?.me ?? false
    }).catch(()=>{
        clearInterval(setIntervalFunc)
    })
    // 获取企业名称
    getApiData(originUrl+'/api/team?t='+timeStamp).then((res)=>{
           const jsonData = res && JSON.parse(res)
           projectName = jsonData?.data?.name
    }).catch(()=>{
        clearInterval(setIntervalFunc)
    })

    // 每隔5s获取数据
    var setIntervalFunc = setInterval(()=>{
        if(userinfo){
            handleNotificationData()
            timeStamp = (new Date).getTime()
        }else{
            setIntervalFunc && clearInterval(setIntervalFunc)
        }
    },time)

    // 处理通知数据
    async function handleNotificationData(){
        try {
            const data = await getApiData(originUrl+'/api/team/chats?t='+timeStamp)
            const jsonData = data && JSON.parse(data)
            const infodata = []
            let info = projectName + '\n\n'
            jsonData?.data?.sessions?.map(item => {
                if(item.unread){
                    infodata.push({name:item?.to?.display_name,unread:item.unread})
                    info += item?.to?.display_name + '发来'+ item.unread + '条消息\n'
                }
            })
            info+='\n请注意查看'
            // 判断与上次是否相同
            if(infodata.length > 0){
                infodata.map(item => {
                    if(!tipsObj.infodata.find(item1 => item.name === item1.name && item.unread === item1.unread)){
                        notificationPush = true
                    }
                })
                // 如果条数不对应也需要进行推送
                notificationPush = notificationPush ? notificationPush : (tipsObj.infodata.length !== infodata.length)
            }
            // 同步数据
            tipsObj.infodata = infodata
            // 推送通知
            if(notificationPush){
                notificationPush = false
                const webhook_data = {"msgtype": "text","text": {"content": info,"mentioned_mobile_list":[userinfo.mobile]}}
                handleWebHook(JSON.stringify(webhook_data))
            }
            if(jsonData.code !== 200){
                setIntervalFunc && clearInterval(setIntervalFunc)
            }
        } catch (error) {
            setIntervalFunc && clearInterval(setIntervalFunc)
        }
    }
    // 通知
    function handleWebHook(data){
        getApiData(WebHookUrl,'POST',data).catch(()=>{
            console.log(setIntervalFunc)
            setIntervalFunc && clearInterval(setIntervalFunc)
        })
    }
})();