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