소스 검색

[edit] new fans 、PE file、website link image feature

wenliming 2 년 전
부모
커밋
0783edb1b0

+ 6 - 2
src/entry/content.js

@@ -37,7 +37,8 @@ import {
     refreshTabGroup,
     groupTipsSelectGroupTab,
     TwitterApiUserByScreenName,
-    showPublishDialog
+    showPublishDialog,
+    getTweetUserFollowStatus
 } from "@/logic/content/twitter.js";
 
 import { httpBackToContentCallBack } from '@/uilts/chromeExtension.js'
@@ -222,6 +223,9 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
         case 'Hide_ToolBox_By_Nft':
             toolBox.hideBuyNft(req)
             break;
+        case 'IFRAME_API_GET_TWEET_USER_FOLLOW_STATUS':
+            getTweetUserFollowStatus(req);
+            break;
     }
     sendResponse && sendResponse('ok');
-})
+})

+ 1 - 1
src/http/toolBoxApi.js

@@ -18,7 +18,7 @@ export function getAllPostEditorAppData(params) {
 
 export function screenshotWebsite(params) {
     return service({
-        url: `/post/editor/screenshotWebsite`,
+        url: `/post/editor/screenshotWebsiteV2`,
         method: 'post',
         data: params
     })

+ 5 - 3
src/logic/content/facebook.js

@@ -17,7 +17,7 @@ export function initFacebookContent() {
 
 /**
  * 注入分享页面逻辑
- * @returns 
+ * @returns
  */
 function injectShareCode() {
     const {href, pathname} = window.location;
@@ -63,9 +63,11 @@ function shareCallback() {
         let params = JSON.parse(urlParams.get('params'));
         if (params) {
             chrome.storage.local.remove("shareFacebookData");
-            if(params.bizType != 'TEASURE_INVITE') {
+            if(params.bizType == 'TEASURE_INVITE') {
+
+            } else {
               chrome.runtime.sendMessage({ actionType: "CONTENT_FACEBOOK_SHARE_SUCCESS", data: params })
             }
         }
     }
-}
+}

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

@@ -529,7 +529,7 @@ const setDialogPublishContent = throttle(function (content) {
         if (inputEle) {
             inputEle.dispatchEvent(event);
         }
-    }, 300)
+    }, 600)
 }, 600);
 
 /**
@@ -766,14 +766,14 @@ export function bindTwitterArtMethod() {
 
 import parseCard from './ParseCard'
 
-// 检测dom改变 
-// 获取短链接 
-// 查看本地是否有postid 
-// 如果有 修改dom 返回 
-// 如果没有 网络请求 
-// 获取postid 
-// 获取twitterid 
-// 检测当前所有dom 如果没有 
+// 检测dom改变
+// 获取短链接
+// 查看本地是否有postid
+// 如果有 修改dom 返回
+// 如果没有 网络请求
+// 获取postid
+// 获取twitterid
+// 检测当前所有dom 如果没有
 
 
 
@@ -1031,6 +1031,28 @@ export function init() {
     });
 }
 
+export const getTweetUserFollowStatus = (params) => {
+  let {tweetId, userList} = params.data;
+  let promiseList = [];
+  for(let i = 0; i < userList.length; i++) {
+    promiseList[i] = TwitterApiUserByScreenNameReq({screen_name: userList[i]['name']});
+  }
+
+  Promise.all(promiseList).then((res) => {
+    let list = [];
+    if(res && res.length) {
+      for(let i = 0; i < res.length; i++) {
+        let item = res[i];
+        if(item && item.data && item.data.data) {
+          list.push(item.data.data)
+        }
+      }
+    }
+
+    chrome.runtime.sendMessage({ actionType: 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES', data: list, tweetId }, () => { })
+  })
+}
+
 function onPageVisbile() {
     document.addEventListener('visibilitychange', function () {
         let isHidden = document.hidden;
@@ -1542,28 +1564,34 @@ const TwitterApiCreateTweet = ({ text, tweet_Id }) => {
     });
 }
 
-
-export const TwitterApiUserByScreenName = (params) => {
-    let { screen_name, tweetId = '', objectType = '' } = params;
-    axios.get(`https://twitter.com/i/api/graphql/mCbpQvZAw6zu_4PvuAUVVQ/UserByScreenName?variables=%7B%22screen_name%22%3A%22${screen_name}%22%2C%22withSafetyModeUserFields%22%3Atrue%2C%22withSuperFollowsUserFields%22%3Atrue%7D`, {
-        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) {
-        chrome.runtime.sendMessage({ actionType: "CONTENT_API_GET_TWEET_USER_INFO_RES", data: response.data.data || {}, tweetId, objectType }, () => { })
+const TwitterApiUserByScreenNameReq = (params) => {
+  let {screen_name} = params || {};
+  return axios.get(`https://twitter.com/i/api/graphql/mCbpQvZAw6zu_4PvuAUVVQ/UserByScreenName?variables=%7B%22screen_name%22%3A%22${screen_name}%22%2C%22withSafetyModeUserFields%22%3Atrue%2C%22withSuperFollowsUserFields%22%3Atrue%7D`, {
+      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"
+      },
+  })
+}
+
+
+export const TwitterApiUserByScreenName = (params, cb) => {
+    let { screen_name, tweetId = '', objectType = ''} = params;
+
+    TwitterApiUserByScreenNameReq({screen_name}).then(function (response) {
+      chrome.runtime.sendMessage({ actionType: "CONTENT_API_GET_TWEET_USER_INFO_RES", data: response.data.data || {}, tweetId, objectType }, () => { })
     }).catch(function (err) {
       chrome.runtime.sendMessage({ actionType: "CONTENT_API_GET_TWEET_USER_INFO_RES", data: {}, tweetId, objectType }, () => { })
     });
@@ -1985,14 +2013,14 @@ export const setPopupConfByPopupPage = () => {
 }
 
 
-/** 
- * 
- * Group Tab List Start 
+/**
+ *
+ * Group Tab List Start
  */
 
 /**
- * 
- * 创建 Group Tab 
+ *
+ * 创建 Group Tab
  */
 const createGroupTabNode = () => {
     let groupIcon = document.createElement('img');
@@ -2572,10 +2600,10 @@ const sysThemeChange = () => {
     }, 800)
 }
 
