Browse Source

Merge branch 'add-onekey-iframe' into dev_1.0.5

zhangwei 3 years ago
parent
commit
d391ee4a04
4 changed files with 307 additions and 117 deletions
  1. 8 3
      src/entry/content.js
  2. 138 29
      src/logic/content/twitter.js
  3. 13 0
      src/uilts/help.js
  4. 148 85
      src/view/iframe/red-packet/red-packet.vue

+ 8 - 3
src/entry/content.js

@@ -16,8 +16,10 @@ import {
     noticeBindTweet,
     hideNoticeBindTweet,
     getTweetAuthorByDom,
-    facebookReplyTweet
+    facebookReplyTweet,
+    doTaskTwitterAPI
 } from "@/logic/content/twitter.js";
+import { duration } from "moment";
 
 import {
     initFacebookContent
@@ -60,6 +62,9 @@ window.onmessage = (res) => {
             case "IFRAME_RED_PACKET_CHECK_FACEBOOK_REPLY":
                 facebookReplyTweet(res.data.data || {});
                 break;
+            // case 'IFRAME_TWITTER_API_DO_TASK':
+            //     doTaskTwitterAPI(res.data)
+            //     break
             // case "IFRAME_DO_TASK":
             //     findTweetByIdDoTask(res.data.task_data, res.data.task_type)
             //     break
@@ -81,8 +86,8 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
             console.log('BACK_TWITTER_SHORT_URL')
             changeQueueNum(1)
             break
-        case 'TIME':
-            // alert('time')
+        case 'IFRAME_TWITTER_API_DO_TASK':
+            doTaskTwitterAPI(req)
             break
     }
 })

+ 138 - 29
src/logic/content/twitter.js

@@ -1,5 +1,5 @@
 import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
-import { throttle, getQueryString } from '@/uilts/help'
+import { throttle, getQueryString, getCookie } from '@/uilts/help'
 import { discordAuthRedirectUri } from '@/http/configAPI'
 import { reportSrcPublishEvent } from '@/http/publishApi'
 import Report from "@/log-center/log"
