jihuaqiang 2 rokov pred
rodič
commit
acca070370

+ 25 - 0
src/denet/chrome/index.js

@@ -0,0 +1,25 @@
+import chromeMessageCenter from '@/uilts/messageCenter/chrome';
+import MESSAGE_ENUM from '@/uilts/messageCenter/chrome/messageEnum'
+
+export default {
+    // ---- 获取推文文案 ---- 
+    test({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            chromeMessageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.BACK_TO_CONTENT_TEST,
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    }
+}

+ 93 - 0
src/denet/content/doTask.js

@@ -0,0 +1,93 @@
+import MESSAGE_ENUM from '@/uilts/messageCenter/iframe/messageEnum'
+import messageCenter from '@/uilts/messageCenter/iframe'
+import { getQueryString } from '@/uilts/help'
+const iframeId = getQueryString('iframeId')
+
+// 做任务
+const doTask = {
+    createTweet({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_CREATE_TWEET,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    },
+    like({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_LIKE,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId,
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    },
+    follows({ follows }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_FOLLOWS,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    follows
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    },
+    reTweet({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_RETWEET,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    }
+}
+
+export default doTask
+
+// iframe > dom id 
+// iframe > createTweet  dom id 

+ 30 - 0
src/denet/content/dom.js

@@ -0,0 +1,30 @@
+import MESSAGE_ENUM from '@/uilts/messageCenter/iframe/messageEnum'
+import messageCenter from '@/uilts/messageCenter/iframe'
+import { getQueryString } from '@/uilts/help'
+const iframeId = getQueryString('iframeId')
+
+const dom = {
+    // ---- 获取推文文案 ---- 
+    getTweetText({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DOM_GET_TWEET_TEXT,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    }
+}
+
+export default dom

+ 7 - 0
src/denet/content/index.js

@@ -0,0 +1,7 @@
+import doTask from '@/denet/content/doTask'
+import dom from '@/denet/content/dom'
+
+export default {
+    doTask,
+    dom
+}

+ 7 - 0
src/denet/index.js

@@ -0,0 +1,7 @@
+import content from '@/denet/content'
+
+const denet = {
+    content
+}
+
+export default denet

+ 3 - 0
src/entry/background.js

@@ -35,6 +35,7 @@ import {
 import {
     closeAchPayNoticeHandler
 } from "@/logic/background/denet";
+import chromeMessageCenter from '@/uilts/messageCenter/chrome';
 
 try {
     chrome.runtime.onMessage.addListener(onMessageMethod);
@@ -298,6 +299,8 @@ function onMessageMethod(req, sender, sendResponse) {
                     closeAchPayNoticeHandler();
                     break;
             }
+
+            chromeMessageCenter.init(req)
         }
     } catch (error) {
         Report.reportLog({

+ 31 - 8
src/entry/content.js

@@ -59,6 +59,9 @@ import {
     injectDenet
 } from "@/logic/content/denet.js";
 
+import doTask from '@/logic/content/help/doTask'
+import chromeMessageCenter from '@/uilts/messageCenter/chrome';
+
 chrome.storage.onChanged.addListener(changes => {
     initExecuteScript(changes)
 })
@@ -72,9 +75,15 @@ window.onload = () => {
         data: {}
     });
 };
+
+
 window.onmessage = (res) => {
-    if (res.data && res.data.actionType) {
-        switch (res.data.actionType) {
+    if (!res.data) {
+        return
+    }
+    let { info, data = {} } = res.data
+    if ((res.data.actionType) || (info && info.actionType)) {
+        switch ((info && info.actionType) || res.data.actionType) {
             case "IFRAME_SHOW_IFREME":
                 showIframeHandler();
                 break;
@@ -118,16 +127,20 @@ window.onmessage = (res) => {
                 pageJumpHandler(res.data.data);
                 break;
             case 'IFRAME_GET_EXTENSION_STORGE_DATA':
-                getExtensionStorgeDataForIframe(res.data.data);
+                getExtensionStorgeDataForIframe(res.data);
                 break;
             case 'IFRAME_DO_TASK_CREATE_TWEET':
-                // 做任务
-                // 接受数据,sendmessage
-                console.log('IFRAME_DO_TASK_CREATE_TWEET', res)
+                doTask.TwitterApiCreateTweet({ info, data })
+                break
+            case 'IFRAME_DO_TASK_LIKE':
+                doTask.TwitterLikeAPI({ info, data })
+                break
+            case 'IFRAME_DO_TASK_RETWEET':
+                doTask.TwitterRetweetAPI({ info, data })
                 break
             case 'IFRAME_TWITTER_API_DO_TASK':
-                console.log('IFRAME_TWITTER_API_DO_TASK...',res)
-                doTaskTwitterAPI(res)
+                console.log('IFRAME_TWITTER_API_DO_TASK...',res.data)
+                doTaskTwitterAPI(res.data)
                 break
             
         }
@@ -244,6 +257,16 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
         case 'GET_CONTENT_BY_TWITTER_ID':
             sendContentByTwitterID(req.data.tweet_Id)
             break
+        case 'TEST':
+            console.log('TEST')
+            break
     }
     sendResponse && sendResponse('ok');
+    chromeMessageCenter.init(req)
 })
+
+// denet.chrome.test().then() 发background activeType 获取返回调用
+
+// content to background tabId
+// background to content 
+// content to background tabId

+ 6 - 5
src/logic/content/ParseCard.js

@@ -1,9 +1,8 @@
-import { iframeHost } from '@/http/configAPI'
-import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
 import ToolBox from '@/view/content/tool-box/index.vue'
 import { createApp } from 'vue'
 import { getStorage, setStorage, guid, getInnerIframeURL } from '@/uilts/help'
 import { chromeExtensionUrl } from '@/uilts/chromeExtension'
+import { iframeHost } from '@/http/configAPI'
 // 解析卡片类
 // 1.dom匹配
 // 2.找出网页匹配 获取twitterid
@@ -316,7 +315,7 @@ class ParseCard {
         }
         _iframe.id = post_Id
         _iframe.dataset.card = 'denet'
-        _iframe_url = getInnerIframeURL(`${iframeHost}/red-pack` + `?postId=${post_Id}${tweet_str}&tweet_author=${tweet_author}&window_origin=${window.location.origin}&page_type=${page_type}&iframeID=${_iframe.id}`);
+        _iframe_url = getInnerIframeURL(`${iframeHost}/red-pack` + `?postId=${post_Id}${tweet_str}&tweet_author=${tweet_author}&window_origin=${window.location.origin}&page_type=${page_type}&iframeId=${_iframe.id}`);
         // _iframe_url = chromeExtensionUrl + ('iframe/red-packet.html') + `?postId=${post_Id}${tweet_str}&tweet_author=${tweet_author}&window_origin=${window.location.origin}&page_type=${page_type}`;
         // debugger mode
         if (window.location.href.includes('denet_debugger')) {
@@ -346,9 +345,11 @@ class ParseCard {
         return _iframe
     }
     createTreasureIframe(params = { page_type, tweet_Id, post_Id, invite_code, invite_channel }) {
+        let _iframeId = `denet-${guid()}`
         let _iframe = document.createElement('iframe')
-        _iframe.id = params.post_Id
-        _iframe.src = chromeExtensionUrl + ('iframe/treasure-hunt.html') + `?params=${JSON.stringify(params)}&iframeId=${guid()}`;
+        _iframe.id = _iframeId
+        _iframe.dataset.card = 'denet'
+        _iframe.src = chromeExtensionUrl + ('iframe/treasure-hunt.html') + `?params=${JSON.stringify(params)}&iframeId=${_iframeId}`;
         _iframe.style.cssText = 'border:medium none; width:375px; min-height:580px; border: 1px solid #DCDCDC; border-radius: 20px;'
         return _iframe
     }

+ 151 - 0
src/logic/content/help/doTask.js

@@ -0,0 +1,151 @@
+import messageCenter from '@/uilts/messageCenter/content';
+import { getCookie } from '@/uilts/help'
+
+
+const TwitterApiCreateTweet = ({ info, data }) => {
+    let params = {
+        queryId: "hC1nuE-2d1NX5LYBuuAvtQ",
+        features: {
+            "dont_mention_me_view_api_enabled": true,
+            "interactive_text_enabled": true,
+            "responsive_web_uc_gql_enabled": false,
+            "vibe_api_enabled": true,
+            "responsive_web_edit_tweet_api_enabled": false,
+            "standardized_nudges_misinfo": true,
+            "responsive_web_enhance_cards_enabled": false
+        },
+        variables: {
+            "tweet_text": data.txt,
+            "media": {
+                "media_entities": [],
+                "possibly_sensitive": false
+            },
+            "withDownvotePerspective": true,
+            "withReactionsMetadata": false,
+            "withReactionsPerspective": false,
+            "withSuperFollowsTweetFields": true,
+            "withSuperFollowsUserFields": true,
+            "semantic_annotation_ids": [],
+            "dark_request": false
+        }
+    };
+    axios.post(`https://twitter.com/i/api/graphql/hC1nuE-2d1NX5LYBuuAvtQ/CreateTweet`,
+        params, {
+        headers: {
+            "accept": "*/*",
+            "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+            "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
+            "content-type": "application/json",
+            "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"101\", \"Google Chrome\";v=\"101\"",
+            "sec-ch-ua-mobile": "?0",
+            "sec-ch-ua-platform": "\"Windows\"",
+            "sec-fetch-dest": "empty",
+            "sec-fetch-mode": "cors",
+            "sec-fetch-site": "same-origin",
+            "x-csrf-token": getCookie('ct0'),
+            "x-twitter-active-user": "yes",
+            "x-twitter-auth-type": "OAuth2Session",
+            "x-twitter-client-language": "en"
+        },
+    }).then(function (response) {
+        messageCenter.send({ info, data: response })
+    }).catch(function (err) {
+        messageCenter.send({ info, data: err })
+    });
+}
+
+const TwitterLikeAPI = ({ info, data }) => {
+    fetch("https://twitter.com/i/api/graphql/lI07N6Otwv1PhnEgXILM7A/FavoriteTweet", {
+        "headers": {
+            "accept": "*/*",
+            "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+            "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
+            "content-type": "application/json",
+            "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"101\", \"Google Chrome\";v=\"101\"",
+            "sec-ch-ua-mobile": "?0",
+            "sec-ch-ua-platform": "\"Windows\"",
+            "sec-fetch-dest": "empty",
+            "sec-fetch-mode": "cors",
+            "sec-fetch-site": "same-origin",
+            "x-csrf-token": getCookie('ct0'),
+            "x-twitter-active-user": "yes",
+            "x-twitter-auth-type": "OAuth2Session",
+            "x-twitter-client-language": "en"
+        },
+        "referrer": "https://twitter.com/home",
+        "referrerPolicy": "strict-origin-when-cross-origin",
+        "body": "{\"variables\":{\"tweet_id\":\"" + data.tweetId + "\"},\"queryId\":\"lI07N6Otwv1PhnEgXILM7A\"}",
+        "method": "POST",
+        "mode": "cors",
+        "credentials": "include"
+    }).then(() => {
+        // 返回信息
+        messageCenter.send({ info, data: { task_done: true } })
+    }).catch(() => {
+        messageCenter.send({ info, data: { task_done: false } })
+    })
+}
+
+// const TwitterFollowAPI = ({ info, data }) => {
+//     // 
+//     fetch("https://twitter.com/i/api/1.1/friendships/create.json", {
+//         "headers": {
+//             "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
+//             "content-type": "application/x-www-form-urlencoded",
+//             "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
+//             "sec-ch-ua-mobile": "?0",
+//             "sec-ch-ua-platform": "\"macOS\"",
+//             "x-csrf-token": getCookie('ct0'),
+//             "x-twitter-active-user": "yes",
+//             "x-twitter-auth-type": "OAuth2Session",
+//             "x-twitter-client-language": "zh-cn"
+//         },
+//         "referrer": "https://twitter.com/home",
+//         "referrerPolicy": "strict-origin-when-cross-origin",
+//         "body": "include_profile_interstitial_type=1&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&include_mute_edge=1&include_can_dm=1&include_can_media_tag=1&include_ext_has_nft_avatar=1&skip_status=1&user_id=" + data.follow_name + "",
+//         "method": "POST",
+//         "mode": "cors",
+//         "credentials": "include"
+//     }).then(() => {
+//         messageCenter.send({ info, data: { task_done: true, follow_name: data.follow_name } })
+//     }).catch(() => {
+//         messageCenter.send({ info, data: { task_done: false, follow_name: data.follow_name } })
+//     })
+// }
+
+const TwitterRetweetAPI = ({ info, data }) => {
+    fetch("https://twitter.com/i/api/graphql/ojPdsZsimiJrUGLR1sjUtA/CreateRetweet", {
+        "headers": {
+            "accept": "*/*",
+            "accept-language": "zh,en;q=0.9,zh-CN;q=0.8",
+            "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
+            "content-type": "application/json",
+            "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
+            "sec-ch-ua-mobile": "?0",
+            "sec-ch-ua-platform": "\"macOS\"",
+            "sec-fetch-dest": "empty",
+            "sec-fetch-mode": "cors",
+            "sec-fetch-site": "same-origin",
+            "x-csrf-token": getCookie('ct0'),
+            "x-twitter-active-user": "yes",
+            "x-twitter-auth-type": "OAuth2Session",
+            "x-twitter-client-language": "zh-cn"
+        },
+        "referrer": "https://twitter.com/home",
+        "referrerPolicy": "strict-origin-when-cross-origin",
+        "body": "{\"variables\":{\"tweet_id\":\"" + data.tweetId + "\",\"dark_request\":false},\"queryId\":\"ojPdsZsimiJrUGLR1sjUtA\"}",
+        "method": "POST",
+        "mode": "cors",
+        "credentials": "include"
+    }).then(() => {
+        messageCenter.send({ info, data: { task_done: true } })
+    }).catch(() => {
+        messageCenter.send({ info, data: { task_done: false } })
+    })
+}
+
+export default {
+    TwitterApiCreateTweet,
+    TwitterLikeAPI,
+    TwitterRetweetAPI
+}

+ 40 - 40
src/logic/content/help/twitter.js

@@ -3,45 +3,45 @@ import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
 
 // 根据提示dom 跳转到推文详情页面
 export const jumpTwitterDetailByAlert = () => {
-    let num = 10
-    let timer = setInterval(() => {
-        if (num <= 0) {
-            clearInterval(timer)
-            return
-        }
-        let alert = document.querySelector('div[role=alert]')
-        if (alert) {
-            let a = alert.querySelector('a')
-            if (a) {
-                clearInterval(timer)
-                a.click()
-            }
-        }
-        num--
-    }, 500)
+  let num = 10
+  let timer = setInterval(() => {
+    if (num <= 0) {
+      clearInterval(timer)
+      return
+    }
+    let alert = document.querySelector('div[role=alert]')
+    if (alert) {
+      let a = alert.querySelector('a')
+      if (a) {
+        clearInterval(timer)
+        a.click()
+      }
+    }
+    num--
+  }, 500)
 }
 
 export const showEditTweet = (callback) => {
-    let bigBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
-    if (bigBtn) {
-        bigBtn.click();
-    } else {
-        let smallBtn = document.querySelector('a[href="/compose/tweet"]')
-        smallBtn && smallBtn.click();
+  let bigBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
+  if (bigBtn) {
+    bigBtn.click();
+  } else {
+    let smallBtn = document.querySelector('a[href="/compose/tweet"]')
+    smallBtn && smallBtn.click();
+  }
+  let num = 10
+  let timer = setInterval(() => {
+    if (num <= 0) {
+      clearInterval(timer)
+      return
+    }
+    let inputEle = document.querySelector('div[contenteditable="true"]');
+    if (inputEle) {
+      clearInterval(timer)
+      callback && callback()
     }
-    let num = 10
-    let timer = setInterval(() => {
-        if(num <= 0){
-            clearInterval(timer)
-            return
-        }
-        let inputEle = document.querySelector('div[contenteditable="true"]');
-        if(inputEle){
-            clearInterval(timer)
-            callback && callback()
-        }
-        num--
-    }, 500);
+    num--
+  }, 500);
 }
 
 export const setDeviceInfo = async () => {
@@ -60,9 +60,9 @@ export const setDeviceInfo = async () => {
   }
 
   let storageDeviceInfo = getStorage(deviceStorageParams.name);
-  if(!storageDeviceInfo) {
+  if (!storageDeviceInfo) {
     let res = await getVisitorId();
-    let id =  res && res.visitorId || '';
+    let id = res && res.visitorId || '';
     setStorage(deviceStorageParams.name, id);
     deviceInfo.deviceId1 = id;
   } else {
@@ -70,7 +70,7 @@ export const setDeviceInfo = async () => {
   }
 
   let cookieDeviceInfo = getCookie(deviceCookieParams.name);
-  if(!cookieDeviceInfo) {
+  if (!cookieDeviceInfo) {
     let rid = guid();
     setCookie(deviceCookieParams.name, rid, 600);
     deviceInfo.deviceId2 = rid;
@@ -78,5 +78,5 @@ export const setDeviceInfo = async () => {
     deviceInfo.deviceId2 = cookieDeviceInfo;
   }
 
-  setChromeStorage({'deviceInfo': JSON.stringify(deviceInfo)});
-}
+  setChromeStorage({ 'deviceInfo': JSON.stringify(deviceInfo) });
+}

+ 107 - 68
src/logic/content/twitter.js

@@ -10,7 +10,7 @@ import { jumpTwitterDetailByAlert, showEditTweet } from '@/logic/content/help/tw
 import { clearPostContent, setGroupIconStatus } from '@/logic/content/nft.js'
 import { toolBox } from '@/logic/content/ToolBox'
 import axios from 'axios';
-import messageCenter from '@/uilts/messageCenter';
+import messageCenter from '@/uilts/messageCenter/content';
 import { PlayType } from '@/types';
 import { reSetBindPostContent } from '@/http/help.js';
 import { setDeviceInfo } from '@/logic/content/help/twitter';
@@ -882,10 +882,10 @@ function setIframeCard(type = 'twitter') {
                             index = Number(i) + 1
                             if (arr[i] == 'invite' && arr.length >= index) {
                                 item.invite_code = arr[index];
-                                if(arr.length > index + 1) {
-                                  item.invite_channel = arr[index+1];
+                                if (arr.length > index + 1) {
+                                    item.invite_channel = arr[index + 1];
                                 } else {
-                                  item.invite_channel = '';
+                                    item.invite_channel = '';
                                 }
                                 break
                             }
@@ -1079,18 +1079,18 @@ export const getTweetUserFollowStatus = (params) => {
     Promise.allSettled(promiseList).then((res) => {
         let list = [];
         if (res && res.length) {
-          let resList = res.filter(item => item.status == 'fulfilled');
-          for (let i = 0; i < resList.length; i++) {
-              let item = resList[i];
-              if (item && item.value && item.value.data && item.value.data.data) {
-                  list.push(item.value.data.data)
-              }
-          }
+            let resList = res.filter(item => item.status == 'fulfilled');
+            for (let i = 0; i < resList.length; i++) {
+                let item = resList[i];
+                if (item && item.value && item.value.data && item.value.data.data) {
+                    list.push(item.value.data.data)
+                }
+            }
         }
 
         chrome.runtime.sendMessage({ actionType: 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES', data: list, tweetId, type: params.type, iframeId: params.iframeId }, () => { })
     }).catch(err => {
-      chrome.runtime.sendMessage({ actionType: 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES', data: [], tweetId, type: params.type, iframeId: params.iframeId }, () => { })
+        chrome.runtime.sendMessage({ actionType: 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES', data: [], tweetId, type: params.type, iframeId: params.iframeId }, () => { })
     })
 }
 
@@ -1411,7 +1411,8 @@ export function getTweetAuthorByDom(params) {
         }
     }
 }
-export function doTaskTwitterAPI({ task_data, task_type, tasks, iframeId }) {
+export function doTaskTwitterAPI({ info, data }) {
+    const { task_data, task_type, tasks } = data
     switch (task_type) {
         case 'like':
             TwitterLikeAPI(task_data.tweet_Id)
@@ -1422,7 +1423,7 @@ export function doTaskTwitterAPI({ task_data, task_type, tasks, iframeId }) {
         case 'follow':
             task_data.follow_data.forEach((item) => {
                 if (item.name && item.twitterUserId) {
-                    TwitterFollowAPI(item, task_data.tweet_Id)
+                    TwitterFollowAPI(item, task_data.tweet_Id, info)
                 }
             })
             break
@@ -1446,7 +1447,7 @@ export function doTaskTwitterAPI({ task_data, task_type, tasks, iframeId }) {
                     // 推文发推
                     case '10':
                         // 发推
-                        TwitterApiCreateTweet({ text: task_data.tweet_text, tweet_Id: task_data.tweet_Id, iframeId })
+                        TwitterApiCreateTweet({ text: task_data.tweet_text, tweet_Id: task_data.tweet_Id, iframeId:info.iframeId })
                         break
                 }
 
@@ -1463,48 +1464,48 @@ export function showJoinDialog(data) {
 }
 
 const TwitterFriendshipsUpdate = (params) => {
-  let {id = '', device = true, name} = params || {};
-  let data = {
-    include_profile_interstitial_type: 1,
-    include_blocking: 1,
-    include_blocked_by: 1,
-    include_followed_by: 1,
-    include_want_retweets: 1,
-    include_mute_edge: 1,
-    include_can_dm: 1,
-    include_can_media_tag: 1,
-    include_ext_has_nft_avatar: 1,
-    skip_status: 1,
-    cursor: -1,
-    id,
-    device
-  }
-  if(!id) {
-    return;
-  }
-  return fetch("https://twitter.com/i/api/1.1/friendships/update.json", {
-      "headers": {
-          "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
-          "content-type": "application/x-www-form-urlencoded",
-          "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
-          "sec-ch-ua-mobile": "?0",
-          "sec-ch-ua-platform": "\"macOS\"",
-          "x-csrf-token": getCookie('ct0'),
-          "x-twitter-active-user": "yes",
-          "x-twitter-auth-type": "OAuth2Session",
-          "x-twitter-client-language": "en",
-          "referer": `https://twitter.com/${name}`
-      },
-      "referrer": `https://twitter.com/${name}`,
-      "referrerPolicy": "strict-origin-when-cross-origin",
-      "body": `include_profile_interstitial_type=1&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&include_mute_edge=1&include_can_dm=1&include_can_media_tag=1&include_ext_has_nft_avatar=1&skip_status=1&cursor=-1&id=${id}&device=true`,
-      "method": "POST",
-      "mode": "cors",
-      "credentials": "include"
-  })
-}
-
-const TwitterFollowAPI = (item, tweet_Id) => {
+    let { id = '', device = true, name } = params || {};
+    let data = {
+        include_profile_interstitial_type: 1,
+        include_blocking: 1,
+        include_blocked_by: 1,
+        include_followed_by: 1,
+        include_want_retweets: 1,
+        include_mute_edge: 1,
+        include_can_dm: 1,
+        include_can_media_tag: 1,
+        include_ext_has_nft_avatar: 1,
+        skip_status: 1,
+        cursor: -1,
+        id,
+        device
+    }
+    if (!id) {
+        return;
+    }
+    return fetch("https://twitter.com/i/api/1.1/friendships/update.json", {
+        "headers": {
+            "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
+            "content-type": "application/x-www-form-urlencoded",
+            "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
+            "sec-ch-ua-mobile": "?0",
+            "sec-ch-ua-platform": "\"macOS\"",
+            "x-csrf-token": getCookie('ct0'),
+            "x-twitter-active-user": "yes",
+            "x-twitter-auth-type": "OAuth2Session",
+            "x-twitter-client-language": "en",
+            "referer": `https://twitter.com/${name}`
+        },
+        "referrer": `https://twitter.com/${name}`,
+        "referrerPolicy": "strict-origin-when-cross-origin",
+        "body": `include_profile_interstitial_type=1&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&include_mute_edge=1&include_can_dm=1&include_can_media_tag=1&include_ext_has_nft_avatar=1&skip_status=1&cursor=-1&id=${id}&device=true`,
+        "method": "POST",
+        "mode": "cors",
+        "credentials": "include"
+    })
+}
+
+const TwitterFollowAPI = (item, tweet_Id, info) => {
     fetch("https://twitter.com/i/api/1.1/friendships/create.json", {
         "headers": {
             "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
@@ -1527,12 +1528,29 @@ const TwitterFollowAPI = (item, tweet_Id) => {
         let task_data = {
             follow_name: item.name
         }
-        TwitterFriendshipsUpdate({id: item.twitterUserId, name: item.name})
-
-        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'follow', task_data, task_done: true }, () => { })
+        TwitterFriendshipsUpdate({ id: item.twitterUserId, name: item.name })
+        messageCenter.send({
+            info: {
+                actionType: "DO_TASK",
+                iframeId: info.iframeId
+            },
+            data: {
+                do_type: 'api', tweet_Id, task_type: 'follow', task_data, task_done: true
+            }
+        })
+        // chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'follow', task_data, task_done: true }, () => { })
     }).catch(() => {
         console.log('DO_TASK3')
-        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'follow', task_data, task_done: false }, () => { })
+        messageCenter.send({
+            info: {
+                actionType: "DO_TASK",
+                iframeId: info.iframeId
+            },
+            data: {
+                do_type: 'api', tweet_Id, task_type: 'follow', task_data, task_done: false
+            }
+        })
+        // chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'follow', task_data, task_done: false }, () => { })
     })
 }
 
@@ -2338,7 +2356,12 @@ const addPageScrollEvent = () => {
         contentHeight: contentDom.offsetHeight
     }
 
-    messageCenter.send('de-tab-group-content', 'CONTENT_GROUP_LIST_SCROLL', data)
+    messageCenter.send({
+        info: {
+            iframeId: 'de-tab-group-content', actionType: 'CONTENT_GROUP_LIST_SCROLL'
+        },
+        data
+    })
 
     // chrome.runtime.sendMessage({
     //     actionType: "CONTENT_GROUP_LIST_SCROLL",
@@ -2424,7 +2447,11 @@ const setGroupTabSelfStyle = (params = {}) => {
  * 切换到 Group tab时 刷新列表
  */
 export const refreshTabGroup = () => {
-    messageCenter.send('de-tab-group-content', 'CONTENT_REFRESH_TAB_GROUP_LIST', {})
+    messageCenter.send({
+        info: {
+            iframeId: 'de-tab-group-content', actionType: 'CONTENT_REFRESH_TAB_GROUP_LIST'
+        }
+    })
     //     chrome.runtime.sendMessage({
     //         actionType: "CONTENT_REFRESH_TAB_GROUP_LIST",
     //         data: {}
@@ -2506,7 +2533,7 @@ const addTabGroupContent = (cb) => {
     let iframe = document.createElement('iframe');
     iframe.id = 'de-tab-group-content';
     iframe.dataset.card = 'denet';
-    iframe.src = getInnerIframeURL(`${iframeHost}/tab-group` + `?params=${JSON.stringify(params)}&iframeID=${iframe.id}`);
+    iframe.src = getInnerIframeURL(`${iframeHost}/tab-group` + `?params=${JSON.stringify(params)}&iframeId=${iframe.id}`);
     iframe.style.cssText = `border: medium none; height: 500px;display: none`
 
     let iframeContent = getGroupTabContentNode();
@@ -2608,7 +2635,9 @@ export const getTweetProfileNavTop = (params) => {
     let top = document.querySelector('div[role="tablist"]').closest('nav').getBoundingClientRect().top;
 
     messageCenter.send({
-        actionType: "CONTENT_SEND_GROUP_NAV_TOP",
+        info: {
+            actionType: "CONTENT_SEND_GROUP_NAV_TOP"
+        },
         data: {
             top,
             scrollTop: params.scrollTop
@@ -2652,9 +2681,17 @@ export const setGroupInfo = (params = {}) => {
     }
 }
 
-export const getExtensionStorgeDataForIframe = (data) => {
+export const getExtensionStorgeDataForIframe = (req) => {
+    const { info, data } = req
+    console.log('getExtensionStorgeDataForIframe', info, data);
     getChromeStorage(data.key).then((res) => {
-        messageCenter.send(data.iframeID, `IFRAME_GET_EXTENSION_STORGE_DATA-${data.messageID}`, res)
+        messageCenter.send({
+            info: {
+                iframeId: info.iframeId,
+                actionType: info.messageId
+            },
+            data: res
+        })
     });
 }
 
@@ -2681,7 +2718,9 @@ const sysThemeChange = () => {
     setTimeout(() => {
         let bgColor = document.querySelector('body').style.backgroundColor;
         messageCenter.send({
-            actionType: "CONTENT_SYS_THEME_CHANGE",
+            info: {
+                actionType: "CONTENT_SYS_THEME_CHANGE"
+            },
             data: {
                 theme: systemInfo.theme,
                 twitterTheme: bgColor == 'rgb(0, 0, 0)' ? 'dark' : 'light'

+ 0 - 6
src/uilts/denet.js

@@ -1,6 +0,0 @@
-import Content from '@/uilts/messageCenter/messageContent'
-
-let denet = {}
-denet.content = Content
-
-export default denet

+ 1 - 1
src/uilts/help.js

@@ -320,4 +320,4 @@ export const getBeforeTimeFormat = (timestamp) => {
   }
   let _s = moment.duration(_d1.diff(_d2)).seconds()
   return plural(_s, 'sec')
-}
+}

+ 103 - 0
src/uilts/messageCenter/chrome/index.js

@@ -0,0 +1,103 @@
+import { guid } from '@/uilts/help'
+//  iframe 通信中心
+class MessageCenter {
+    constructor() {
+        //  缓存事件队列
+        this.messageCallbackMap = new Map();
+        this.messageFailbackMap = new Map();
+        this.timer = null
+    }
+
+    send({ info = {}, data = {}, callback, overTime, failback }) {
+        if (!info.messageId) {
+            info.messageId = `${info.actionType}-${guid()}` // 唯一的ID,用于标记回调函数
+        }
+        try {
+            chrome.runtime.sendMessage({
+                info,
+                data
+            })
+
+            if (info.messageId && callback) {
+                // 带回调callback 的message, 要求携带messageId,callback,failback等
+                this.listen(info.messageId, callback)
+            }
+            if (failback) {
+                this.addFailback(info.messageId, overTime, failback)
+            }
+
+        } catch (error) {
+            failback({
+                error: 2,
+                msg: String(error)
+            })
+        }
+    }
+
+    listen(messageId, callback) {
+        // 序列添加失败回调
+        this.messageCallbackMap.set(messageId, { callback })
+    }
+
+    addFailback(messageId, overTime = 2000, failback) {
+        // 序列添加失败回调
+        this.messageFailbackMap.set(messageId, {
+            time: new Date().getTime(),
+            overTime,
+            failback
+        })
+        this.checkTimer()
+    }
+
+    init(req = {}) {
+        const { info, data } = req;
+        if (!info || !data) {
+            return
+        }
+        // 序列删除 失败回调
+        this.messageFailbackMap.delete(info.messageId);
+
+        // 执行成功回调
+        const _item = this.messageCallbackMap.get(info.messageId);
+        if (_item) {
+            const callback = _item.callback
+            callback(data)
+            // 序列删除 成功回调
+            this.messageCallbackMap.delete(info.messageId)
+        }
+        this.checkTimer()
+    }
+    checkTimer() {
+        if (this.timer) {
+            return
+        }
+        let key, value, now_time
+        this.timer = setInterval(() => {
+            if (this.messageFailbackMap.size == 0) {
+                clearInterval(this.timer)
+                this.timer = null
+            }
+
+            // 轮询查看有无超期的message信息
+            now_time = new Date().getTime();
+            for (let item of this.messageFailbackMap.entries()) {
+                key = item[0] || ''
+                value = item[1] || {}
+
+                if (now_time - value.time > value.overTime) {
+                    const callback = value.failback
+                    callback && callback({
+                        error: 1,
+                        msg: "message 超时错误"
+                    })
+                    this.messageFailbackMap.delete(key)
+                }
+            }
+        }, 1000)
+    }
+}
+
+// messageCenter在页面内实例化一次
+const messageCenter = new MessageCenter();
+
+export default messageCenter;

+ 13 - 0
src/uilts/messageCenter/chrome/messageEnum.js

@@ -0,0 +1,13 @@
+/** 向ServiceWorker发送的事件定义 */
+const CONTENT_TO_BACK_ENUM = {
+    CONTENT_TO_BACK_TEST: 'CONTENT_TO_BACK_TEST'
+}
+
+
+/** 接收ServiceWorker的事件定义 */
+const BACK_TO_CONTENT_ENUM = {
+    /** 切换到group tab */
+    BACK_TO_CONTENT_TEST: 'BACK_TO_CONTENT_TEST'
+}
+
+export default { ...CONTENT_TO_BACK_ENUM, ...BACK_TO_CONTENT_ENUM }

+ 60 - 0
src/uilts/messageCenter/content/index.js

@@ -0,0 +1,60 @@
+class MessageCenter {
+    constructor() {
+        this.iframeMap = new Map();
+        this.messageCallbackMap = new Map();
+        // this.listen()
+    }
+
+    findIframeById(id) {
+        let target = this.iframeMap.get(id);
+        if (!target) {
+            target = document.getElementById(id)
+            this.iframeMap.set('id', target)
+        }
+        return target
+    }
+
+    send({ info, data }) {
+        const target = this.findIframeById(info.iframeId);
+        target && target.contentWindow.postMessage({
+            info,
+            data
+        }, '*')
+    }
+
+    sendAll({ info, data }) {
+        const targets = document.querySelectorAll('iframe[data-card=denet]') || []
+        targets.forEach((item) => {
+            item.contentWindow.postMessage({
+                info,
+                data
+            }, '*')
+        })
+    }
+
+    // ---- don't use ---- 
+    // add(actionType, callback) {
+    //     let activeQuene = this.messageCallbackMap.get(actionType);
+    //     if (activeQuene?.length > 0) {
+    //         activeQuene.push(callback)
+    //     } else {
+    //         this.messageCallbackMap.set(actionType, [callback])
+    //     }
+    // }
+    // ---- don't use ---- 
+    // listen() {
+    //     window.addEventListener('message', (e) => {
+    //         const { actionType, data } = e.data;
+    //         console.log('get message in content ...', actionType, data)
+    //         const quene = this.messageCallbackMap.get(actionType) || [];
+    //         while (quene.length > 0) {
+    //             let callback = quene.pop();
+    //             callback(data)
+    //         }
+    //     })
+    // }
+}
+
+const messageCenter = new MessageCenter();
+
+export default messageCenter;

+ 0 - 3
src/uilts/messageCenter/messageEnum.js → src/uilts/messageCenter/content/messageEnum.js

@@ -7,9 +7,6 @@ const SEND_MESSAGE_ENUM = {
     /** 获取content的localstorge数据 */
     IFRAME_GET_EXTENSION_STORGE_DATA: 'IFRAME_GET_EXTENSION_STORGE_DATA',
 
-    // ---- 做任务 ----
-    IFRAME_DO_TASK_CREATE_TWEET: 'IFRAME_DO_TASK_CREATE_TWEET'
-
 }
 
 /** 接收父窗口的事件定义 */

+ 95 - 0
src/uilts/messageCenter/iframe/index.js

@@ -0,0 +1,95 @@
+import { guid } from '@/uilts/help'
+//  iframe 通信中心
+class MessageCenter {
+    constructor() {
+        //  缓存事件队列
+        this.messageCallbackMap = new Map();
+        this.messageFailbackMap = new Map();
+        this.timer = null
+        this.init()
+    }
+
+    send({ info = {}, data = {}, callback, overTime, failback }) {
+        if (callback) { 
+            info.messageId = `${info.actionType}-${guid()}` // 唯一的ID,用于标记回调函数
+        }
+        window.parent.postMessage({
+            info,
+            data
+        }, '*');
+        if (callback) {
+            // 带回调callback 的message, 要求携带messageId,callback,failback等
+            this.listen(info.messageId, callback)
+            if (failback) {
+                this.addFailback(info.messageId, overTime, failback)
+            }
+        }
+    }
+
+    listen(messageId, callback) {
+        // 序列添加失败回调
+        this.messageCallbackMap.set(messageId, { callback })
+    }
+
+    addFailback(messageId, overTime = 2000, failback) {
+        // 序列添加失败回调
+        this.messageFailbackMap.set(messageId, {
+            time: new Date().getTime(),
+            overTime,
+            failback
+        })
+        this.checkTimer()
+    }
+
+    init() {
+        window.addEventListener('message', (e) => {
+            const { info, data } = e.data;
+            // 序列删除 失败回调
+            this.messageFailbackMap.delete(info.messageId);
+
+            // 执行成功回调
+            const _item = this.messageCallbackMap.get(info.messageId);
+            if (_item) {
+                const callback = _item.callback
+                callback(data)
+                // 序列删除 成功回调
+                this.messageCallbackMap.delete(info.messageId)
+            }
+        })
+
+        this.checkTimer()
+    }
+    checkTimer() {
+        if (this.timer) {
+            return
+        }
+        let key, value, now_time
+        this.timer = setInterval(() => {
+            if (this.messageFailbackMap.size == 0) {
+                clearInterval(this.timer)
+                this.timer = null
+            }
+
+            // 轮询查看有无超期的message信息
+            now_time = new Date().getTime();
+            for (let item of this.messageFailbackMap.entries()) {
+                key = item[0] || ''
+                value = item[1] || {}
+
+                if (now_time - value.time > value.overTime) {
+                    const callback = value.failback
+                    callback && callback({
+                        error: 1,
+                        msg: "message 超时错误"
+                    })
+                    this.messageFailbackMap.delete(key)
+                }
+            }
+        }, 1000)
+    }
+}
+
+// messageCenter在每个iframe内实例化一次
+const messageCenter = new MessageCenter();
+
+export default messageCenter;

+ 31 - 0
src/uilts/messageCenter/iframe/messageEnum.js

@@ -0,0 +1,31 @@
+/** 向父窗口发送的事件定义 */
+const SEND_MESSAGE_ENUM = {
+    IFREME_TAB_GROUP_SET_IFRAME_HEIGHT: 'IFREME_TAB_GROUP_SET_IFRAME_HEIGHT',
+    /** group tab 内的列表项点击 */
+    IFRAME_PAGE_JUMP: 'IFRAME_PAGE_JUMP',
+    IFREME_TAB_GROUP_CONTENT_GET_NAV_TOP: 'IFREME_TAB_GROUP_CONTENT_GET_NAV_TOP',
+    /** 获取content的localstorge数据 */
+    IFRAME_GET_EXTENSION_STORGE_DATA: 'IFRAME_GET_EXTENSION_STORGE_DATA',
+    // ---- 做任务 ----
+    IFRAME_DO_TASK_CREATE_TWEET: 'IFRAME_DO_TASK_CREATE_TWEET',
+    IFRAME_DO_TASK_LIKE: 'IFRAME_DO_TASK_LIKE',
+    IFRAME_DO_TASK_FOLLOWS: 'IFRAME_DO_TASK_FOLLOWS',
+    IFRAME_DO_TASK_RETWEET: 'IFRAME_DO_TASK_RETWEET',
+
+    // ---- 获取推文内容 ----
+    IFRAME_DOM_GET_TWEET_TEXT: 'IFRAME_DOM_GET_TWEET_TEXT',
+
+
+}
+
+/** 接收父窗口的事件定义 */
+const RECEIVE_MESSAGE_ENUM = {
+    /** 切换到group tab */
+    CONTENT_REFRESH_TAB_GROUP_LIST: 'CONTENT_REFRESH_TAB_GROUP_LIST',
+    /** group打开时,页面发生滚动 */
+    CONTENT_GROUP_LIST_SCROLL: 'CONTENT_GROUP_LIST_SCROLL',
+    CONTENT_SEND_GROUP_NAV_TOP: 'CONTENT_SEND_GROUP_NAV_TOP',
+    CONTENT_SYS_THEME_CHANGE: 'CONTENT_SYS_THEME_CHANGE'
+}
+
+export default { ...SEND_MESSAGE_ENUM, ...RECEIVE_MESSAGE_ENUM }

+ 0 - 50
src/uilts/messageCenter/index.js

@@ -1,50 +0,0 @@
-class MessageCenter {
-    constructor() {
-        this.iframeMap = new Map();
-        this.messageCallbackMap = new Map();
-        // this.listen()
-    }
-
-    findIframeById(id) {
-        let target = this.iframeMap.get(id);
-        if (!target) {
-            target = document.getElementById(id)
-            this.iframeMap.set('id', target)
-        }
-        return target
-    }
-
-    send(id, actionType, data) {
-        const target = this.findIframeById(id);
-        target && target.contentWindow.postMessage({
-            actionType,
-            data
-        }, '*')
-    }
-
-    // don't use
-    add(actionType, callback) {
-        let activeQuene = this.messageCallbackMap.get(actionType);
-        if (activeQuene?.length > 0) {
-            activeQuene.push(callback)
-        } else {
-            this.messageCallbackMap.set(actionType, [callback])
-        }
-    }
-    // don't use
-    listen() {
-        window.addEventListener('message', (e) => {
-            const { actionType, data } = e.data;
-            console.log('get message in content ...', actionType, data)
-            const quene = this.messageCallbackMap.get(actionType) || [];
-            while (quene.length > 0) {
-                let callback = quene.pop();
-                callback(data)
-            }
-        })
-    }
-}
-
-const messageCenter = new MessageCenter();
-
-export default messageCenter;

+ 0 - 39
src/uilts/messageCenter/messageContent.js

@@ -1,39 +0,0 @@
-// class message  
-import messageCenter from '@/uilts/messageCenter';
-import MESSAGE_ENUM from "@/uilts/messageCenter/messageEnum";
-import { guid, iframeID } from '@/uilts/help.js'
-
-// content.createTweets('iframe') 
-
-// 做任务
-class doTask {
-    createTweet({ txt = '' }) {
-        return new Promise((res, rej) => {
-            messageCenter.send({
-                actionType: MESSAGE_ENUM.IFRAME_DO_TASK_CREATE_TWEET,
-                data: {
-                    iframeID,//用于告诉父窗口会传消息给哪个iframe 
-                    messageID: guid()// 唯一的ID,用于标记回调函数
-                },
-                info: {
-                    txt
-                },
-                callback: (data) => {
-                    res(data)
-                },
-                failback: (e) => {
-                    rej(e)
-                }
-            })
-        })
-        // console.log(window.parent.window.atest)
-        // window.postMessage({actionType: 'iframe_test', data: key})
-    }
-}
-
-
-export default {
-    doTask() {
-        return new doTask()
-    }
-}

+ 12 - 0
src/view/iframe/treasure-hunt/index.vue

@@ -22,6 +22,7 @@ import { getChromeStorage, sendCurrentTabMessage } from '@/uilts/chromeExtension
 import VToast from '@/view/iframe/treasure-hunt/components/toast.vue'
 import OpenBox from '@/view/iframe/treasure-hunt/components/open-box.vue'
 import Report from "@/log-center/log"
+import denet from '@/denet'
 
 let state = reactive({
     loading_redbag: true,
@@ -63,7 +64,18 @@ onMounted(() => {
 
     state.init();
     onRuntimeMsg();
+    // doLike()
 })
+// denet
+// chrome
+
+async function doLike() {
+    let task = await denet.content.doTask.like({ tweetId: '1564877034756534272' })
+    console.log('task', task)
+    if (tgas) {
+
+    }
+}
 
 state.checkIsLogin = () => {
     return new Promise((resolve) => {