Greasy Fork

WorkTile通知脚本

监听消息通知进行提示

目前为 2022-10-20 提交的版本。查看 最新版本

// ==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)
        })
    }
})();