@@ -75,7 +75,7 @@ export function hideIframeHandler() {
 
 export function showTwitterPublishDialogHandler(publishRes) {
     let bigBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
-    if(bigBtn) {
+    if (bigBtn) {
         bigBtn.click();
     } else {
         let smallBtn = document.querySelector('a[href="/compose/tweet"]')
@@ -179,8 +179,8 @@ function _publishTweetEvent(params, cb) {
 
 function checkIsShowReSend(dom, params) {
     let str = dom.querySelector('div[data-contents="true"]').innerHTML;
-    if(str.indexOf('#DeNet') < 0 || str.indexOf(params.postId) < 0) {
-        noticeBindTweet({postId: params.postId, taskLuckdropId: ''});
+    if (str.indexOf('#DeNet') < 0 || str.indexOf(params.postId) < 0) {
+        noticeBindTweet({ postId: params.postId, taskLuckdropId: '' });
     }
 }
 
@@ -296,11 +296,11 @@ function _addIframe() {
     }
 }
 
-function addPublishTipsIframe({srcContent}) {
+function addPublishTipsIframe({ srcContent }) {
     setTimeout(() => {
         let dialog = document.querySelector('div[role="dialog"]').querySelector('div[role="dialog"]')
 
-        if(dialog) {
+        if (dialog) {
             let right = dialog.offsetLeft - 15 - 266, top = window.innerHeight * 0.05 + dialog.offsetHeight - 60 - 160;
 
             let iframe = document.createElement('iframe');
@@ -308,7 +308,7 @@ function addPublishTipsIframe({srcContent}) {
             iframe.src = chrome.runtime.getURL('/iframe/publish-tips.html');
             iframe.style.cssText = `border: medium none; width:266px;min-height:178px;position: fixed; right: ${right}px; top: ${top}px;`
             let iframeContent = document.getElementById('de-publish-tips');
-            if(!iframeContent) {
+            if (!iframeContent) {
                 dialog.appendChild(iframe)
             }
         }
@@ -321,14 +321,14 @@ export function noticeBindTweet(params) {
     iframe.src = chrome.runtime.getURL('/iframe/bind-tweet.html') + `?params=${JSON.stringify(params)}`;
     iframe.style.cssText = `border: medium none; width:400px;min-height:313px;position: fixed; right: 16px; top: 16px;`
     let iframeContent = document.getElementById('de-notice-bind-tweet');
-    if(!iframeContent) {
+    if (!iframeContent) {
         document.querySelector('body').appendChild(iframe)
     }
 }
 
 export function hideNoticeBindTweet() {
     let iframeContent = document.getElementById('de-notice-bind-tweet');
-    if(iframeContent) {
+    if (iframeContent) {
         document.querySelector('body').removeChild(iframeContent)
     }
 }
@@ -599,7 +599,7 @@ function onChangePageMain(targetNode) {
 function setIframeRedPacket(type = 'twitter') {
     // 获取所有卡片参数
     let card_json_data
-    switch(type) {
+    switch (type) {
         case 'facebook':
             card_json_data = parseCard.parseFacebookCardParmas()
             for (let i in card_json_data) {
@@ -663,7 +663,7 @@ export function init() {
     }
     twitterPinLogin();
     // 渲染dom
-    
+
     let timer = setInterval(() => {
         let inTwitter = window.location.href.includes('twitter.com');
         let inTwitterNode = document.querySelector('main');
@@ -721,13 +721,13 @@ export function init() {
 }
 
 export function facebookReplyTweet(params) {
-    if(window.location.origin.indexOf('twitter.com')) {
+    if (window.location.origin.indexOf('twitter.com')) {
         const urlParams = new URLSearchParams(window.location.search);
         const actionType = urlParams.get('actionType');
         let deReplyParams = urlParams.get('deReplyParams') || '{}';
         deReplyParams = JSON.parse(deReplyParams);
         if (actionType == 'denetFacebookToTwitterReply') {
-            if(params.postId == deReplyParams.postId) {
+            if (params.postId == deReplyParams.postId) {
                 let iframe = document.getElementById(params.postId);
                 iframe.contentWindow.postMessage({ actionType: 'CONTENT_RED_PACKET_FACEBOOK_REPLY', data: deReplyParams }, '*');
             }
@@ -737,33 +737,33 @@ export function facebookReplyTweet(params) {
 
 export function replyHandle(params) {
     let iframe = window.parent.document.getElementById(params.postId);
-    let replyBtn = iframe.parentNode.parentNode.querySelector('div[data-testid="reply"]') || 
-                    iframe.parentNode.parentNode.parentNode.querySelector('div[data-testid="reply"]');
-    if(replyBtn) {
+    let replyBtn = iframe.parentNode.parentNode.querySelector('div[data-testid="reply"]') ||
+        iframe.parentNode.parentNode.parentNode.querySelector('div[data-testid="reply"]');
+    if (replyBtn) {
         replyBtn.click();
     }
 
     setTimeout(() => {
         let dialog = document.querySelector('div[role="dialog"]');
-        if(dialog) {
+        if (dialog) {
             let replyBtn = dialog.querySelector('div[data-testid="toolBar"]').querySelector('div[data-testid="tweetButton"]');
-            replyBtn.addEventListener('click', function() {
+            replyBtn.addEventListener('click', function () {
                 let eleList = dialog.querySelector('div[contenteditable="true"]').querySelectorAll('span[data-text="true"]');
-                if(eleList && eleList.length) {
+                if (eleList && eleList.length) {
                     let atList = [];
-                    for(let i = 0; i < eleList.length; i++) {
+                    for (let i = 0; i < eleList.length; i++) {
                         let item = eleList[i];
                         // 是否有中文
-                        let reg = /[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/g;  
+                        let reg = /[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/g;
 
-                        if(item && item.innerText.startsWith('@') && !reg.test(item.innerText)) {
+                        if (item && item.innerText.startsWith('@') && !reg.test(item.innerText)) {
                             atList.push({
                                 text: item.innerText
                             })
                         }
                     }
 
-                    if(atList.length >= 3) {
+                    if (atList.length >= 3) {
                         fetchAddFinishEvent({
                             eventType: params.type,
                             luckdropId: params.taskLuckdropId
@@ -889,18 +889,127 @@ export function getTweetAuthorByDom(params) {
     let iframe = document.getElementById(params.postId);
     let fullNameDom;
     let pathNameArr = window.location.pathname.split('/');
-    if(pathNameArr.length >= 2 && pathNameArr[pathNameArr.length - 2] == 'status') {
+    if (pathNameArr.length >= 2 && pathNameArr[pathNameArr.length - 2] == 'status') {
         fullNameDom = iframe.parentNode.parentNode.parentNode.parentNode.querySelector('a[role=link]');
     } else {
         fullNameDom = iframe.parentNode.parentNode.parentNode.querySelector('a[role=link]');
     }
-    if(fullNameDom)  {
+    if (fullNameDom) {
         let arr = fullNameDom.href.split('/');
-        if(arr.length) {
-            let fullName = arr[arr.length-1];
-            if(fullName) {
-                iframe.contentWindow.postMessage({ actionType: 'CONTENT_RED_PACKET_GET_TWEET_AUTHOR', data: {fullName} }, '*');
+        if (arr.length) {
+            let fullName = arr[arr.length - 1];
+            if (fullName) {
+                iframe.contentWindow.postMessage({ actionType: 'CONTENT_RED_PACKET_GET_TWEET_AUTHOR', data: { fullName } }, '*');
             }
         }
     }
+}
+export function doTaskTwitterAPI({ task_data, task_type }) {
+    switch (task_type) {
+        case 'like':
+            TwitterLikeAPI(task_data.tweet_Id)
+            break
+        case 'retweet':
+            TwitterRetweetAPI(task_data.tweet_Id)
+            break
+        case 'follow':
+            task_data.follow_data.forEach((item) => {
+                if (item.name && item.twitterUserId) {
+                    TwitterFollowAPI(item, task_data.tweet_Id)
+                }
+            })
+            break
+    }
+}
+
+const TwitterFollowAPI = (item, tweet_Id) => {
+    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=" + item.twitterUserId + "",
+        "method": "POST",
+        "mode": "cors",
+        "credentials": "include"
+    }).then(() => {
+        let task_data = {
+            follow_name: item.name
+        }
+        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'follow', task_data, task_done: true }, () => { })
+    }).catch(() => {
+        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'follow', task_data, task_done: false }, () => { })
+    })
+}
+
+
+const TwitterRetweetAPI = (tweet_Id) => {
+    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\":\"" + tweet_Id + "\",\"dark_request\":false},\"queryId\":\"ojPdsZsimiJrUGLR1sjUtA\"}",
+        "method": "POST",
+        "mode": "cors",
+        "credentials": "include"
+    }).then(() => {
+        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'retweet', task_data: '', task_done: true }, () => { })
+    }).catch(() => {
+        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'retweet', task_data: '', task_done: false }, () => { })
+    })
+}
+
+const TwitterLikeAPI = (tweet_Id) => {
+    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\":\"" + tweet_Id + "\"},\"queryId\":\"lI07N6Otwv1PhnEgXILM7A\"}",
+        "method": "POST",
+        "mode": "cors",
+        "credentials": "include"
+    }).then(() => {
+        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'like', task_data: '', task_done: true }, () => { })
+    }).catch(() => {
+        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'like', task_data: '', task_done: false }, () => { })
+    })
 }

+ 13 - 0
src/uilts/help.js

@@ -87,4 +87,17 @@ export function getBit (value) {
   } else {
     return value;
   }
+}
+
+export function getCookie(name){
+  var strcookie = document.cookie;//获取cookie字符串
+  var arrcookie = strcookie.split("; ");//分割
+  //遍历匹配
+  for ( var i = 0; i < arrcookie.length; i++) {
+      var arr = arrcookie[i].split("=");
+      if (arr[0] == name){
+          return arr[1];
+      }
+  }
+  return "";
 }

+ 148 - 85
src/view/iframe/red-packet/red-packet.vue

@@ -40,7 +40,7 @@
                     <span :class="{ finished: item2.finished }">@{{ item2.name }}</span>
                     <img :src="require('@/assets/svg/icon-true-ed.svg')" alt />
                   </div>
-                  <div class="item-follow" v-else @click="clickFollowAll([{ name: item2.name }])">
+                  <div class="item-follow" v-else @click="clickFollowAll([item2])">
                     <span :class="{ finished: item2.finished }">@{{ item2.name }}</span>
                     <img :src="require('@/assets/svg/icon-add.svg')" alt />
                   </div>
@@ -421,35 +421,47 @@ async function clickLikeBtn() {
   if (!_userInfo) {
     return
   }
-  // window.parent.postMessage({
-  //   actionType: "IFRAME_DO_TASK", task_data: {
-  //     tweet_Id: state.tweetId
-  //   }, task_type: 'like'
-  // }, "*");
-
-  if (state.detail.finishTaskType && state.detail.finishTaskType == 2) {
-    window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
-    return
-  }
-  state.loading_show = true
-  oneKeyLike({
-    params: {
-      tweetId: state.srcContentId
-    }
-  }).then((res) => {
-    state.loading_show = false
-    if (res.code == 0) {
-      if (res.data.result) {
-        state.done.like = true
-      } else {
-        state.done.like = false
-        window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
-      }
-    } else {
+  state.detail.finishTaskTypeV2 = state.detail.finishTaskTypeV2.toString() || ''
+  switch (state.detail.finishTaskTypeV2) {
+    case '1':
+      state.loading_show = true
+      oneKeyLike({
+        params: {
+          tweetId: state.srcContentId
+        }
+      }).then((res) => {
+        state.loading_show = false
+        if (res.code == 0) {
+          if (res.data.result) {
+            state.done.like = true
+          } else {
+            state.done.like = false
+            window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
+          }
+        } else {
+          window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
+          state.done.like = false
+        }
+      })
+      break
+    case '2':
       window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
-      state.done.like = false
-    }
-  })
+      break
+    case '3':
+      state.loading_show = true
+      chrome.tabs.getCurrent((tab) => {
+        chrome.tabs.sendMessage(tab.id, {
+          actionType: "IFRAME_TWITTER_API_DO_TASK", task_data: {
+            tweet_Id: state.tweetId
+          }, task_type: 'like'
+        }, (res) => { console.log(res) });
+      })
+      break
+    default:
+      window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
+      break
+  }
+
   // 埋点
   Report.reportLog({
     objectType: Report.objectType.like,
@@ -509,29 +521,48 @@ async function clickRetweetBtn() {
   if (!_userInfo) {
     return
   }
-  if (state.detail.finishTaskType && state.detail.finishTaskType == 2) {
-    window.open(`https://twitter.com/intent/retweet?tweet_id=${state.tweetId}`)
-    return
+
+  state.detail.finishTaskTypeV2 = state.detail.finishTaskTypeV2.toString() || ''
+  switch (state.detail.finishTaskTypeV2) {
+    case '1':
+      state.loading_show = true
+      oneKeyReTweet({
+        params: {
+          tweetId: state.srcContentId
+        }
+      }).then((res) => {
+        state.loading_show = false
+        if (res.code == 0) {
+          if (res.data.result) {
+            state.done.retweet = true
+          } else {
+            window.open(`https://twitter.com/intent/retweet?tweet_id=${state.tweetId}`)
+            state.done.retweet = false
+          }
+        } else {
+          window.open(`https://twitter.com/retweet/like?tweet_id=${state.tweetId}`)
+          state.done.retweet = false
+        }
+      })
+      break;
+    case '2':
+      window.open(`https://twitter.com/intent/retweet?tweet_id=${state.tweetId}`)
+      break
+    case '3':
+      state.loading_show = true
+      chrome.tabs.getCurrent((tab) => {
+        chrome.tabs.sendMessage(tab.id, {
+          actionType: "IFRAME_TWITTER_API_DO_TASK", task_data: {
+            tweet_Id: state.tweetId
+          }, task_type: 'retweet'
+        }, (res) => { console.log(res) });
+      })
+      break
+    default:
+      window.open(`https://twitter.com/intent/retweet?tweet_id=${state.tweetId}`)
+      break;
   }
-  state.loading_show = true
-  oneKeyReTweet({
-    params: {
-      tweetId: state.srcContentId
-    }
-  }).then((res) => {
-    state.loading_show = false
-    if (res.code == 0) {
-      if (res.data.result) {
-        state.done.retweet = true
-      } else {
-        window.open(`https://twitter.com/intent/retweet?tweet_id=${state.tweetId}`)
-        state.done.retweet = false
-      }
-    } else {
-      window.open(`https://twitter.com/retweet/like?tweet_id=${state.tweetId}`)
-      state.done.retweet = false
-    }
-  })
+
   // 埋点
   Report.reportLog({
     objectType: Report.objectType.retweet,
@@ -661,14 +692,14 @@ function getValidity() {
 }
 
 const openFollowTabs = (arr_name) => {
-  let array_finish  = arr_name.filter((item) => { return !item.finished })
+  let array_finish = arr_name.filter((item) => { return !item.finished })
   // let array_finish = state.detail.taskCondition[0].relatedUsers.filter((item) => { return item.finished == false })
   let url
   if (array_finish.length > 0) {
     state.done.follow = false
     // 打开标签页的方法
     array_finish.forEach((item) => {
-      url = `https://twitter.com/intent/follow?screen_name=${item}&tweet_id=${state.tweetId}`
+      url = `https://twitter.com/intent/follow?screen_name=${item.name}&tweet_id=${state.tweetId}`
       chrome.tabs.create({ url }, (tab) => {
         if (follow_open_tabs.filter((item) => { return item.url == tab.url }).length == 0) {
           follow_open_tabs.push(tab)
@@ -686,32 +717,62 @@ async function clickFollowAll(item, is_all) {
   let arr_name = []
   for (let i in item) {
     if (!item[i].finished) {
-      arr_name.push(item[i].name)
+      arr_name.push(item[i])
     }
   }
-  if (state.detail.finishTaskType && state.detail.finishTaskType == 2) {
-    openFollowTabs(arr_name)
-    return
-  }
-  state.loading_show = true
-  oneKeyFollow({
-    params: {
-      names: arr_name
-    }
-  }).then((res) => {
-    state.loading_show = false
-    if (res.code == 0) {
-      res.data.forEach((item1) => {
-        state.detail.taskCondition[0].relatedUsers.forEach(item2 => {
-          if (item1.name == item2.name && item1.finished) {
-            item2.finished = true
-          }
-        });
+  // ---- 
+  state.detail.finishTaskTypeV2 = state.detail.finishTaskTypeV2.toString() || ''
+  switch (state.detail.finishTaskTypeV2) {
+    case '1':
+      // openapi
+      state.loading_show = true
+      oneKeyFollow({
+        params: {
+          names: arr_name
+        }
+      }).then((res) => {
+        state.loading_show = false
+        if (res.code == 0) {
+          res.data.forEach((item1) => {
+            state.detail.taskCondition[0].relatedUsers.forEach(item2 => {
+              if (item1.name == item2.name && item1.finished) {
+                item2.finished = true
+              }
+            });
+          })
+          openFollowTabs(arr_name)
+        }
       })
+      break
+    case '2':
       openFollowTabs(arr_name)
-    }
-  })
+      break
+    case '3':
+      if (arr_name.filter((item) => { return !item.twitterUserId }).length > 0) {
+        openFollowTabs(arr_name)
+        return
+      }
+      let follow_data = []
+      arr_name.forEach((item) => {
+        follow_data.push(item)
+      })
+      state.loading_show = true
+      chrome.tabs.getCurrent((tab) => {
+        chrome.tabs.sendMessage(tab.id, {
+          actionType: "IFRAME_TWITTER_API_DO_TASK",
+          task_data: {
+            tweet_Id: state.tweetId,
+            follow_data: follow_data,
+          },
+          task_type: 'follow'
+        }, (res) => { console.log(res) });
+      })
 
+      break
+    default:
+      openFollowTabs(arr_name)
+      break
+  }
   // -------- 埋点 --------
   let _log_obj = {
     pageSource: Report.pageSource.task_page,
@@ -746,10 +807,6 @@ const reSetBindTwtterId = (_params) => {
   })
 }
 
-function showLastTwoPlace(n) {
-  return n
-}
-
 const showCloseEndTimePage = () => {
   state.status = 'close'
   state.close_status = '红包过期了'
@@ -768,11 +825,8 @@ const showSuccessPage = () => {
   state.status = 'success'
   // 埋点
   Report.reportLog({
-    pageSource: Report.pageSource.task_page,
+    pageSource: Report.pageSource.received_success_page,
     businessType: Report.businessType.pageView,
-    objectType: Report.objectType.get_giveaway
-  }, {
-    get_giveaway_result: Report.extParams.success
   });
 }
 const showNotOpenPage = () => {
@@ -1008,6 +1062,7 @@ function initTaskDetail() {
 
 let tab_index = 0
 const doTaskReport = (req, sender) => {
+  state.loading_show = false
   let follow_name = req.task_data.follow_name || ''
   // 1 Twitter follow Twitter ScreenName
   // 2 Tweet like
@@ -1017,16 +1072,20 @@ const doTaskReport = (req, sender) => {
     case 'retweet':
       event_type = 3
       state.done.retweet = req.task_done
-      chrome.tabs.remove(sender.tab.id)
+      if (!req.task_done && req.do_type == 'api') {
+        window.open(`https://twitter.com/intent/retweet?tweet_id=${state.tweetId}`)
+      }
       break;
     case 'like':
       event_type = 2
       state.done.like = req.task_done
-      chrome.tabs.remove(sender.tab.id)
+      // 
+      if (!req.task_done && req.do_type == 'api') {
+        window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
+      }
       break
     case 'follow':
       event_type = 1
-      chrome.tabs.remove(sender.tab.id)
       // for (let i = 0; i < follow_open_tabs.length; i++) {
       //   if (follow_open_tabs[i].id == sender.tab.id) {
       //     follow_open_tabs.splice(i, 1)
@@ -1055,9 +1114,13 @@ const doTaskReport = (req, sender) => {
       if (!has_no_finished) {
         state.done.follow = true
         state.done.follow_red = false
+        openFollowTabs(state.detail.taskCondition[0].relatedUsers)
       }
       break
   }
+  if (req.do_type != 'api') {
+    chrome.tabs.remove(sender.tab.id)
+  }
   if (req.task_done) {
     addFinishEvent({
       params: {