-/** 
- * 
- * Group Tab List End 
- * 
+/**
+ *
+ * Group Tab List End
+ *
  */
 
 

+ 1 - 1
src/view/iframe/publish/components/nft-setting.vue

@@ -5,7 +5,7 @@
                 <div class="sel"><a-radio value="public"></a-radio></div>
                 <div class="inp">
                     <img :src=" require('@/assets/svg/icon-post-edit-open.svg') " />
-                    <span>Publick</span>
+                    <span>Public</span>
                 </div>
             </label>
             <label class="item">

+ 15 - 6
src/view/iframe/publish/give-dialog.vue

@@ -490,6 +490,8 @@ import ComponentZoom from '@/view/components/component-zoom.vue'
 
 const config = {
     number: 'BigNumber',
+    precision: 64,            // Number of significant digits for BigNumbers
+    epsilon: 1e-60
 }
 const math = create(all, config);
 
@@ -1638,12 +1640,15 @@ const calcIptValue = (cb) => {
         };
     }
 
-    if (math.format(math.evaluate(`${baseFormData.amountValue} / ${baseFormData.totalCount}`)) < +currentCurrencyInfo.value.minAmount) {
+    let val1 = +math.format(math.divide(math.bignumber(+baseFormData.amountValue), math.bignumber(+baseFormData.totalCount)));
+    let val2 = +math.format(math.divide(math.bignumber(+baseFormData.amountValue), math.bignumber(+currentCurrencyInfo.value.minAmount)));
+
+    if (val1 < +currentCurrencyInfo.value.minAmount) {
         flag = false;
     }
     return {
         flag,
-        count: Math.floor(math.format(math.evaluate(`${baseFormData.amountValue} / ${currentCurrencyInfo.value.minAmount}`)))
+        count: Math.floor(val2)
     }
 };
 
