소스 검색

[edit] report

wenliming 2 년 전
부모
커밋
e0657b54c5

+ 6 - 2
src/entry/content.js

@@ -36,7 +36,8 @@ import {
     selectGroupTab,
     setGroupInfo,
     refreshTabGroup,
-    groupTipsSelectGroupTab
+    groupTipsSelectGroupTab,
+    TwitterApiUserByScreenName
 } from "@/logic/content/twitter.js";
 
 import { 
@@ -180,7 +181,10 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
             break
         case 'BACK_NFT_PUBLISH_DONE':
             refreshTabGroup()
-            break
+            break 
+        case 'IFRAME_API_GET_TWEET_USER_INFO_REQ':
+            TwitterApiUserByScreenName(req.data)
+            break;
     }
 })
 

+ 4 - 0
src/log-center/logEnum.js

@@ -32,6 +32,10 @@ export const objectType = {
     follow: 'follow',
     retweet: 'retweet',
     like: 'like',
+    comment_and_tag: 'comment-and-tag',
+    join_discord: 'discord',
+    share_facebook: 'share-facebook',
+
     // 查看已领取红包列表
     received_list: 'received-list',
     // 点击检测任务

+ 12 - 2
src/log-center/logger.js

@@ -1,13 +1,22 @@
 import {logApi} from '@/http/logApi'
 import { getBrowser } from '@/uilts/help.js';
 import { logType } from './logEnum.js';
+import {getChromeStorage} from '@/uilts/chromeExtension'
 
-
+let userInfo = null;
+let mid = '';
 /**
  * @eventData 以键值对存储,会在最终上报里解开的参数
  * @extParams 最终上报到阿里云以json字符串存储的参数,如果extparams传入的不是obj会转换成obj
  */
-export function reportLog(eventData = {}, extParams = {}) {
+export async function reportLog(eventData = {}, extParams = {}) {
+    if(!userInfo) {
+        userInfo = await getChromeStorage('userInfo') || null;
+    }
+    if (!mid) {
+        mid = await getChromeStorage('mid') || '';
+    }
+
     if (chrome && chrome.tabs) {
         chrome.tabs.getCurrent((tab) => {
             let isMobile = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
@@ -18,6 +27,7 @@ export function reportLog(eventData = {}, extParams = {}) {
                 url,
                 platform,
                 browser,
+                twitterId: userInfo.nickName,
                 ...eventData,
             }
             paramsPretreatmentAndRequest(logType.denet, extData, extParams)

+ 25 - 1
src/logic/content/twitter.js

@@ -8,6 +8,7 @@ import { showNFTGroupIcon, hideNFTGroupList, checkUserJoinGroup, elemAddEventLis
 import { getTwitterNftGroupInfo } from '@/http/nft'
 import { jumpTwitterDetailByAlert, showEditTweet } from '@/logic/content/help/twitter.js'
 import { clearPostContent } from '@/logic/content/nft.js'
+import axios from 'axios';
 
 let dom = {};
 
@@ -1312,7 +1313,30 @@ const TwitterLikeAPI = (tweet_Id) => {
     })
 }
 
-
+export const TwitterApiUserByScreenName = (params) => {
+    let {screen_name} = 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 || {}  }, () => { })
+    }).catch(function (response){
+    });
+}
 
 let click_old_time = new Date().getTime()
 export const showTwitterPost = (data) => {

+ 1 - 0
src/view/iframe/publish/give-dialog.vue

@@ -2257,6 +2257,7 @@ onMounted(() => {
             .price {
                 font-size: 14px;
                 font-weight: bold;
+                word-break: break-all;
             }
         }
         .refresh {

+ 137 - 9
src/view/iframe/red-packet/luck-draw.vue

@@ -415,12 +415,13 @@ import { getQueryString, guid, getBit } from '@/uilts/help.js'
 import { message } from 'ant-design-vue';
 import FontAmount from '@/view/components/font-amount.vue'
 import GetMore from '@/view/iframe/publish/components/get-more.vue'
-import { setChromeStorage, getChromeStorage } from '@/uilts/chromeExtension.js'
+import { setChromeStorage, getChromeStorage, sendChromeTabMessage } from '@/uilts/chromeExtension.js'
 import Report from "@/log-center/log"
 import { srcPublishSuccess } from '@/http/publishApi'
 import { discordAuthUrl, checkGuildJoined } from '@/http/discordApi'
 import { discordAuthRedirectUri, faceShareRedirectUrl } from '@/http/configAPI'
 import { getFrontConfig } from "@/http/account";
+import { getInviteGuildInfo } from "@/http/discordApi";
 import GlobalTip from '@/view/components/global-tip.vue'
 var moment = require('moment');
 
@@ -433,6 +434,16 @@ let facebookAppConfig = {
     faceShareRedirectUrl
 };
 
+let reportParams = {
+  discordFans: '', 
+  twitterFans: '',
+  done: {
+  },
+  hasReport: false,
+}
+
+let discordTaskDetail = null;
+
 let state = reactive({
     status: '',
     userId: '',
@@ -649,6 +660,15 @@ function onTweetReplyClick(params) {
     }
 
     window.parent.postMessage({ actionType: "IFRAME_RED_PACKET_ON_TWEET_REPLY_CLICK", data: replyData }, "*");
+
+    Report.reportLog({
+        objectType: Report.objectType.comment_and_tag,
+        pageSource: Report.pageSource.task_page,
+        businessType: Report.businessType.buttonClick,
+        postId: state.postId,
+        srcContentId: state.tweetId,
+        senderId: state.userId,
+    });
 }
 
 async function clickReply(params) {
@@ -699,6 +719,16 @@ async function clickRepostFacebook(params) {
 
     let shareUrl = feacebookShareUrl(shareUrlparams);
     openShareFacebookWindow({ url: shareUrl });
+
+    // 埋点
+    Report.reportLog({
+        objectType: Report.objectType.share_facebook,
+        pageSource: Report.pageSource.task_page,
+        businessType: Report.businessType.buttonClick,
+        postId: state.postId,
+        srcContentId: state.tweetId,
+        senderId: state.userId,
+    });
 }
 
 /**
@@ -879,6 +909,10 @@ async function clickFollowAll(item, is_all) {
 
 // 重新绑定
 const reSetBindTwtterId = (_params) => {
+    let postBizData = JSON.parse(_params.postBizData);
+    let {taskCondition} = postBizData;
+    let discordTask = JSON.parse(taskCondition).find(item => item.type == 7);
+
     getChromeStorage('userInfo', (_userInfo) => {
         if (_userInfo && _userInfo.uid == _params.uid) {
             srcPublishSuccess({
@@ -888,16 +922,66 @@ const reSetBindTwtterId = (_params) => {
                 }
             }).then((res) => {
                 if (res.code == 0 || res.code == 3003) {
-                    Report.reportLog({
-                        objectType: Report.objectType.tweetPostBinded
-                    });
                     init({ from: 'reSetBindTwtterId' })
+                    reportBindTweetSuccess({discordTask, ..._params});
                 }
             })
         }
     })
 }
 
+const reportBindTweetSuccess = (params) => {
+    let {discordTask, srcUserId} = params || {};
+    discordTaskDetail = discordTask;
+    sendChromeTabMessage({
+        actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
+        data: {
+            screen_name: srcUserId
+        }
+    })
+
+    if(discordTask) {
+        getDiscordInfo({inviteUrl: JSON.parse(discordTask.bizData).inviteUrl}, (res) => {
+            if(res.inviteCode == res.code) {
+                reportParams.discordFans = res.approximate_member_count;
+
+                if(reportParams.twitterFans !== '' && !reportParams.hasReport) { 
+                reportParams.hasReport = true;
+                Report.reportLog({
+                    objectType: Report.objectType.tweetPostBinded,
+                    twitterFans: reportParams.twitterFans,
+                    discordFans: reportParams.discordFans
+                });
+                }
+            }
+        })
+    }
+}
+
+const getDiscordInfo = (params, cb) => {
+    let {inviteUrl} = params;
+    if(!inviteUrl) return;
+
+    let inviteCode = '';
+    let arr = inviteUrl.split('/');
+    if(arr.length > 0) {
+        inviteCode = arr[arr.length - 1];
+    }
+    if(!inviteCode) {
+        return;
+    }
+
+    getInviteGuildInfo({
+        inviteCode
+    }).then(res => {
+        cb && cb({
+        ...res,
+        inviteCode
+        })
+    }).catch((err) => {
+    });
+}
+
 const showCloseEndTimePage = () => {
     state.status = 'close'
     state.close_status = '已经过期了'
@@ -925,6 +1009,8 @@ const showSuccessPage = () => {
         postId: state.postId,
         srcContentId: state.tweetId,
         senderId: state.userId,
+        isOldTwitterFans: reportParams.done.follow,
+        isOldDiscordFans: reportParams.done.join_discord
     });
 }
 const showNotOpenPage = () => {
@@ -939,10 +1025,14 @@ const showNotOpenPage = () => {
 }
 const showOpenedPage = () => {
     state.status = 'opened'
-
-    initTaskDetail()
+    initTaskDetail(() => {
+        showOpenedPageReport()
+    })
 }
 const showOpenedPageReport = () => {
+    reportParams.done.follow = state.done.follow;
+    reportParams.done.join_discord = state.done.join_discord;
+
     // 埋点
     Report.reportLog({
         pageSource: Report.pageSource.task_page,
@@ -950,6 +1040,8 @@ const showOpenedPageReport = () => {
         postId: state.postId,
         srcContentId: state.tweetId,
         senderId: state.userId,
+        isOldTwitterFans: state.done.follow,
+        isOldDiscordFans: state.done.join_discord
     });
 }
 
@@ -1018,7 +1110,6 @@ const handleStatusPage = () => {
         if (state.detail.myReceived.taskFinishStatus == 0) {
             // 显示任务未完成页面
             showOpenedPage()
-            showOpenedPageReport()
             if (state.process_mode != 'production') {
                 getValidity()
             }
@@ -1087,7 +1178,6 @@ function setFrontConfig() {
 
 function init(initParams) {
     let { type } = initParams || {};
-    onRuntimeMsg();
     onPageVisbile();
     onWindowMessage();
     setFrontConfig();
@@ -1129,7 +1219,7 @@ function init(initParams) {
     })
 }
 
-function initTaskDetail() {
+function initTaskDetail(cb) {
     getChromeStorage('userInfo', (_userInfo) => {
         if (_userInfo && _userInfo.uid) {
             // 任务详情
@@ -1169,6 +1259,7 @@ function initTaskDetail() {
                 } else {
                     handleErrorCode(res)
                 }
+                cb && cb()
             })
         }
     })
@@ -1287,6 +1378,7 @@ onMounted(() => {
 
     getTweetAuthor()
     init()
+    onRuntimeMsg();
     // state.loading_show = true
     // state.status = 'success'
     // state.status = 'close'
@@ -1719,6 +1811,32 @@ function onRuntimeMsg() {
                     state.done.reply_red = false;
                 }
                 break;
+            case 'CONTENT_API_GET_TWEET_USER_INFO_RES':
+                let {user} = req.data || {};
+                if(user && user.result && user.result.legacy) {
+                    let legacy = user.result.legacy;
+                    reportParams.twitterFans = legacy.followers_count;
+
+                    if(!discordTaskDetail) {
+                        if(reportParams.hasReport) return;
+                        reportParams.hasReport = true;
+                        Report.reportLog({
+                            objectType: Report.objectType.tweetPostBinded,
+                            twitterFans: reportParams.twitterFans,
+                        });
+                    } else {
+                        if(reportParams.discordFans !== '') {
+                            if(reportParams.hasReport) return;
+                            reportParams.hasReport = true;
+                            Report.reportLog({
+                                objectType: Report.objectType.tweetPostBinded,
+                                twitterFans: reportParams.twitterFans,
+                                discordFans: reportParams.discordFans
+                            });
+                        }
+                    }
+                }
+                break;
         }
     })
 }
@@ -1774,6 +1892,16 @@ async function joinDiscord() {
     if (joinDiscordIng.value) {
         return;
     }
+    // 埋点
+    Report.reportLog({
+        objectType: Report.objectType.join_discord,
+        pageSource: Report.pageSource.task_page,
+        businessType: Report.businessType.buttonClick,
+        postId: state.postId,
+        srcContentId: state.tweetId,
+        senderId: state.userId,
+    });
+
     let url = getInviteUrl();
     if (url) {
         joinDiscordIng.value = true;

+ 136 - 9
src/view/iframe/red-packet/red-packet.vue

@@ -374,12 +374,13 @@ import { getQueryString, guid, getBit } from '@/uilts/help.js'
 import { message } from 'ant-design-vue';
 import FontAmount from '@/view/components/font-amount.vue'
 import GetMore from '@/view/iframe/publish/components/get-more.vue'
-import { setChromeStorage, getChromeStorage } from '@/uilts/chromeExtension.js'
+import { setChromeStorage, getChromeStorage, sendChromeTabMessage } from '@/uilts/chromeExtension.js'
 import Report from "@/log-center/log"
 import { srcPublishSuccess } from '@/http/publishApi'
 import { discordAuthUrl, checkGuildJoined } from '@/http/discordApi'
 import { discordAuthRedirectUri, faceShareRedirectUrl } from '@/http/configAPI'
 import { getFrontConfig } from "@/http/account";
+import { getInviteGuildInfo } from "@/http/discordApi";
 import GlobalTip from '@/view/components/global-tip.vue'
 
 var moment = require('moment');
@@ -393,6 +394,16 @@ let facebookAppConfig = {
   faceShareRedirectUrl
 };
 
+let reportParams = {
+  discordFans: '', 
+  twitterFans: '',
+  done: {
+  },
+  hasReport: false,
+}
+
+let discordTaskDetail = null;
+
 let state = reactive({
   status: '',
   userId: '',
@@ -626,6 +637,15 @@ async function clickReply(params) {
   } else {
     window.parent.postMessage({ actionType: "IFRAME_RED_PACKET_REPLY_CLICK", data: replyData }, "*");
   }
+  // 埋点
+  Report.reportLog({
+    objectType: Report.objectType.comment_and_tag,
+    pageSource: Report.pageSource.task_page,
+    businessType: Report.businessType.buttonClick,
+    postId: state.postId,
+    srcContentId: state.tweetId,
+    senderId: state.userId,
+  });
 }
 
 /**
@@ -657,6 +677,16 @@ async function clickRepostFacebook(params) {
 
   let shareUrl = feacebookShareUrl(shareUrlparams);
   openShareFacebookWindow({ url: shareUrl });
+
+  // 埋点
+  Report.reportLog({
+    objectType: Report.objectType.share_facebook,
+    pageSource: Report.pageSource.task_page,
+    businessType: Report.businessType.buttonClick,
+    postId: state.postId,
+    srcContentId: state.tweetId,
+    senderId: state.userId,
+  });
 }
 
 /**
@@ -837,6 +867,10 @@ async function clickFollowAll(item, is_all) {
 
 // 重新绑定
 const reSetBindTwtterId = (_params) => {
+  let postBizData = JSON.parse(_params.postBizData);
+  let {taskCondition} = postBizData;
+  let discordTask = JSON.parse(taskCondition).find(item => item.type == 7);
+
   getChromeStorage('userInfo', (_userInfo) => {
     if (_userInfo.uid == _params.uid) {
       srcPublishSuccess({
@@ -846,16 +880,64 @@ const reSetBindTwtterId = (_params) => {
         }
       }).then((res) => {
         if (res.code == 0 || res.code == 3003) {
-          Report.reportLog({
-            objectType: Report.objectType.tweetPostBinded
-          });
           init({ from: 'reSetBindTwtterId' })
+          reportBindTweetSuccess({discordTask, ..._params});
         }
       })
     }
   })
 }
 
+const reportBindTweetSuccess = (params) => {
+  let {discordTask, srcUserId} = params || {};
+  discordTaskDetail = discordTask;
+  sendChromeTabMessage({
+      actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
+      data: {
+        screen_name: srcUserId
+      }
+  })
+
+  if(discordTask) {
+    getDiscordInfo({inviteUrl: JSON.parse(discordTask.bizData).inviteUrl}, (res) => {
+      if(res.inviteCode == res.code) {
+        reportParams.discordFans = res.approximate_member_count;
+
+        if(reportParams.twitterFans !== '' && !reportParams.hasReport) { 
+          reportParams.hasReport = true;
+          Report.reportLog({
+            objectType: Report.objectType.tweetPostBinded,
+            twitterFans: reportParams.twitterFans,
+            discordFans: reportParams.discordFans
+          });
+        }
+      }
+    })
+  }
+}
+
+const getDiscordInfo = (params, cb) => {
+  let {inviteUrl} = params;
+  if(!inviteUrl) return;
+  let inviteCode = '';
+  let arr = inviteUrl.split('/');
+  if(arr.length > 0) {
+      inviteCode = arr[arr.length - 1];
+  }
+  if(!inviteCode) {
+      return;
+  }
+  getInviteGuildInfo({
+      inviteCode
+  }).then(res => {
+    cb && cb({
+      ...res,
+      inviteCode
+    })
+  }).catch((err) => {
+  });
+}
+
 const showCloseEndTimePage = () => {
   state.status = 'close'
   state.close_status = '红包过期了'
@@ -882,6 +964,8 @@ const showSuccessPage = () => {
     postId: state.postId,
     srcContentId: state.tweetId,
     senderId: state.userId,
+    isOldTwitterFans: reportParams.done.follow,
+    isOldDiscordFans: reportParams.done.join_discord
   });
 }
 const showNotOpenPage = () => {
@@ -896,10 +980,13 @@ const showNotOpenPage = () => {
 }
 const showOpenedPage = () => {
   state.status = 'opened'
-
-  initTaskDetail()
+  initTaskDetail(() => {
+    showOpenedPageReport()
+  })
 }
 const showOpenedPageReport = () => {
+  reportParams.done.follow = state.done.follow;
+  reportParams.done.join_discord = state.done.join_discord;
   // 埋点
   Report.reportLog({
     pageSource: Report.pageSource.task_page,
@@ -907,6 +994,8 @@ const showOpenedPageReport = () => {
     postId: state.postId,
     srcContentId: state.tweetId,
     senderId: state.userId,
+    isOldTwitterFans: state.done.follow,
+    isOldDiscordFans: state.done.join_discord
   });
 }
 
@@ -973,7 +1062,6 @@ const handleStatusPage = () => {
     if (state.detail.myReceived.taskFinishStatus == 0) {
       // 显示任务未完成页面
       showOpenedPage()
-      showOpenedPageReport()
       if (state.process_mode != 'production') {
         getValidity()
       }
@@ -1036,7 +1124,6 @@ function setFrontConfig() {
 
 function init(initParams) {
   let { type } = initParams || {};
-  onRuntimeMsg();
   onPageVisbile();
   onWindowMessage();
   setFrontConfig();
@@ -1078,7 +1165,7 @@ function init(initParams) {
   })
 }
 
-function initTaskDetail() {
+function initTaskDetail(cb) {
   getChromeStorage('userInfo', (_userInfo) => {
     if (_userInfo.uid) {
       // 任务详情
@@ -1118,6 +1205,7 @@ function initTaskDetail() {
         } else {
           handleErrorCode(res)
         }
+        cb && cb()
       })
     }
   })
@@ -1206,6 +1294,7 @@ onMounted(() => {
 
   getTweetAuthor();
   init()
+  onRuntimeMsg();
   // state.loading_show = true
   // state.status = 'opened'
   // state.close_status = '没有领到钱'
@@ -1638,6 +1727,33 @@ function onRuntimeMsg() {
           state.done.reply_red = false;
         }
         break;
+      case 'CONTENT_API_GET_TWEET_USER_INFO_RES':
+        let {user} = req.data || {};
+        if(user && user.result && user.result.legacy) {
+          let legacy = user.result.legacy;
+          reportParams.twitterFans = legacy.followers_count;
+
+          if(!discordTaskDetail) {
+            if(reportParams.hasReport) return;
+            reportParams.hasReport = true;
+            Report.reportLog({
+              objectType: Report.objectType.tweetPostBinded,
+              twitterFans: reportParams.twitterFans,
+            });
+          } else {
+            if(reportParams.discordFans !== '') {
+              if(reportParams.hasReport) return;
+              reportParams.hasReport = true;
+              Report.reportLog({
+                objectType: Report.objectType.tweetPostBinded,
+                twitterFans: reportParams.twitterFans,
+                discordFans: reportParams.discordFans
+              });
+            }
+          }
+
+        }
+        break;
     }
   })
 }
@@ -1693,6 +1809,17 @@ async function joinDiscord() {
   if (joinDiscordIng.value) {
     return;
   }
+
+  // 埋点
+  Report.reportLog({
+    objectType: Report.objectType.join_discord,
+    pageSource: Report.pageSource.task_page,
+    businessType: Report.businessType.buttonClick,
+    postId: state.postId,
+    srcContentId: state.tweetId,
+    senderId: state.userId,
+  });
+
   let url = getInviteUrl();
   if (url) {
     joinDiscordIng.value = true;