WorkTile通知脚本

监听消息通知进行提示

// ==UserScript==
// @name         WorkTile通知脚本
// @namespace    YXKJ.WorkTile.lzg
// @license      MIT
// @version      0.3.3
// @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() {
  var _a, _b;
  "use strict";
  var r = (_a = document.__monkeyWindow) != null ? _a : window;
  r.GM;
  r.unsafeWindow = (_b = r.unsafeWindow) != null ? _b : window;
  r.unsafeWindow;
  r.GM_info;
  r.GM_cookie;
  var b = (...e) => r.GM_xmlhttpRequest(...e);
  const originUrl = window.location.origin;
  let timeStamp = new Date().getTime();
  const time = 5e3;
  var userinfo = false;
  var projectName = "";
  const tipsObj = { infoData: [] };
  let notificationPush = false;
  var setIntervalFunc = null;
  let WebHookUrl = "";
  {
    WebHookUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=93ef0c54-b9a4-4734-9c6c-aa6d8b717cca";
  }
  function getApiData(url, method = "GET", data) {
    let header = {};
    if (method === "POST") {
      header = { "Content-Type": "application/json" };
    }
    return new Promise((resolve) => b({
      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);
      }
    }));
  }
  setIntervalFunc && clearInterval(setIntervalFunc);
  async function tesingLoginFuc() {
    var _a2, _b2, _c;
    try {
      const userData = await getApiData(originUrl + "/api/user/me?t=" + timeStamp);
      const userJsonData = userData && JSON.parse(userData);
      userinfo = (_b2 = (_a2 = userJsonData == null ? void 0 : userJsonData.data) == null ? void 0 : _a2.me) != null ? _b2 : false;
      if (!userinfo)
        return;
      const teamData = await getApiData(originUrl + "/api/team?t=" + timeStamp);
      const teamJsonData = teamData && JSON.parse(teamData);
      projectName = (_c = teamJsonData == null ? void 0 : teamJsonData.data) == null ? void 0 : _c.name;
      let wsTime = 0;
      window.ws = new WebSocket("wss://im.worktile.com/socket.io/?token=" + userinfo.imToken + "&uid=" + userinfo.uid + "&client=web&EIO=3&transport=websocket");
      ws.onopen = () => {
        console.log("==\u8FDE\u63A5\u670D\u52A1\u5668\u6210\u529F==");
        setTimeout(() => {
          ws.send("40/message?token=" + userinfo.imToken + "&uid=" + userinfo.uid + "&client=web,");
        });
      };
      ws.onclose = () => {
        console.log("==Error to websocket\u5173\u95ED==");
        setIntervalFunc && clearInterval(setIntervalFunc);
        setIntervalFunc = setInterval(() => {
          console.log("==\u5DF2\u5F00\u542F\u517C\u5BB9\u6A21\u5F0F==");
          if (userinfo) {
            handleNotificationData();
            timeStamp = new Date().getTime();
          } else {
            setIntervalFunc && clearInterval(setIntervalFunc);
          }
        }, time);
      };
      ws.onerror = () => {
        console.log("==Error to websocket\u8FDE\u63A5\u51FA\u9519==");
        setIntervalFunc && clearInterval(setIntervalFunc);
        setIntervalFunc = setInterval(() => {
          console.log("==\u5DF2\u5F00\u542F\u517C\u5BB9\u6A21\u5F0F==");
          if (userinfo) {
            handleNotificationData();
            timeStamp = new Date().getTime();
          } else {
            setIntervalFunc && clearInterval(setIntervalFunc);
          }
        }, time);
      };
      ws.onmessage = (evt) => {
        var _a3;
        wsTime++;
        if (wsTime === 1) {
          const params = JSON.parse(evt.data.substring(1));
          setInterval(() => {
            ws.send("2");
          }, (_a3 = params == null ? void 0 : params.pingInterval) != null ? _a3 : 1e4);
        } else {
          const params = JSON.parse(evt.data.substring(evt.data.indexOf(",") + 1));
          if (params[1] && params[0] !== "feed") {
            handleNotificationData();
          }
        }
      };
    } catch (error) {
      console.log(error);
      setIntervalFunc && clearInterval(setIntervalFunc);
    }
  }
  tesingLoginFuc();
  async function handleNotificationData() {
    var _a2, _b2, _c, _d;
    try {
      const data = await getApiData(originUrl + "/api/team/chats?t=" + timeStamp);
      const jsonData = data && JSON.parse(data);
      const infoData = [];
      let info = projectName + "\n\n";
      (_b2 = (_a2 = jsonData == null ? void 0 : jsonData.data) == null ? void 0 : _a2.channels) == null ? void 0 : _b2.map((item) => {
        if (item.unread) {
          infoData.push({ name: item == null ? void 0 : item.name, unread: item.unread });
          info += (item == null ? void 0 : item.name) + "\u6709" + item.unread + "\u6761\u672A\u8BFB\n";
        }
      });
      (_d = (_c = jsonData == null ? void 0 : jsonData.data) == null ? void 0 : _c.sessions) == null ? void 0 : _d.map((item) => {
        var _a3, _b3;
        if (item.unread) {
          infoData.push({ name: (_a3 = item == null ? void 0 : item.to) == null ? void 0 : _a3.display_name, unread: item.unread });
          info += ((_b3 = item == null ? void 0 : item.to) == null ? void 0 : _b3.display_name) + "\u53D1\u6765" + item.unread + "\u6761\u6D88\u606F\n";
        }
      });
      info += "\n\u8BF7\u6CE8\u610F\u67E5\u770B";
      if (!userinfo.mobile) {
        info += "\n@" + userinfo.display_name + "(\u8BF7\u7ED1\u5B9A\u624B\u673A\u53F7)";
      }
      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 key = "yxkj@" + userinfo.display_name + "@" + projectName + "@notificationPush";
        if (getCookie(key) !== info) {
          setCookie(key, info);
          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(() => {
      setIntervalFunc && clearInterval(setIntervalFunc);
    });
  }
  function setCookie(name, value) {
    let hours = 8;
    let exp = new Date();
    exp.setTime(exp.getTime() + hours * 60 * 60 * 1e3);
    document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
  }
  function getCookie(name) {
    let arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
    if (arr = document.cookie.match(reg))
      return unescape(arr[2]);
    else
      return null;
  }
})();