@@ -1662,8 +1667,13 @@ const checkUsdMinNumber = (isInTemplate) => {
             // 当前token允许的usd最小金额为0 或单个红包最小金额为0,则无限制
             return forbiddenText;
         } else {
-            const isAmountForbidden = currentLuckDropConfig?.minTotalUsdAmount ? math.format(math.evaluate(amountValue * usdPrice)) < currentLuckDropConfig.minTotalUsdAmount : false;
-            const isAvgForbidden = currentLuckDropConfig?.minAvgUsdAmount ? math.format(math.evaluate(amountValue / totalCount * usdPrice)) < currentLuckDropConfig.minAvgUsdAmount : false;
+            let val1 = 0;
+            if(currentLuckDropConfig?.minAvgUsdAmount) {
+              val1 = +math.format(math.multiply(math.bignumber(+totalCount), math.bignumber(usdPrice)));
+            }
+
+            const isAmountForbidden = currentLuckDropConfig?.minTotalUsdAmount ? +math.format(math.multiply(math.bignumber(+amountValue), math.bignumber(usdPrice))) < currentLuckDropConfig.minTotalUsdAmount : false;
+            const isAvgForbidden = currentLuckDropConfig?.minAvgUsdAmount ? +math.format(math.divide(math.bignumber(+amountValue), math.bignumber(val1))) < currentLuckDropConfig.minAvgUsdAmount : false;
             forbiddenText = isAmountForbidden && isAvgForbidden ?
                             `The prize pool must be above ${isInTemplate ? ('<span class="font-color-1D9BF0">$' + currentLuckDropConfig.minTotalUsdAmount + '</span>') : ('$' + currentLuckDropConfig.minTotalUsdAmount)}
                             or the average prize must be above
@@ -1689,8 +1699,7 @@ const checkTreasureAmountRange = (isInTemplate) => {
             let txt =  `The prize pool must be above ${isInTemplate ? ('<span class="font-color-1D9BF0">$' + currentLuckDropConfig.minTotalUsdAmount + '</span>') : ('$' + currentLuckDropConfig.minTotalUsdAmount)}
                             and the average prize must be above
                             ${isInTemplate ? ('<span class="font-color-1D9BF0">$' + currentLuckDropConfig.minAvgUsdAmount +' per person.</span>' ): ('$' + currentLuckDropConfig.minAvgUsdAmount + ' per person.') }`
-
-            const isAmountForbidden = currentLuckDropConfig?.minTotalUsdAmount ? +math.format(math.evaluate(baseFormData.amountValue * usdPrice)) < currentLuckDropConfig?.minTotalUsdAmount : false;
+            const isAmountForbidden = currentLuckDropConfig?.minTotalUsdAmount ? +math.format(math.multiply(math.bignumber(+baseFormData.amountValue), math.bignumber(usdPrice))) < currentLuckDropConfig?.minTotalUsdAmount : false;
 
             const isAvgForbidden = treasureFormData.fansUnitAmount !== '' && currentLuckDropConfig?.minAvgUsdAmount ? treasureFormData.fansUnitAmount < minAmount || treasureFormData.fansUnitAmount < currentLuckDropConfig?.minAvgUsdAmount : false;
 

+ 2 - 3
src/view/iframe/publish/tool-box/child/editor.vue

@@ -51,7 +51,6 @@
 
 <script setup>
 import { ref, defineProps, defineEmits, onMounted } from "vue";
-import axios from 'axios';
 import Report from "@/log-center/log"
 import { message } from "ant-design-vue";
 import { convertUrl, getAllPostEditorAppData, checkInputUrlInBlacklist } from "@/http/toolBoxApi";
@@ -78,7 +77,6 @@ let appList = ref();
 const emits = defineEmits(["changeShowCom"]);
 
 const searchHandler = async (_params) => {
-  let siteTitle = '', favicon = '';
   let timer = null;
 
   // report
@@ -223,10 +221,11 @@ const createGuideWindow = (params, isUpdate = false) => {
   openWindowList = [];
   selectAppGuideData = {};
 
-  let windowWith = window.screen.width - 500;
+  let windowWith =  window.screen.width > 800 ? window.screen.width - 500 : 500;
   let guideUrl = chrome.runtime.getURL('/iframe/tool-box-guide.html');
 
   setChromeStorage({ selectGuideApp : JSON.stringify(params)}, async () => {
+    console.log(windowWith, 'window', window)
     let window1 = await chrome.windows.create({
       width: windowWith,
       type: 'normal',

+ 44 - 10
src/view/iframe/publish/tool-box/child/preview.vue

@@ -49,9 +49,7 @@
                                     {{ previewData.currentApp.linkTitle }}
                                 </template>
                                 <template v-else>
-                                    {{ previewData.currentApp.defaultTit ? defaultLinkTitle :
-                                            previewData.currentApp.name
-                                    }}
+                                    {{ resourceInfo.title }}
                                 </template>
                             </div>
                         </div>
@@ -127,22 +125,52 @@ const props = defineProps({
     hasNft: {
         type: Boolean,
         default: false
+    },
+    resourceInfo: {
+        type: Object,
+        default: () => {
+          return {}
+        }
     }
 })
 
 watch(() => props.screenshotWebsiteData,
     (newVal) => {
         let { appId } = props.previewData;
-        if (loadingHide && (!appId || appId && !props.previewData.linkImagePath) && (newVal.url || newVal.status)) {
-            loadingHide();
-            loadingHide = null;
-            submitPublish();
+        if (loadingHide && (!appId || appId && !props.previewData.linkImagePath) && newVal.status) {
+                console.log(props.resourceInfo, 'resourceInfo')
+            if(appId) {
+              loadingHide();
+              loadingHide = null;
+              submitPublish();
+            } else {
+              if(props.resourceInfo.isSet) {
+                loadingHide();
+                loadingHide = null;
+                submitPublish();
+              }
+            }
         }
     },
     {
         deep: true
     })
 
+watch(() => props.resourceInfo,
+    (newVal) => {
+      console.log(newVal, 'resourceInfo')
+      let { appId } = props.previewData;
+      if (!appId && loadingHide && newVal.isSet && props.screenshotWebsiteData.status) {
+        loadingHide();
+        loadingHide = null;
+        submitPublish();
+      }
+    },
+    {
+        deep: true
+    })
+
+
 watch(() => props.showCom,
     (newVal) => {
         if (newVal == 'EDITOR' && loadingHide) {
@@ -210,11 +238,16 @@ const publishHandler = () => {
     if (loadingHide) {
         return;
     }
-    if ((!appId || appId && !props.previewData.linkImagePath) && (!props.screenshotWebsiteData.url && !props.screenshotWebsiteData.status)) {
+    if ((!appId || appId && !props.previewData.linkImagePath) && !props.screenshotWebsiteData.status) {
         loadingHide = message.loading('loading...', 0);
         return;
     }
 
+    if (!appId && !props.resourceInfo.isSet) {
+      loadingHide = message.loading('loading...', 0);
+      return;
+    }
+
     submitPublish();
 }
 
@@ -227,14 +260,15 @@ const submitPublish = () => {
 
     setHistoryData(currentApp);
 
-    let linkTitle = currentApp.name ? currentApp.name : currentApp.defaultTit;
+    let linkTitle = props.resourceInfo.title;
 
     let postBizData = {
         convertUrl,
         originUrl,
         appId,
         linkTitle: !appId ? linkTitle : '',
-        linkImagePath: props.screenshotWebsiteData.url
+        linkImagePath: props.screenshotWebsiteData.url,
+        viewBgImagePath: props.screenshotWebsiteData.viewBgImagePath
     };
     if (props.certNftProjectId !== '') {
         postBizData['certNftProjectId'] = props.certNftProjectId;

+ 35 - 21
src/view/iframe/publish/tool-box/index.vue

@@ -8,6 +8,7 @@
             :defaultLinkTitle="pageData.defaultLinkTitle"
             :certNftProjectId="certNftProjectId"
             :hasNft="hasNft"
+            :resourceInfo="resourceInfo"
             @publishFinish="publishFinish">
             <nft-setting ref="nftSettingDom" @change="changeSetting"></nft-setting>
         </preview>
@@ -16,7 +17,7 @@
 
 <script setup>
 import { ref, reactive, watch, defineProps, defineEmits } from "vue";
-
+import axios from 'axios';
 import { screenshotWebsite } from "@/http/toolBoxApi";
 import editor from '@/view/iframe/publish/tool-box/child/editor.vue'
 import preview from '@/view/iframe/publish/tool-box/child/preview.vue'
@@ -71,6 +72,7 @@ let certNftProjectId = ref('')
 
 let screenshotWebsiteData = reactive({
     url: '',
+    viewBgImagePath: '',
     status: '',
 });
 
@@ -85,7 +87,7 @@ const defaultResourceInfo = {
   hasTitle: false,
 };
 
-let resourceInfo = reactive(defaultResourceInfo);
+let resourceInfo = ref(defaultResourceInfo);
 
 const changeShowCom = (params) => {
     showCom.value = 'PREVIEW';
@@ -96,7 +98,11 @@ const changeShowCom = (params) => {
     previewData.currentApp = params.currentApp || {};
 
     screenshotWebsiteData.url = '';
+    screenshotWebsiteData.viewBgImagePath = '';
     screenshotWebsiteData.status = '';
+
+    resourceInfo.value = defaultResourceInfo;
+
     if(!params.appId || params.appId && !params.linkImagePath) {
         screenshotWebsite({
             params: {
@@ -106,8 +112,9 @@ const changeShowCom = (params) => {
             if(showCom.value != 'PREVIEW') {
                 return;
             }
-            if(res.code == 0) {
-                screenshotWebsiteData.url = res.data;
+            if(res.code == 0 && res.data) {
+                screenshotWebsiteData.url = res.data.linkImagePath;
+                screenshotWebsiteData.viewBgImagePath = res.data.viewBgImagePath;
                 screenshotWebsiteData.status = 1;
             } else {
                 screenshotWebsiteData.status = 1;
@@ -120,31 +127,38 @@ const changeShowCom = (params) => {
         })
     }
 
+    if(!params.appId) {
+      getResourceInfo({url:params.convertUrl});
+    }
+
     emits("onPageChange", {page: showCom.value});
 }
 
 const getResourceInfo = ({url}) => {
+  console.log(url)
   axios.get(url).then(res => {
 
-  }).catch(err => {
+    if(res) {
+      resourceInfo.value.isSet = true;
+      resourceInfo.value.contentType = res.headers['content-type'];
+      resourceInfo.value.statusCode = res.request.status;
+      resourceInfo.value.hasTitle = resourceInfo.value.contentType.indexOf('text/html') > -1 ? true : false;
+      console.log(res, resourceInfo.value, 'resourceInfo')
+
+      let siteTitle = '';
+      if(resourceInfo.value.hasTitle) {
+        siteTitle = getTitleByHtmlStr(res.data);
+        if (!siteTitle) {
+          let urlObj = new URL(siteUrl.value);
+          siteTitle = urlObj.hostname;
+        }
+      }
+      resourceInfo.value.title = siteTitle;
+    }
 
+  }).catch(err => {
+    resourceInfo.value.isSet = true;
   })
-
-  // if (siteRes) {
-  //   if (siteRes.headers['content-type'].indexOf('text/html') < 0 || siteRes.request.status > 403) {
-  //     loadingHide();
-  //     message.error('Page loading failed');
-  //     return;
-  //   }
-  //   if (siteRes.data) {
-  //     siteTitle = getTitleByHtmlStr(siteRes.data);
-  //     currentApp.name = siteTitle;
-  //     if (!siteTitle) {
-  //       siteTitle = urlObj.hostname;
-  //       currentApp.defaultTit = siteTitle;
-  //     }
-  //   }
-  // }
 }
 
 const getTitleByHtmlStr = (str = '') => {

+ 3 - 2
src/view/iframe/red-packet/luck-draw.vue

@@ -1076,7 +1076,8 @@ const reportBindTweetSuccess = (params) => {
     sendChromeTabMessage({
         actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
         data: {
-            screen_name: srcUserId
+            screen_name: srcUserId,
+            tweetId: state.tweetId
         }
     })
 
@@ -2013,7 +2014,7 @@ function onRuntimeMsg() {
                 break;
             case 'CONTENT_API_GET_TWEET_USER_INFO_RES':
                 let { user } = req.data || {};
-                if (user && user.result && user.result.legacy) {
+                if (req.tweetId == state.tweetId && user && user.result && user.result.legacy) {
                     let legacy = user.result.legacy;
                     reportParams.twitterFans = legacy ? legacy.followers_count : 0;
 

+ 3 - 2
src/view/iframe/red-packet/red-packet.vue

@@ -957,7 +957,8 @@ const reportBindTweetSuccess = (params) => {
   sendChromeTabMessage({
     actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
     data: {
-      screen_name: srcUserId
+      screen_name: srcUserId,
+      tweetId: state.tweetId
     }
   })
 
@@ -1806,7 +1807,7 @@ function onRuntimeMsg() {
         break;
       case 'CONTENT_API_GET_TWEET_USER_INFO_RES':
         let { user } = req.data || {};
-        if (user && user.result && user.result.legacy) {
+        if (req.tweetId == state.tweetId && user && user.result && user.result.legacy) {
           let legacy = user.result.legacy;
           reportParams.twitterFans = legacy ? legacy.followers_count : 0;
 

+ 50 - 14
src/view/iframe/treasure-hunt/cover.vue

@@ -80,9 +80,11 @@ const toStart = (req) => {
     treasureStart({
         params: {
             postId: state.postId || '',
-            inviteCode: state.invite_code || ''
+            inviteCode: state.invite_code || '',
+            frontFollowRelJSON: JSON.stringify(state.usersFollowStatusList)
         }
     }).then((res) => {
+        state.usersFollowStatusList = [];
         if (res.code == 0) {
             state.page = '开奖页'
             state.start_task = res.data
@@ -149,6 +151,36 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
                   });
                 };
             break;
+        case 'CONTENT_GET_TWEET_USER_FOLLOW_STATUS_RES':
+            if(state.tweetId == req.tweetId) {
+              let list = [];
+              let userInfoList = req.data;
+              for(let i = 0; i < userInfoList.length; i++) {
+                let item = userInfoList[i];
+                if(item.user && item.user.result && item.user.result.legacy) {
+                  let legacy = item.user.result.legacy;
+                  list.push({
+                    name: legacy.screen_name,
+                    followed: legacy.followed_by
+                  })
+                }
+              }
+
+              state.usersFollowStatusList = list;
+              // 一键三连
+              chrome.tabs.getCurrent((tab) => {
+                  chrome.tabs.sendMessage(tab.id, {
+                      actionType: "IFRAME_TWITTER_API_DO_TASK",
+                      task_data: {
+                          tweet_Id: state.tweetId,
+                          tweet_text: state.rePostTweetContent
+                      },
+                      task_type: 'tasks',
+                      tasks: state.tasks,
+                  });
+              })
+            }
+            break;
     }
 })
 
@@ -221,24 +253,28 @@ const startBtn = () => {
                 url: pageUrl,
             })
 
-            let text = res.data.rePostTweetContent
-            // 一键三连
-            chrome.tabs.getCurrent((tab) => {
-                chrome.tabs.sendMessage(tab.id, {
-                    actionType: "IFRAME_TWITTER_API_DO_TASK",
-                    task_data: {
-                        tweet_Id: state.tweetId,
-                        tweet_text: text
-                    },
-                    task_type: 'tasks',
-                    tasks: state.tasks,
-                });
-            })
+            state.rePostTweetContent = res.data.rePostTweetContent;
+            getUsersFollowStatus();
         } else {
             state.init()
         }
     })
 }
+
+const getUsersFollowStatus = () => {
+  let userList = state.follows;
+
+  if(userList && userList.length) {
+    sendChromeTabMessage({
+      actionType: "IFRAME_API_GET_TWEET_USER_FOLLOW_STATUS",
+      data: {
+          userList: userList,
+          tweetId: state.tweetId,
+      }
+    })
+  }
+}
+
 </script>
 <style lang="scss" scoped>
 .cover {