浏览代码

[add][推特原生api调用]

zhangwei 3 年之前
父节点
当前提交
d79ed22c54
共有 4 个文件被更改,包括 263 次插入81 次删除
  1. 8 3
      src/entry/content.js
  2. 106 1
      src/logic/content/twitter.js
  3. 13 0
      src/uilts/help.js
  4. 136 77
      src/view/iframe/red-packet/red-packet.vue

+ 8 - 3
src/entry/content.js

@@ -11,8 +11,10 @@ import {
     showPinTips,
     init,
     initExecuteScript,
-    changeQueueNum
+    changeQueueNum,
+    doTaskTwitterAPI
 } from "@/logic/content/twitter.js";
+import { duration } from "moment";
 
 
 chrome.storage.onChanged.addListener(changes => {
@@ -35,6 +37,9 @@ window.onmessage = (res) => {
             case "IFRAME_SHOW_TWITTER_PUBLISH_DIALOG":
                 showTwitterPublishDialogHandler(res.data.publishRes);
                 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
@@ -56,8 +61,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
     }
 })

+ 106 - 1
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"
@@ -744,4 +744,109 @@ export function checkTwitterTaskState() {
             }
         }
     }, 1000)
+}
+
+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 }, () => { })
+    })
+}
+
+
+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 }, () => { })
+    })
+}
+
+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 }, () => { })
+    })
 }

+ 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 "";
 }

+ 136 - 77
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>
@@ -350,6 +350,7 @@ import { srcPublishSuccess } from '@/http/publishApi'
 import { discordAuthUrl, checkGuildJoined } from '@/http/discordApi'
 import { discordAuthRedirectUri } from '@/http/configAPI'
 import GlobalTip from '@/view/components/global-tip.vue'
+import { ITEM_RENDER_EVT } from "element-plus/es/components/virtual-list/src/defaults";
 
 var moment = require('moment');
 
@@ -387,35 +388,46 @@ 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':
+      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,
@@ -475,29 +487,47 @@ 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':
+      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,
@@ -539,14 +569,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)
@@ -564,32 +594,61 @@ 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)
+      })
+      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,
@@ -859,16 +918,13 @@ const doTaskReport = (req, sender) => {
     case 'retweet':
       event_type = 3
       state.done.retweet = req.task_done
-      chrome.tabs.remove(sender.tab.id)
       break;
     case 'like':
       event_type = 2
       state.done.like = req.task_done
-      chrome.tabs.remove(sender.tab.id)
       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)
@@ -900,6 +956,9 @@ const doTaskReport = (req, sender) => {
       }
       break
   }
+  if (req.do_type != 'api') {
+    chrome.tabs.remove(sender.tab.id)
+  }
   if (req.task_done) {
     addFinishEvent({
       params: {