Kaynağa Gözat

Merge branch 'dev_1.0.5' of DeNet/de-net into master

wenliming 2 yıl önce
ebeveyn
işleme
a789b66084

+ 3 - 0
src/assets/css/reset.css

@@ -0,0 +1,3 @@
+body {
+    background-color: unset;
+}

BIN
src/assets/img/img-pined-guide.png


+ 5 - 0
src/assets/svg/icon-add-task.svg

@@ -0,0 +1,5 @@
+<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="22" height="22" rx="6" fill="#1D9BF0"/>
+<line x1="6" y1="10.75" x2="16" y2="10.75" stroke="white" stroke-width="1.5"/>
+<line x1="10.9492" y1="16" x2="10.9492" y2="6" stroke="white" stroke-width="1.5"/>
+</svg>

+ 3 - 0
src/assets/svg/icon-bells.svg

@@ -0,0 +1,3 @@
+<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M15 0C6.69231 0 0 6.69231 0 15C0 23.3077 6.69231 30 15 30C23.3077 30 30 23.3077 30 15C30 6.69231 23.3077 0 15 0ZM15 23.1923C14.1923 23.1923 13.5 22.6154 13.5 21.8077C13.5 21.6923 13.6154 21.5769 13.7308 21.5769H16.3846C16.5 21.5769 16.6154 21.6923 16.6154 21.8077C16.5 22.6154 15.8077 23.3077 15 23.1923ZM21.6923 20.4231C21.6923 20.5385 21.5769 20.6538 21.4615 20.6538H8.53846C8.42308 20.6538 8.30769 20.5385 8.30769 20.4231V19.1538C8.30769 18.3462 9.23077 17.7692 10.5 17.6538C10.3846 17.1923 10.2692 16.7308 10.2692 16.2692V12.5769C10.2692 10.6154 11.6538 9 13.5 8.53846V8.19231C13.6154 7.38462 14.3077 6.69231 15.1154 6.80769C15.8077 6.92308 16.5 7.5 16.5 8.19231V8.53846C18.3462 9 19.6154 10.7308 19.7308 12.5769V16.2692C19.7308 16.7308 19.6154 17.1923 19.5 17.6538C20.7692 17.7692 21.6923 18.3462 21.6923 19.1538V20.4231Z" fill="#FFA800"/>
+</svg>

Dosya farkı çok büyük olduğundan ihmal edildi
+ 6 - 0
src/assets/svg/icon-giveaways-notice.svg


+ 4 - 0
src/assets/svg/icon-task-close.svg

@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<line y1="-0.75" x2="12.8917" y2="-0.75" transform="matrix(-0.698077 0.716023 -0.698077 -0.716023 16.4922 7)" stroke="#D9D9D9" stroke-width="1.5"/>
+<line y1="-0.75" x2="12.8917" y2="-0.75" transform="matrix(0.698074 0.716025 0.698074 -0.716025 8.49219 7)" stroke="#D9D9D9" stroke-width="1.5"/>
+</svg>

+ 4 - 0
src/assets/svg/icon-task-facebook.svg

@@ -0,0 +1,4 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18.6004 10.0004C18.6004 5.25074 14.75 1.40039 10.0004 1.40039C5.25074 1.40039 1.40039 5.25074 1.40039 10.0004C1.40039 14.2928 4.54527 17.8507 8.65664 18.4959V12.4863H6.47305V10.0004H8.65664V8.1057C8.65664 5.95033 9.94059 4.75977 11.905 4.75977C12.8456 4.75977 13.8301 4.92773 13.8301 4.92773V7.04414H12.7457C11.6774 7.04414 11.3441 7.70711 11.3441 8.38789V10.0004H13.7293L13.348 12.4863H11.3441V18.4959C15.4555 17.8507 18.6004 14.2928 18.6004 10.0004Z" fill="#0D90F2"/>
+<path d="M13.3476 12.4863L13.7289 10.0004H11.3438V8.38789C11.3438 7.70779 11.677 7.04414 12.7453 7.04414H13.8297V4.92773C13.8297 4.92773 12.8456 4.75977 11.9046 4.75977C9.9402 4.75977 8.65625 5.95033 8.65625 8.1057V10.0004H6.47266V12.4863H8.65625V18.4959C9.54667 18.6352 10.4533 18.6352 11.3438 18.4959V12.4863H13.3476Z" fill="white"/>
+</svg>

+ 3 - 0
src/assets/svg/icon-task-twitter.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18.6004 5.03875C17.9679 5.30807 17.2795 5.5019 16.5705 5.57739C17.3023 5.14689 17.8583 4.46747 18.1208 3.65951C17.4449 4.05737 16.6801 4.34913 15.8843 4.50011C15.2394 3.82069 14.3236 3.40039 13.3087 3.40039C11.3553 3.40039 9.78438 4.96326 9.78438 6.88115C9.78438 7.15047 9.81746 7.41979 9.8712 7.67891C6.94631 7.52793 4.33768 6.14868 2.60342 4.03697C2.29749 4.5552 2.12386 5.14689 2.12386 5.79367C2.12386 7.00153 2.74605 8.06656 3.69483 8.69294C3.11605 8.67049 2.57035 8.50931 2.10112 8.25019V8.29304C2.10112 9.98445 3.31242 11.3861 4.92679 11.7085C4.6312 11.784 4.31494 11.8268 3.99868 11.8268C3.76924 11.8268 3.5522 11.8044 3.33309 11.7738C3.77958 13.153 5.07976 14.1548 6.62798 14.1875C5.41669 15.124 3.89947 15.6749 2.25202 15.6749C1.95643 15.6749 1.68358 15.6647 1.40039 15.632C2.96309 16.6216 4.81724 17.1928 6.81402 17.1928C13.2963 17.1928 16.8434 11.8921 16.8434 7.29125C16.8434 7.14027 16.8434 6.98928 16.8331 6.8383C17.5193 6.34251 18.1208 5.72838 18.6004 5.03875Z" fill="#1D9BF0"/>
+</svg>

+ 7 - 0
src/entry/background.js

@@ -16,6 +16,10 @@ import {
     onDisconnectHandler
     onDisconnectHandler
 } from "@/logic/background/twitter";
 } from "@/logic/background/twitter";
 
 
+import {
+    facebookShareSuccess
+} from "@/logic/background/facebook";
+
 //加载bg.js 执行
 //加载bg.js 执行
 setMessageCount();
 setMessageCount();
 
 
@@ -80,6 +84,9 @@ function onMessageMethod(req, sender, sendResponse) {
             case 'RED_PACKET_SAVE_DISCORD_AUTH_WINDOW_ID':
             case 'RED_PACKET_SAVE_DISCORD_AUTH_WINDOW_ID':
                 saveDiscordAuthWindowId(req);
                 saveDiscordAuthWindowId(req);
                 break;
                 break;
+            case 'CONTENT_FACEBOOK_SHARE_SUCCESS':
+                facebookShareSuccess(req, sender);
+                break;
         }
         }
     }
     }
 }
 }

+ 38 - 4
src/entry/content.js

@@ -11,8 +11,20 @@ import {
     showPinTips,
     showPinTips,
     init,
     init,
     initExecuteScript,
     initExecuteScript,
-    changeQueueNum
+    changeQueueNum,
+    replyHandle,
+    noticeBindTweet,
+    hideNoticeBindTweet,
+    getTweetAuthorByDom,
+    facebookReplyTweet,
+    doTaskTwitterAPI,
+    onTweetReplyClick
 } from "@/logic/content/twitter.js";
 } from "@/logic/content/twitter.js";
+import { duration } from "moment";
+
+import {
+    initFacebookContent
+} from "@/logic/content/facebook.js"
 
 
 
 
 chrome.storage.onChanged.addListener(changes => {
 chrome.storage.onChanged.addListener(changes => {
@@ -20,7 +32,8 @@ chrome.storage.onChanged.addListener(changes => {
 })
 })
 
 
 window.onload = () => {
 window.onload = () => {
-    init()
+    init();
+    initFacebookContent();
 };
 };
 
 
 window.onmessage = (res) => {
 window.onmessage = (res) => {
@@ -35,6 +48,27 @@ window.onmessage = (res) => {
             case "IFRAME_SHOW_TWITTER_PUBLISH_DIALOG":
             case "IFRAME_SHOW_TWITTER_PUBLISH_DIALOG":
                 showTwitterPublishDialogHandler(res.data.publishRes);
                 showTwitterPublishDialogHandler(res.data.publishRes);
                 break;
                 break;
+            case "IFRAME_RED_PACKET_REPLY_CLICK":
+                replyHandle(res.data.data || {});
+                break;
+            case "IFRAME_RED_PACKET_SHOW_BIND_TWEET_NOTICE":
+                noticeBindTweet(res.data.data || {});
+                break;
+            case "IFRAME_CLOSE_BIND_TWEET":
+                hideNoticeBindTweet();
+                break;
+            case "IFRAME_RED_PACKET_GET_TWEET_AUTHOR":
+                getTweetAuthorByDom(res.data.data || {});
+                break;
+            case "IFRAME_RED_PACKET_CHECK_FACEBOOK_REPLY":
+                facebookReplyTweet(res.data.data || {});
+                break;
+            case "IFRAME_RED_PACKET_ON_TWEET_REPLY_CLICK":
+                onTweetReplyClick(res.data.data || {});
+                break;
+            // case 'IFRAME_TWITTER_API_DO_TASK':
+            //     doTaskTwitterAPI(res.data)
+            //     break
             // case "IFRAME_DO_TASK":
             // case "IFRAME_DO_TASK":
             //     findTweetByIdDoTask(res.data.task_data, res.data.task_type)
             //     findTweetByIdDoTask(res.data.task_data, res.data.task_type)
             //     break
             //     break
@@ -56,8 +90,8 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
             console.log('BACK_TWITTER_SHORT_URL')
             console.log('BACK_TWITTER_SHORT_URL')
             changeQueueNum(1)
             changeQueueNum(1)
             break
             break
-        case 'TIME':
-            alert('time')
+        case 'IFRAME_TWITTER_API_DO_TASK':
+            doTaskTwitterAPI(req)
             break
             break
     }
     }
 })
 })

+ 3 - 1
src/http/configAPI.js

@@ -1,4 +1,4 @@
-export const appVersionCode = 5
+export const appVersionCode = 6
 
 
 const api = {
 const api = {
 	production: 'https://api.denetme.net',
 	production: 'https://api.denetme.net',
@@ -25,3 +25,5 @@ export const logAPIUrl = logApi[process.env.NODE_ENV] + '/log-center'
 export const pageUrl = page[process.env.NODE_ENV] 
 export const pageUrl = page[process.env.NODE_ENV] 
 
 
 export const discordAuthRedirectUri = `${pageUrl}/auth/discordCallback`;
 export const discordAuthRedirectUri = `${pageUrl}/auth/discordCallback`;
+
+export const faceShareRedirectUrl = `${pageUrl}/facebook/shareCallback`;

+ 10 - 0
src/iframe/bind-tweet.js

@@ -0,0 +1,10 @@
+import { createApp } from 'vue'
+import App from '@/view/iframe/bind-tweet/bind-tweet.vue'
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
+
+
+const app = createApp(App);
+
+app.use(ElementPlus);
+app.mount('#app');

+ 19 - 0
src/iframe/publish-tips.js

@@ -0,0 +1,19 @@
+import { createApp } from 'vue'
+import App from '@/view/iframe/publish-tips/publish-tips.vue'
+// import ElementPlus from 'element-plus'
+// import 'element-plus/dist/index.css'
+
+import "ant-design-vue/dist/antd.css"; // or 'ant-design-vue/dist/antd.less'
+import "@/assets/css/reset.css";
+
+import { message } from "ant-design-vue";
+message.config({
+    top: `20px`,
+    duration: 3,
+    maxCount: 1,
+});
+
+const app = createApp(App);
+
+app.use(message);
+app.mount('#app');

+ 1 - 0
src/iframe/red-packet.js

@@ -4,6 +4,7 @@ const app = createApp(App)
 
 
 // 引入路由对象实例
 // 引入路由对象实例
 import "ant-design-vue/dist/antd.css"; // or 'ant-design-vue/dist/antd.less'
 import "ant-design-vue/dist/antd.css"; // or 'ant-design-vue/dist/antd.less'
+import "@/assets/css/reset.css";
 
 
 import { message, Tooltip } from "ant-design-vue";
 import { message, Tooltip } from "ant-design-vue";
 message.config({
 message.config({

+ 36 - 0
src/logic/background/facebook.js

@@ -0,0 +1,36 @@
+import { fetchAddFinishEvent } from '@/logic/background/fetch/facebook'
+
+/**
+ * facebook分享成功逻辑
+ */
+export function facebookShareSuccess(params, sender) {
+    let {data} = params;
+    let {id} = sender.tab || {};
+    chrome.tabs.remove(id);
+
+    fetchAddFinishEvent({
+        eventType: data.type,
+        luckdropId: data.taskLuckdropId
+    }).then(res => {
+        if (res.code == 0) {
+            setTimeout(() => {
+                sendActivetabMessage({
+                    actionType: 'BG_FACEBOOK_SHARE_SUCCESS',
+                    data: data
+                });
+            })
+        }
+    })
+}
+
+
+function sendActivetabMessage(message = {}) {
+    chrome.tabs.query({
+        active: true,
+        currentWindow: true
+    }, (tabs) => {
+        chrome.tabs.sendMessage(tabs[0].id, message, res => {
+            console.log(res)
+        })
+    })
+}

+ 8 - 0
src/logic/background/fetch/facebook.js

@@ -0,0 +1,8 @@
+import { commonFetch } from '@/http/fetch'
+
+export function fetchAddFinishEvent(params = {}) {
+    return commonFetch({
+        url: '/post/luckdrop/addFinishEvent',
+        params
+    })
+}

+ 3 - 4
src/logic/background/twitter.js

@@ -195,7 +195,7 @@ export function onInstalledUserSet() {
         // 无刷新插入js
         // 无刷新插入js
         chrome.tabs.query({}, (tab) => {
         chrome.tabs.query({}, (tab) => {
             for (let i in tab) {
             for (let i in tab) {
-                if (tab[i].url.indexOf('twitter.com') >= 0) {
+                if (tab[i].url.indexOf('twitter.com') >= 0 || tab[i].url.indexOf('facebook.com') >= 0) {
                     chrome.scripting.executeScript({
                     chrome.scripting.executeScript({
                         target: { tabId: tab[i].id },
                         target: { tabId: tab[i].id },
                         files: ['js/content.js'],
                         files: ['js/content.js'],
@@ -267,9 +267,8 @@ export function onInstalledCreateTab() {
 export function popupRePublish(req) {
 export function popupRePublish(req) {
     setChromeStorage({
     setChromeStorage({
         popupShowPublishDialog: JSON.stringify({
         popupShowPublishDialog: JSON.stringify({
-            show: true,
-            srcContent: req.data.srcContent,
-            postId: req.data.postId
+            ...req.data,
+            show: true
         }),
         }),
     });
     });
     chrome.tabs.create({
     chrome.tabs.create({

+ 126 - 11
src/logic/content/ParseCard.js

@@ -11,6 +11,21 @@ import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
 class ParseCard {
 class ParseCard {
     constructor() {
     constructor() {
 
 
+    }
+    parseFaceBookCard() {
+        let de_net_card = []
+        let arr_article = document.querySelectorAll('div[role="article"]') || []
+        let _html
+        for (let i in arr_article) {
+            _html = arr_article[i].innerHTML || ''
+            if (_html.includes('denetme.net') && !this.isHasIframeByFacebook(arr_article[i])) {
+                de_net_card.push({
+                    time: new Date().getTime(),
+                    dom: arr_article[i]
+                })
+            }
+        }
+        return de_net_card
     }
     }
     parseAllDeNetCard() {
     parseAllDeNetCard() {
         let de_net_card = []
         let de_net_card = []
@@ -47,6 +62,56 @@ class ParseCard {
         }
         }
         return { tweet_Id, short_url, dom_card }
         return { tweet_Id, short_url, dom_card }
     }
     }
+    parseFaceBookParmas(dom_card) {
+        let tweet_Id = ''
+        let short_url = ''
+        let tweet_author = '';
+        let a_arr = dom_card.querySelectorAll('a[role="link"]') || []
+        a_arr = Array.from(a_arr).reverse()
+        for (let i in a_arr) {
+            // 获取推特id
+            if (a_arr[i].href.indexOf('facebook.com') > 0) {
+                let faceUrl = new URL(a_arr[i].href);
+                let faceSearch = new URLSearchParams(faceUrl.search);
+                let faceJumpUrl = decodeURIComponent(faceSearch.get('u'));
+                if (faceJumpUrl !== 'null') {
+                    let urlArr = new URL(faceJumpUrl);
+                    let searchArr = new URLSearchParams(urlArr.search);
+                    let deUrlParams = searchArr.get('deUrlParams') || '{}';
+                        deUrlParams = JSON.parse(deUrlParams);
+                    if (!tweet_Id) {
+                        tweet_Id = deUrlParams.tweetId;
+                    }
+                    if (!short_url) {
+                        short_url = faceJumpUrl
+                    }
+                    if (!tweet_author) {
+                        tweet_author = deUrlParams.fullName;
+                    }
+                }
+            } else {
+                if (a_arr[i].href.indexOf('denetme.net') > 0) {
+                    let urlArr = new URL(a_arr[i].href);
+                    let searchArr = new URLSearchParams(urlArr.search);
+                    let deUrlParams = searchArr.get('deUrlParams') || '{}';
+                        deUrlParams = JSON.parse(deUrlParams);
+                    if (!tweet_Id) {
+                        tweet_Id = deUrlParams.tweetId;
+                    }
+                    if (!short_url) {
+                        short_url = a_arr[i].href
+                    }
+                    if (!tweet_author) {
+                        tweet_author = deUrlParams.fullName;
+                    }
+                }
+            }
+            if (tweet_Id && short_url) {
+                break
+            }
+        }
+        return { tweet_Id, short_url, dom_card, tweet_author }
+    }
     hideCard() {
     hideCard() {
         if (dom.querySelector('iframe')) {
         if (dom.querySelector('iframe')) {
             return
             return
@@ -63,6 +128,17 @@ class ParseCard {
         })
         })
         return json_data
         return json_data
     }
     }
+    parseFacebookCardParmas() {
+        let json_data = []
+        this.parseFaceBookCard().forEach((item) => {
+            let _obj = this.parseFaceBookParmas(item.dom)
+            if (_obj.tweet_Id && _obj.short_url && _obj.dom_card) {
+                _obj.time = item.time
+                json_data.push(_obj)
+            }
+        })
+        return json_data
+    }
     // 获取短链接和渲染卡片数据
     // 获取短链接和渲染卡片数据
     async getCardParmas(card_json_data) {
     async getCardParmas(card_json_data) {
         let sort_link_data = await getChromeStorage('cardData') || []
         let sort_link_data = await getChromeStorage('cardData') || []
@@ -118,11 +194,14 @@ class ParseCard {
         return _array
         return _array
     }
     }
 
 
-    createIframe(post_Id, tweet_Id) {
+    createIframe({ post_Id, tweet_Id, tweet_author }, if_center = false) {
         let _iframe = document.createElement('iframe')
         let _iframe = document.createElement('iframe')
         _iframe.id = post_Id
         _iframe.id = post_Id
-        _iframe.src = chrome.runtime.getURL('/iframe/red-packet.html') + `?postId=${post_Id}&tweetId=${tweet_Id}`;
-        _iframe.style.cssText = 'border: medium none; width:375px;min-height:500px;'
+        _iframe.src = chrome.runtime.getURL('/iframe/red-packet.html') + `?postId=${post_Id}&tweetId=${tweet_Id}&tweet_author=${tweet_author}&window_origin=${window.location.origin}`;
+        _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px;'
+        if (if_center) {
+            _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px; display:block; margin:auto;'
+        }
         return _iframe
         return _iframe
     }
     }
     isHasIframeByArticle(dom_card) {
     isHasIframeByArticle(dom_card) {
@@ -155,17 +234,17 @@ class ParseCard {
                 }
                 }
                 if (_iframe.length > 1) {
                 if (_iframe.length > 1) {
                     for (let i = 0; i < _iframe.length; i++) {
                     for (let i = 0; i < _iframe.length; i++) {
-                        if (_iframe > 0) {
+                        if (i > 0) {
                             _iframe[i].remove()
                             _iframe[i].remove()
                         }
                         }
                     }
                     }
                 }
                 }
-            }else{
-                let _iframe = dom.parentElement.querySelectorAll('iframe') || []
-                if (_iframe.length > 1) {
-                    for (let i = 0; i < _iframe.length; i++) {
-                        if (_iframe > 0) {
-                            _iframe[i].remove()
+            } else {
+                let arr_iframe = dom.closest('article').querySelectorAll('iframe') || []
+                if (arr_iframe.length > 1) {
+                    for (let i = 0; i < arr_iframe.length; i++) {
+                        if (i > 0) {
+                            arr_iframe[i].remove()
                         }
                         }
                     }
                     }
                 }
                 }
@@ -174,6 +253,23 @@ class ParseCard {
         }
         }
         return false
         return false
     }
     }
+    isHasIframeByFacebook(dom_card) {
+        if (!dom_card || !dom_card.parentElement) {
+            return
+        }
+        let arr_iframe = dom_card.querySelectorAll('iframe') || []
+        if (arr_iframe.length > 0) {
+            if (arr_iframe.length > 1) {
+                for (let i = 0; i < arr_iframe.length; i++) {
+                    if (i > 0) {
+                        arr_iframe[i].remove()
+                    }
+                }
+            }
+            return true
+        }
+        return false
+    }
     replaceDOMRedPacket({ dom_card, tweet_Id, post_Id, time, short_url }) {
     replaceDOMRedPacket({ dom_card, tweet_Id, post_Id, time, short_url }) {
         if (!dom_card || !dom_card.parentElement) {
         if (!dom_card || !dom_card.parentElement) {
             return
             return
@@ -204,9 +300,28 @@ class ParseCard {
             // 渲染时长:${(new Date().getTime() - time) / 1000}s
             // 渲染时长:${(new Date().getTime() - time) / 1000}s
             // `
             // `
             // dom.parentElement.appendChild(div)
             // dom.parentElement.appendChild(div)
-            dom.appendChild(this.createIframe(post_Id, tweet_Id))
+            dom.appendChild(this.createIframe({ post_Id, tweet_Id }))
+        }
+
+    }
+    replaceFacebookPacket({ dom_card, tweet_Id, short_url, tweet_author }) {
+        if (!dom_card || !dom_card.parentElement) {
+            return
         }
         }
+        let dom = dom_card.querySelector('div[id^=jsc_c_][class=l9j0dhe7]')
+        dom.style = 'min-height:500px'
+        if (dom) {
+            for (let i = 0; i < dom.childNodes.length; i++) {
+                if (dom.children[i].tagName.toLowerCase() != 'iframe') {
+                    dom.children[i].style.display = 'none'
+                }
+            }
 
 
+            let originUrl = new URL(short_url);
+            let post_Id = originUrl.pathname.slice(1);
+
+            dom.appendChild(this.createIframe({ post_Id, tweet_Id, tweet_author }, true))
+        }
     }
     }
 }
 }
 export default new ParseCard()
 export default new ParseCard()

+ 71 - 0
src/logic/content/facebook.js

@@ -0,0 +1,71 @@
+import { faceShareRedirectUrl } from '@/http/configAPI'
+import { getChromeStorage } from '@/uilts/chromeExtension.js'
+
+let tempData = {
+    isSetContent: false
+}
+
+/**
+ * 初始化contentjs调用逻辑
+ */
+export function initFacebookContent() {
+    // window.location.href.indexOf('facebook.com') > -1;
+    injectShareCode();
+
+    shareCallback();
+};
+
+/**
+ * 注入分享页面逻辑
+ * @returns 
+ */
+function injectShareCode() {
+    const {href, pathname} = window.location;
+    if(!(href.indexOf('facebook.com') > -1 && pathname.indexOf('dialog/share') > -1)) {
+        return;
+    }
+
+    // 设置分享内容
+    setShareInputContent();
+}
+
+/**
+ * 格式化发布内容字符串
+ */
+function formatContentStr(content) {
+    let str = content.replace(/(\r)/g,'\n');
+    return str;
+}
+
+
+/**
+ * 设置分享输入框内容
+ */
+async function setShareInputContent() {
+    let shareData = await getChromeStorage('shareFacebookData') || {};
+    const contentStr = formatContentStr(shareData.contentStr);
+
+    if (!tempData.isSetContent && contentStr) {
+        tempData.isSetContent = true;
+        document.execCommand("insertText", false, contentStr);
+        setTimeout(() => {
+            tempData.isSetContent = false;
+        }, 300)
+    }
+}
+
+/**
+ * 分享回调
+ */
+function shareCallback() {
+    if (window.location.href.indexOf(faceShareRedirectUrl) > -1) {
+        const urlParams = new URLSearchParams(window.location.search);
+        let params = JSON.parse(urlParams.get('params'));
+        if (params) {
+            chrome.storage.local.remove("shareFacebookData");
+            chrome.runtime.sendMessage({ actionType: "CONTENT_FACEBOOK_SHARE_SUCCESS", data: params }, () => { 
+
+            })
+        }
+    }
+}

+ 449 - 37
src/logic/content/twitter.js

@@ -1,9 +1,9 @@
 import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
 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 { discordAuthRedirectUri } from '@/http/configAPI'
 import { reportSrcPublishEvent } from '@/http/publishApi'
 import { reportSrcPublishEvent } from '@/http/publishApi'
 import Report from "@/log-center/log"
 import Report from "@/log-center/log"
-
+import { fetchAddFinishEvent } from '@/logic/background/fetch/facebook';
 
 
 let dom = {};
 let dom = {};
 
 
@@ -72,10 +72,27 @@ export function hideIframeHandler() {
 /**
 /**
  * 展示twitter原生发布框
  * 展示twitter原生发布框
  */
  */
+let tweetPublishStore = {
+    showPublishDialog : false
+}
 export function showTwitterPublishDialogHandler(publishRes) {
 export function showTwitterPublishDialogHandler(publishRes) {
-    dom.tweetBtn.click();
+    let bigBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
+    if (bigBtn) {
+        bigBtn.click();
+        tweetPublishStore.showPublishDialog = true;
+    } else {
+        let smallBtn = document.querySelector('a[href="/compose/tweet"]')
+        smallBtn && smallBtn.click();
+        tweetPublishStore.showPublishDialog = true;
+    }
+
+    setChromeStorage({ publishData: JSON.stringify(publishRes) })
+
+    addPublishTipsIframe({
+        srcContent: publishRes.copyContent
+    })
     _setPublishContent(publishRes.srcContent);
     _setPublishContent(publishRes.srcContent);
-    _publishTweetEvent(publishRes.postId, bindTwitterArtMethod);
+    _publishTweetEvent(publishRes, bindTwitterArtMethod);
 }
 }
 
 
 export function showPinTips() {
 export function showPinTips() {
@@ -100,6 +117,7 @@ function addPinedPop() {
 
 
     let img = document.createElement('img');
     let img = document.createElement('img');
     img.src = require("@/assets/img/img-pined-guide.png");
     img.src = require("@/assets/img/img-pined-guide.png");
+    img.width = 253;
 
 
     let contentDom = document.createElement('div');
     let contentDom = document.createElement('div');
     contentDom.innerHTML = "<div style='font-weight: 500;font-size: 18px;margin-top: 20px;margin-bottom: 20px'>📌 Pin an Extension is more convenient to open😄</div><div style='display: flex; align-items: center; justify-content: space-between;'><div style='display: flex; align-items: center; font-size: 14px; color: #899099; cursor: pointer;' id='de-remind'><input id='de-check' type='checkbox'/> Don't remind</div><div class='de-pin-skip' style='font-weight: 500; font-size: 16px; color: #1D9BF0;cursor: pointer;'>Skip</div></div>"
     contentDom.innerHTML = "<div style='font-weight: 500;font-size: 18px;margin-top: 20px;margin-bottom: 20px'>📌 Pin an Extension is more convenient to open😄</div><div style='display: flex; align-items: center; justify-content: space-between;'><div style='display: flex; align-items: center; font-size: 14px; color: #899099; cursor: pointer;' id='de-remind'><input id='de-check' type='checkbox'/> Don't remind</div><div class='de-pin-skip' style='font-weight: 500; font-size: 16px; color: #1D9BF0;cursor: pointer;'>Skip</div></div>"
@@ -107,7 +125,12 @@ function addPinedPop() {
     popWrapper.appendChild(img);
     popWrapper.appendChild(img);
     popWrapper.appendChild(contentDom);
     popWrapper.appendChild(contentDom);
 
 
-    document.querySelector('body').appendChild(popWrapper);
+    let layersDom = document.getElementById('layers');
+    if(layersDom) {
+        layersDom.appendChild(popWrapper);
+    } else {
+        document.querySelector('body').appendChild(popWrapper);
+    }
 
 
     let deCheck = document.querySelector('#de-check');
     let deCheck = document.querySelector('#de-check');
     let deRemind = document.querySelector('#de-remind');
     let deRemind = document.querySelector('#de-remind');
@@ -143,12 +166,13 @@ let bindTwitterArt = {
  * 监听dialog内点击原生发布按钮事件
  * 监听dialog内点击原生发布按钮事件
  * @private
  * @private
  */
  */
-function _publishTweetEvent(contentStr, cb) {
+function _publishTweetEvent(params, cb) {
     setTimeout(() => {
     setTimeout(() => {
         let publishTweetBtn;
         let publishTweetBtn;
         let dialog = document.querySelector('div[role="dialog"]');
         let dialog = document.querySelector('div[role="dialog"]');
         if (dialog) {
         if (dialog) {
             publishTweetBtn = dialog.querySelector('div[data-testid="tweetButton"]');
             publishTweetBtn = dialog.querySelector('div[data-testid="tweetButton"]');
+            onClosePublishDialogHandle(dialog, params)
         } else {
         } else {
             let domMain = document.querySelector('main[role="main"]');
             let domMain = document.querySelector('main[role="main"]');
             publishTweetBtn = domMain && domMain.querySelector('div[data-testid="tweetButton"]');
             publishTweetBtn = domMain && domMain.querySelector('div[data-testid="tweetButton"]');
@@ -156,12 +180,48 @@ function _publishTweetEvent(contentStr, cb) {
 
 
         publishTweetBtn && publishTweetBtn.addEventListener('click', function () {
         publishTweetBtn && publishTweetBtn.addEventListener('click', function () {
             bindTwitterArt.needBind = true;
             bindTwitterArt.needBind = true;
-            bindTwitterArt.postId = contentStr;
+            bindTwitterArt.postId = params.postId;
+            tweetPublishStore.showPublishDialog = false;
+            // checkIsShowReSend(dialog, params);
             cb && cb()
             cb && cb()
         });
         });
     }, 800)
     }, 800)
 }
 }
 
 
+function onClosePublishDialogHandle(dom, params) {
+    dom.querySelector('div[role="group"]').addEventListener('click', function () {
+        setTimeout(() => {
+            let parent = document.querySelector('div[data-testid="confirmationSheetDialog"]');
+             if(parent) {
+                 let btnArr = parent.querySelectorAll('div[role=button]')
+                 for(let i = 0; i < btnArr.length; i++) {
+                     let btn = btnArr[i];
+                     btn.addEventListener('click', function() {
+                        tweetPublishStore.showPublishDialog = false;
+                        let taskLuckdropId = JSON.parse(params.postBizData).taskLuckdropId;
+                        noticeBindTweet({ postId: params.postId, taskLuckdropId});
+                     })
+                 }
+             } else {
+                 setTimeout(() => {
+                    let dialog = document.querySelector('div[role="dialog"]');
+                    if(!dialog) {
+                        tweetPublishStore.showPublishDialog = false;
+                    }
+                 }, 800)
+             }
+        }, 1000)
+     })
+}
+
+function checkIsShowReSend(dom, params) {
+    let str = dom.querySelector('div[data-contents="true"]').innerHTML;
+    if (str.indexOf(params.postId) < 0) {
+        let taskLuckdropId = JSON.parse(params.postBizData).taskLuckdropId;
+        noticeBindTweet({ postId: params.postId, taskLuckdropId});
+    }
+}
+
 /**
 /**
  * 在输入推文区插入deNet按钮
  * 在输入推文区插入deNet按钮
  * @param parent
  * @param parent
@@ -270,7 +330,51 @@ function _addIframe() {
     dom.iframe = iframe;
     dom.iframe = iframe;
     let iframeContent = document.getElementById('iframe-content');
     let iframeContent = document.getElementById('iframe-content');
     if (!iframeContent) {
     if (!iframeContent) {
-        document.getElementById('layers').appendChild(iframe);
+        let layersDom = document.getElementById('layers');
+        if(layersDom) {
+            layersDom.appendChild(iframe);
+        } else {
+            document.querySelector('body').appendChild(iframe);
+        }
+        
+    }
+}
+
+function addPublishTipsIframe(params = {}) {
+    let {time = 1000} = params;
+    setTimeout(() => {
+        let dialog = document.querySelector('div[role="dialog"]').querySelector('div[role="dialog"]')
+
+        if (dialog) {
+            let right = dialog.offsetLeft - 15 - 266;
+
+            let iframe = document.createElement('iframe');
+            iframe.id = 'de-publish-tips'
+            iframe.src = chrome.runtime.getURL('/iframe/publish-tips.html');
+            iframe.style.cssText = `border: medium none; width:270px;height:500px;position: fixed; right: ${right}px; top: 5%;z-index: -1`
+            let iframeContent = document.getElementById('de-publish-tips');
+            if (!iframeContent) {
+                dialog.appendChild(iframe)
+            }
+        }
+    }, time)
+}
+
+export function noticeBindTweet(params) {
+    let iframe = document.createElement('iframe');
+    iframe.id = 'de-notice-bind-tweet';
+    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) {
+        document.querySelector('body').appendChild(iframe)
+    }
+}
+
+export function hideNoticeBindTweet() {
+    let iframeContent = document.getElementById('de-notice-bind-tweet');
+    if (iframeContent) {
+        document.querySelector('body').removeChild(iframeContent)
     }
     }
 }
 }
 
 
@@ -316,6 +420,10 @@ let isSetContent = false;
 const _setPublishContent = throttle(function (content) {
 const _setPublishContent = throttle(function (content) {
     if (!isSetContent) {
     if (!isSetContent) {
         isSetContent = true;
         isSetContent = true;
+        let inputEle = document.querySelector('div[contenteditable="true"]');
+        if(inputEle) {
+            inputEle.focus();
+        }
         setTimeout(() => {
         setTimeout(() => {
             document.execCommand("insertText", false, content);
             document.execCommand("insertText", false, content);
             setTimeout(() => {
             setTimeout(() => {
@@ -438,6 +546,20 @@ function addSliderNavDeBtn(isSmall = false) {
 function onWindowResize() {
 function onWindowResize() {
     window.onresize = throttle(function () {
     window.onresize = throttle(function () {
         try {
         try {
+            if(tweetPublishStore.showPublishDialog) {
+                let dialog = document.querySelector('div[role="dialog"]');
+                let dePublishTips = document.getElementById('de-publish-tips');
+                if(dialog && !dePublishTips) {
+                    addPublishTipsIframe({time: 0});
+                } else if(dialog && dePublishTips){
+                    let dialogContent = dialog.querySelector('div[role=dialog]')
+                    if(dialogContent) {
+                        let right = dialogContent.offsetLeft - 15 - 266;
+                        dePublishTips.style.right = right + 'px';
+                    }
+                }
+            }
+            
             if (window.innerWidth < 1273) {
             if (window.innerWidth < 1273) {
                 let bigBtn = document.querySelector('#de-btn');
                 let bigBtn = document.querySelector('#de-btn');
                 bigBtn && bigBtn.remove();
                 bigBtn && bigBtn.remove();
@@ -537,19 +659,30 @@ function onChangePageMain(targetNode) {
 // 2.监听卡片是否可见
 // 2.监听卡片是否可见
 // 3.如果可见了 去找
 // 3.如果可见了 去找
 
 
-function setIframeRedPacket() {
+function setIframeRedPacket(type = 'twitter') {
     // 获取所有卡片参数
     // 获取所有卡片参数
-    let card_json_data = parseCard.parseAllDeNetCardParmas()
-    // 过滤出可以请求的短链接
-    parseCard.getCardParmas(card_json_data).then((res) => {
-        for (let i in res.has_post_Id_card_data) {
-            parseCard.replaceDOMRedPacket(res.has_post_Id_card_data[i])
-        }
-        if (res.need_net_short_url.length > 0) {
-            // 请求短链接
-            chrome.runtime.sendMessage({ actionType: "CONTENT_TWITTER_SHORT_LINK", data: "", arr_url: res.need_net_short_url }, () => { })
-        }
-    })
+    let card_json_data
+    switch (type) {
+        case 'facebook':
+            card_json_data = parseCard.parseFacebookCardParmas()
+            for (let i in card_json_data) {
+                parseCard.replaceFacebookPacket(card_json_data[i])
+            }
+            break;
+        default:
+            card_json_data = parseCard.parseAllDeNetCardParmas()
+            // 过滤出可以请求的短链接
+            parseCard.getCardParmas(card_json_data).then((res) => {
+                for (let i in res.has_post_Id_card_data) {
+                    parseCard.replaceDOMRedPacket(res.has_post_Id_card_data[i])
+                }
+                if (res.need_net_short_url.length > 0) {
+                    // 请求短链接
+                    chrome.runtime.sendMessage({ actionType: "CONTENT_TWITTER_SHORT_LINK", data: "", arr_url: res.need_net_short_url }, () => { })
+                }
+            })
+            break;
+    }
 }
 }
 
 
 // 监听点击发推 按钮绑定事件
 // 监听点击发推 按钮绑定事件
@@ -587,22 +720,23 @@ const createIframe = ({ url, tweet_Id }, callback) => {
 // 初始化
 // 初始化
 export function init() {
 export function init() {
     getDiscordAuthCode();
     getDiscordAuthCode();
-    if (window.location.href.indexOf('twitter.com') < 0) {
+    let where = window.location.href.indexOf('twitter.com') < 0 && window.location.href.indexOf('facebook.com') < 0;
+    if (where) {
         return
         return
     }
     }
     twitterPinLogin();
     twitterPinLogin();
     // 渲染dom
     // 渲染dom
-    let targetNode = null
+
     let timer = setInterval(() => {
     let timer = setInterval(() => {
-        targetNode = document.querySelector('main')
-        if (targetNode) {
+        let inTwitter = window.location.href.includes('twitter.com');
+        let inTwitterNode = document.querySelector('main');
+        let inFacebook = window.location.href.includes('facebook.com');
+        let inFacebookNode = document.querySelector('#facebook');
+        if (inTwitter && inTwitterNode) {
             clearInterval(timer)
             clearInterval(timer)
             setInterval(() => {
             setInterval(() => {
-                if (window.location.href.includes('twitter.com)')) {
-                    return
-                }
                 if (!main_observer) {
                 if (!main_observer) {
-                    onChangePageMain(targetNode)
+                    onChangePageMain(inTwitterNode)
                     changeQueueNum(1)
                     changeQueueNum(1)
                 }
                 }
                 if (queue_num <= 0) {
                 if (queue_num <= 0) {
@@ -610,35 +744,181 @@ export function init() {
                 }
                 }
                 setIframeRedPacket()
                 setIframeRedPacket()
                 checkHasDeBtn()
                 checkHasDeBtn()
+                checkHasSliderDeBtn();
+                changeQueueNum(-1)
+            }, 1000)
+        } else if (inFacebook && inFacebookNode) {
+            clearInterval(timer)
+            setInterval(() => {
+                if (!main_observer) {
+                    onChangePageMain(inFacebookNode)
+                    changeQueueNum(1)
+                }
+                if (queue_num <= 0) {
+                    return
+                }
+                setIframeRedPacket('facebook')
                 changeQueueNum(-1)
                 changeQueueNum(-1)
             }, 1000)
             }, 1000)
         }
         }
     }, 1000);
     }, 1000);
     renderDom();
     renderDom();
-    checkTwitterTaskState()
+    checkTwitterTaskState();
+
     getChromeStorage("popupShowPublishDialog", (res) => {
     getChromeStorage("popupShowPublishDialog", (res) => {
         console.log("popupShowPublishDialog", res);
         console.log("popupShowPublishDialog", res);
         if (res && res.show) {
         if (res && res.show) {
             setTimeout(() => {
             setTimeout(() => {
                 showTwitterPublishDialogHandler({
                 showTwitterPublishDialogHandler({
                     srcContent: res.srcContent,
                     srcContent: res.srcContent,
-                    postId: res.postId
+                    postId: res.postId,
+                    copyContent: res.copyContent || ''
                 });
                 });
             }, 1500);
             }, 1500);
             chrome.storage.local.remove("popupShowPublishDialog");
             chrome.storage.local.remove("popupShowPublishDialog");
         }
         }
     });
     });
     getChromeStorage("userSettings", (res) => {
     getChromeStorage("userSettings", (res) => {
-        addPinedPop();
-        if (res && !res.isOnToolbar) {
-            setTimeout(() => {
-                showPinTips();
-                chrome.storage.local.remove("userSettings");
-            }, 800);
-        }
+        setTimeout(() => {
+            addPinedPop();
+            if (res && !res.isOnToolbar) {
+                setTimeout(() => {
+                    showPinTips();
+                    chrome.storage.local.remove("userSettings");
+                }, 800);
+            }
+        }, 800);
     });
     });
 }
 }
 
 
+function checkHasSliderDeBtn() {
+    let deBtn = document.getElementById('de-btn');
+    let deBtn3 = document.getElementById('de-btn3');
+    if(!deBtn && !deBtn3) {
+        addSliderNavDeBtn();
+    }
+}
+
+export function facebookReplyTweet(params) {
+    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) {
+                let iframe = document.getElementById(params.postId);
+                iframe.contentWindow.postMessage({ actionType: 'CONTENT_RED_PACKET_FACEBOOK_REPLY', data: deReplyParams }, '*');
+            }
+        }
+    }
+}
+
+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) {
+        replyBtn.click();
+    }
+    onReplyDialogOpen(params, iframe);
+
+    // 详情页推文底部评论处理
+    let pathNameArr = window.location.pathname.split('/');
+    if (pathNameArr.length >= 2 && pathNameArr[pathNameArr.length - 2] == 'status') {
+        let tweetReply = document.querySelector('div[data-testid="tweetButtonInline"]');
+        if(tweetReply) {
+            tweetReply.addEventListener('click', function() {
+                let eleList = tweetReply.parentNode.parentNode.parentNode.parentNode.parentNode.querySelectorAll('span[data-text="true"]');
+                reportReplyResult(eleList, params, () => {
+                    // iframe.contentWindow.postMessage({ actionType: 'CONTENT_RED_PACKET_REPLY_RASK_FINSH', data: {} }, '*');
+                    chrome.runtime.sendMessage({ actionType: "CONTENT_RED_PACKET_REPLY_RASK_FINSH", data : {postId: params.postId}}, () => { })
+                });
+            })
+        }
+    }
+}
+
+export function onTweetReplyClick(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) {
+        replyBtn.addEventListener('click', () => {
+            onReplyDialogOpen(params, iframe);
+        })
+    }
+}
+
+function onReplyDialogOpen(params, iframe) {
+    setTimeout(() => {
+        let dialog = document.querySelector('div[role="dialog"]');
+        let replyBtn; 
+        
+        if (dialog) {
+            let dialogContent  = dialog.querySelector('div[role="dialog"]');
+            replyBtn = dialog.querySelector('div[data-testid="toolBar"]').querySelector('div[data-testid="tweetButton"]');
+            if(dialogContent) {
+                let width = dialogContent.offsetWidth;
+                let ele = document.createElement('div');
+                ele.innerText = 'Tag 3 friends to complete the task';
+                ele.style.cssText = `width: ${width}px; height: 38px; color: #fff; font-weight: 600;
+                font-size: 16px; display: flex; align-items: center; justify-content: center; background: #1D9BF0;
+                opacity: 0.8; position: absolute; top: 18px; left: 50%; transform: translateX(-50%); z-index: 1000`;
+    
+                dialogContent.style.top = '80px';
+                dialogContent.parentNode.appendChild(ele);
+            }
+        } else {
+            dialog = document.querySelector('main[role="main"]');
+            if(dialog) {
+                replyBtn = dialog.querySelector('div[data-testid="tweetButton"]');
+            }
+        }
+
+        if(dialog && replyBtn) {
+            replyBtn.addEventListener('click', function () {
+                let eleList = dialog.querySelector('div[contenteditable="true"]').querySelectorAll('span[data-text="true"]');
+                reportReplyResult(eleList, params, () => {
+                    // 上報完成
+                    // iframe.contentWindow.postMessage({ actionType: 'CONTENT_RED_PACKET_REPLY_RASK_FINSH', data: {} }, '*');
+                    chrome.runtime.sendMessage({ actionType: "CONTENT_RED_PACKET_REPLY_RASK_FINSH", data : {postId: params.postId}}, () => { })
+                })
+            });
+        }
+    }, 1000);
+}
+
+const reportReplyResult = throttle(function (eleList, params, cb) {
+    if (eleList && eleList.length) {
+        let atList = [];
+        for (let i = 0; i < eleList.length; i++) {
+            let item = eleList[i];
+            // 是否有中文
+            let reg = /[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/g;
+
+            if (item && item.innerText.startsWith('@') && !reg.test(item.innerText)) {
+                atList.push(item.innerText);
+            }
+        }
+
+        atList = Array.from(new Set(atList));
+
+        if (atList.length >= 3) {
+            fetchAddFinishEvent({
+                eventType: params.type,
+                luckdropId: params.taskLuckdropId
+            }).then(res => {
+                if (res.code == 0) {
+                    cb && cb();
+                }
+            })
+        }
+    }
+}, 800);
+
+
+
 // 根据推特id找到dom,完成任务
 // 根据推特id找到dom,完成任务
 export function findTweetByIdDoTask({ tweet_Id = '', follow_names = [] }, task_type = 'like') {
 export function findTweetByIdDoTask({ tweet_Id = '', follow_names = [] }, task_type = 'like') {
     // 1.根据推特ID寻找推文,获取卡片
     // 1.根据推特ID寻找推文,获取卡片
@@ -743,4 +1023,136 @@ export function checkTwitterTaskState() {
             }
             }
         }
         }
     }, 1000)
     }, 1000)
+}
+
+export function getTweetAuthorByDom(params) {
+    let iframe = document.getElementById(params.postId);
+    if(!iframe) {
+        return;
+    }
+    let fullNameDom;
+    let pathNameArr = window.location.pathname.split('/');
+    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) {
+        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 } }, '*');
+            }
+        }
+    }
+}
+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 }, () => { })
+    })
 }
 }

+ 8 - 2
src/manifest.json

@@ -2,7 +2,7 @@
     "manifest_version": 3,
     "manifest_version": 3,
     "name": "DeNet",
     "name": "DeNet",
     "description": "Growing more twitter followers with Denet",
     "description": "Growing more twitter followers with Denet",
-    "version": "1.0.5",
+    "version": "1.0.6",
     "background": {
     "background": {
         "service_worker": "/js/background.js"
         "service_worker": "/js/background.js"
     },
     },
@@ -20,6 +20,8 @@
             "matches": [
             "matches": [
                 "https://*.twitter.com/*",
                 "https://*.twitter.com/*",
                 "https://twitter.com/*",
                 "https://twitter.com/*",
+                "https://www.facebook.com/*",
+                "https://facebook.com/*",
                 "*://testh5.denetme.net/*",
                 "*://testh5.denetme.net/*",
                 "*://h5.denetme.net/*",
                 "*://h5.denetme.net/*",
                 "*://preh5.denetme.net/*"
                 "*://preh5.denetme.net/*"
@@ -33,6 +35,8 @@
     "host_permissions": [
     "host_permissions": [
         "*://*.twitter.com/*",
         "*://*.twitter.com/*",
         "*://twitter.com/*",
         "*://twitter.com/*",
+        "*://*.facebook.com/*",
+        "*://facebook.com/*",
         "*://testh5.denetme.net/*",
         "*://testh5.denetme.net/*",
         "*://h5.denetme.net/*",
         "*://h5.denetme.net/*",
         "*://preh5.denetme.net/*"
         "*://preh5.denetme.net/*"
@@ -52,7 +56,9 @@
             "resources": [
             "resources": [
                 "/iframe/publish.html",
                 "/iframe/publish.html",
                 "/iframe/red-packet.html",
                 "/iframe/red-packet.html",
-                "/iframe/home.html"
+                "/iframe/home.html",
+                "/iframe/publish-tips.html",
+                "/iframe/bind-tweet.html"
             ],
             ],
             "matches": [
             "matches": [
                 "<all_urls>"
                 "<all_urls>"

+ 13 - 0
src/uilts/help.js

@@ -87,4 +87,17 @@ export function getBit (value) {
   } else {
   } else {
     return value;
     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 "";
 }
 }

+ 5 - 0
src/view/components/currency-list.vue

@@ -354,6 +354,11 @@ defineExpose({
 
 
             .right {
             .right {
                 text-align: right;
                 text-align: right;
+                max-width: calc(100% - 150px);
+                
+                .num, .amount {
+                    word-break: break-all;
+                }
 
 
                 .num {
                 .num {
                     font-weight: 500;
                     font-weight: 500;

+ 2 - 2
src/view/components/font-amount.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
-    <div :style="{ fontSize: amount_font_size + 'px' }">
+    <div>
         <a-tooltip :title="amount" >
         <a-tooltip :title="amount" >
-            <span class="content" :style="{ fontSize: amount_font_size + 'px' }">{{ getBit(amount) }}</span>
+           <span class="content" :style="{ fontSize: amount_font_size + 'px' }">{{ getBit(amount) }}</span>
         </a-tooltip>
         </a-tooltip>
     </div>
     </div>
 </template>
 </template>

+ 2 - 2
src/view/components/popup-transactions.vue

@@ -341,7 +341,7 @@ const listScroll = (e) => {
                 display: flex;
                 display: flex;
                 justify-content: space-between;
                 justify-content: space-between;
                 align-items: center;
                 align-items: center;
-                border-bottom: 1px solid #d1d1d1;
+                border-bottom: 1px solid #ECECEC;
                 box-sizing: border-box;
                 box-sizing: border-box;
                 padding: 10px 12px 10px 0;
                 padding: 10px 12px 10px 0;
 
 
@@ -356,7 +356,7 @@ const listScroll = (e) => {
 
 
                     .time {
                     .time {
                         font-size: 12px;
                         font-size: 12px;
-                        color: #b6b6b6;
+                        color: #B0B0B0;
                     }
                     }
                 }
                 }
 
 

+ 145 - 0
src/view/iframe/bind-tweet/bind-tweet.vue

@@ -0,0 +1,145 @@
+<template>
+    <div class="bind-tips-wrapper">
+        <img  :src="require('@/assets/svg/icon-close.svg')" class="icon-close" @click="close">
+        <div class="top">
+            <img :src="require('@/assets/svg/icon-giveaways-notice.svg')" class="icon-give-box">
+            <div class="text">
+                oops, you failed to send giveaway
+            </div>
+        </div>
+        <div class="button-wrapper">
+            <div class="re-send" @click="seSend">Resend</div>
+            <div class="terminate" v-if="submitData.taskLuckdropId"  @click="terminate">Terminate for a refund</div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+/* eslint-disable */
+import { onMounted, ref } from "vue";
+import { ElMessage } from 'element-plus'
+import { getChromeStorage } from '@/uilts/chromeExtension.js'
+import { getQueryString } from '@/uilts/help.js'
+import { terminatedLuckdrop } from "@/http/redPacket";
+
+let submitData = ref({
+    taskLuckdropId: ''
+});
+
+const close = () => {
+    window.parent.postMessage({ actionType: "IFRAME_CLOSE_BIND_TWEET",  data: {
+    }}, "*");
+}
+
+const seSend = async () => {
+    let publishData = await getChromeStorage('publishData');
+    callEventPageMethod(
+        "POPUP_PUBLISH_TWITTER_RED_PACK",
+        {...publishData},
+        function (response) {
+            close();
+            console.log("res", response);
+        }
+    );
+}
+
+const terminate = () => {
+    terminatedLuckdrop({
+        params: {
+            luckdropId: submitData.value.taskLuckdropId
+        }
+    }).then(res => {
+        close();
+    });
+}
+
+/**
+ * sendMessage
+ */
+const callEventPageMethod = (actionType, data, callback) => {
+    chrome.runtime.sendMessage(
+        { 
+            actionType: actionType, 
+            data: data 
+        },
+        function (response) {
+            if (typeof callback === "function") callback(response);
+        }
+    );
+};
+
+
+onMounted(() => {
+    let params = getQueryString('params');
+    submitData.value = JSON.parse(params);
+}) 
+
+</script>
+
+<style scoped lang="scss">
+.bind-tips-wrapper {
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    background: #FFFFFF;
+    border-radius: 20px;
+    padding: 15px;
+    position: relative;
+    box-shadow: 0px 4px 30px 0px #00000033;
+
+
+    .icon-close {
+        position: absolute;
+        left: 14px;
+        top: 14px;
+        width: 24px;
+        height: 24px;
+        cursor: pointer;
+    }
+
+    .top {
+        display: flex;
+        align-items: center;
+        flex-direction: column;
+        margin-top: 35px;
+
+        .icon-give-box {
+            width: 60px;
+            height: 60px;
+            margin-bottom: 20px;
+        }
+
+        .text {
+            font-weight: 590;
+            font-size: 18px;
+        }
+    }
+
+    .button-wrapper {
+        margin-top: 26px;
+
+        .re-send, .terminate {
+            width: 360px;
+            height: 43px;
+            border-radius: 100px;
+            font-weight: 500;
+            font-size: 17px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            cursor: pointer;
+        }
+        
+        .re-send {
+            background: #1D9BF0;
+            margin-bottom: 12px;
+            color: #FFFFFF;
+        }
+
+        .terminate {
+            color: #1D9BF0;
+            border: 1px solid #ECECEC;
+        }
+    }
+}
+</style>

+ 105 - 0
src/view/iframe/publish-tips/publish-tips.vue

@@ -0,0 +1,105 @@
+<template>
+    <div class="publish-tips-wrapper">
+        <div class="top">
+            <img src="@/assets/svg/icon-bells.svg" class="icon-bells">
+            <div class="text-wrapper">
+                <div>
+                    Do not delete the
+                </div>
+                <div>
+                    <span>#DeNet </span>and<span> Giveaway link</span>
+                    otherwise the giveaway will not be available
+                </div>
+            </div>
+        </div>
+        <div class="copy-btn" 
+            :data-clipboard-text="strContent" 
+            @click="copyToken">Copy giveaways link</div>
+    </div>
+</template>
+
+<script setup>
+/* eslint-disable */
+import { onMounted, ref } from "vue";
+import { message } from 'ant-design-vue';
+import { getChromeStorage } from '@/uilts/chromeExtension.js'
+
+let ClipboardJS = require('clipboard');
+
+let strContent = ref('');
+
+const copyToken = () => {
+    var clipboard = new ClipboardJS('.copy-btn');
+    clipboard.on('success', function (e) {
+        message.success('copy success');
+        console.info('Action:', e.action);
+        console.info('Text:', e.text);
+        console.info('Trigger:', e.trigger);
+
+        e.clearSelection();
+    });
+
+    clipboard.on('error', function (e) {
+        console.error('Action:', e.action);
+        console.error('Trigger:', e.trigger);
+    });
+}
+
+const setSrcContent = async () => {
+    let publishData = await getChromeStorage('publishData');
+    strContent.value = publishData.copyContent;
+}
+
+
+onMounted(() => {
+    setSrcContent();
+}) 
+
+</script>
+
+<style  lang="scss">
+body {
+    overflow-y: hidden;
+}
+.publish-tips-wrapper {
+    width: 100%;
+    box-sizing: border-box;
+    background: #FFFFFF;
+    border-radius: 12px;
+    padding: 15px;
+    margin-top: 88px;
+    .top {
+        display: flex;
+
+        .icon-bells {
+            width: 30px;
+            height: 30px;
+            margin-right: 8px;
+        }
+
+        .text-wrapper {
+            font-weight: 500;
+            font-size: 14px;
+            line-height: 17px;
+
+            span {
+                color: red;
+            }
+        }
+    }
+
+    .copy-btn {
+        margin-top: 20px;
+        background: rgba(56, 154, 255, 0.01);
+        border: 1px solid #000000;
+        border-radius: 100px;
+        font-weight: 500;
+        font-size: 14px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        height: 33px;
+        cursor: pointer;
+    }
+}
+</style>

+ 153 - 65
src/view/iframe/publish/give-dialog.vue

@@ -162,64 +162,97 @@
                                     Recommend winners 100~10000
                                     Recommend winners 100~10000
                                 </div>
                                 </div>
                             </div>
                             </div>
-                            <div class="form-label">Tasks</div>
+                            <div class="form-label">
+                                <div>
+                                    Tasks
+                                </div>
+                                <!-- <div>
+                                    <el-dropdown trigger="click">
+                                        <img src="@/assets/svg/icon-add-task.svg" 
+                                            class="icon-add-task"
+                                            v-show="formList.some(item => !item.show)">
+                                        <template #dropdown>
+                                            <el-dropdown-menu>
+                                                <div  v-for="(item, key) in formList" :key="key"
+                                                     @click="clickDropdown(item, key)">
+                                                    <el-dropdown-item style="height: 50px;width: 240px" v-if="!item.show">
+                                                        <img :src="item.icon" style="width: 20px; height: 20px;margin-right: 12px" />
+                                                        {{item.label}}
+                                                    </el-dropdown-item>
+                                                </div>
+                                            </el-dropdown-menu>
+                                        </template>
+                                    </el-dropdown>
+                                </div> -->
+                            </div>
 
 
                             <!-- 转推、like、关注 -->
                             <!-- 转推、like、关注 -->
                             <div class="form-require">
                             <div class="form-require">
                                 <div
                                 <div
-                                    class="form-item"
                                     v-for="(item, index) in formList"
                                     v-for="(item, index) in formList"
                                     :key="index"
                                     :key="index"
                                 >
                                 >
-                                    <div class="item-left">
-                                        <div class="label">
-                                            <img
-                                                class="icon"
-                                                :src="item.icon"
-                                            />
-                                            {{ item.label }}
-                                        </div>
-                                        <div
-                                            class="control"
-                                            v-if="item.nodeType == 'textarea'"
-                                        >
-                                            <follow-input
-                                                :isAddSelf="!isBack"
-                                                :atUserList="atUserList"
-                                                @addUser="addFollowUser"
-                                                @setUser="setFollowUser"
-                                                @delUser="delFollowUser"
-                                            ></follow-input>
-                                        </div>
-                                        <!-- join discord -->
-                                        <div
-                                            class="control"
-                                            v-if="item.nodeType == 'input'"
-                                        >
-                                            <div v-if="showDiscordInvitePop" 
-                                                class="discord-invite-info"
-                                                @click="showDiscordInvitePop = false">
-                                                <img class="icon" :src="discordInviteInfo.icon || require('@/assets/svg/icon-discord-mini.svg')" />
-                                                <span class="name">{{discordInviteInfo.name}}</span>
+                                    <div v-if="item.show"  class="form-item"    
+                                        :class="{ 'border-hide': formList.length - 1 == index }">
+                                        <div class="item-left">
+                                            <div class="label">
+                                                <img
+                                                    class="icon"
+                                                    :src="item.icon"
+                                                />
+                                                {{ item.label }}
+                                            </div>
+                                            <div
+                                                class="control"
+                                                v-if="item.nodeType == 'textarea'"
+                                            >
+                                                <follow-input
+                                                    :isAddSelf="!isBack"
+                                                    :atUserList="atUserList"
+                                                    @addUser="addFollowUser"
+                                                    @setUser="setFollowUser"
+                                                    @delUser="delFollowUser"
+                                                ></follow-input>
                                             </div>
                                             </div>
-                                            <input v-model="item.text" 
-                                                placeholder="Enter discord invite link"
-                                                class="discord-address" 
-                                                @input="onIptDiscordAddress($event, index)"
-                                                @blur="onBlurDiscordAddress($event, index)" />
+                                            <!-- join discord -->
+                                            <div
+                                                class="control"
+                                                v-if="item.nodeType == 'input'"
+                                            >
+                                                <div v-if="showDiscordInvitePop" 
+                                                    class="discord-invite-info"
+                                                    @click="showDiscordInvitePop = false">
+                                                    <img class="icon" :src="discordInviteInfo.icon || require('@/assets/svg/icon-discord-mini.svg')" />
+                                                    <span class="name">{{discordInviteInfo.name}}</span>
+                                                </div>
+                                                <input v-model="item.text" 
+                                                    placeholder="Enter discord invite link"
+                                                    class="discord-address" 
+                                                    @input="onIptDiscordAddress($event, index)"
+                                                    @blur="onBlurDiscordAddress($event, index)" />
+                                            </div>
+                                        </div>
+                                        
+                                        <div>
+                                            <el-switch
+                                                v-if="item.type > 3"
+                                                v-model="item.checked"
+                                                @change="formSwitchChange($event, item, index)"
+                                            />
+                                            <!-- <img src="@/assets/svg/icon-task-close.svg" 
+                                                class="icon-task-close"
+                                                @click="hideTask(item, index)"> -->
                                         </div>
                                         </div>
+                                        <!-- 
+                                            v-if="item.type == 2 || item.type == 3 || item.type == 7 || item.type == 8 || item.type == 9"
+
+                                            <img
+                                            v-if="item.type == 3"
+                                            :src="
+                                                require('@/assets/svg/icon-option-checked.svg')
+                                            "
+                                        /> -->
                                     </div>
                                     </div>
-                                    <el-switch
-                                        v-if="item.type == 2 || item.type == 7"
-                                        v-model="item.checked"
-                                        @change="formSwitchChange($event, item, index)"
-                                    />
-                                    <img
-                                        v-if="item.type == 3"
-                                        :src="
-                                            require('@/assets/svg/icon-option-checked.svg')
-                                        "
-                                    />
                                 </div>
                                 </div>
                             </div>
                             </div>
                             <!-- 机器人 -->
                             <!-- 机器人 -->
@@ -412,7 +445,7 @@ import { getFrontConfig } from "@/http/account";
 import {setChromeStorage, getChromeStorage} from "@/uilts/chromeExtension"
 import {setChromeStorage, getChromeStorage} from "@/uilts/chromeExtension"
 import { debounce, getBit } from "@/uilts/help"
 import { debounce, getBit } from "@/uilts/help"
 import Report from "@/log-center/log"
 import Report from "@/log-center/log"
-import { ElMessage, ElLoading } from "element-plus";
+import { ElMessage, ElLoading, ElDropdown, ElDropdownMenu, ElDropdownItem } from "element-plus";
 import "element-plus/es/components/message/style/css";
 import "element-plus/es/components/message/style/css";
 
 
 import {create, all} from "mathjs";
 import {create, all} from "mathjs";
@@ -547,25 +580,45 @@ let iptErrType = ''; //discord
 let formList = reactive([
 let formList = reactive([
     {
     {
         label: "Follow",
         label: "Follow",
-        icon: require("@/assets/svg/icon-follow.svg"),
+        icon: require("@/assets/svg/icon-task-twitter.svg"),
         nodeType: "textarea",
         nodeType: "textarea",
         type: 1,
         type: 1,
         text: [],
         text: [],
         checked: true,
         checked: true,
+        show: true
     },
     },
     {
     {
-        label: "Retweet",
-        icon: require("@/assets/svg/icon-retweet.svg"),
+        label: "Retweet & Like",
+        icon: require("@/assets/svg/icon-task-twitter.svg"),
         nodeType: "div",
         nodeType: "div",
         type: 3,
         type: 3,
         checked: true,
         checked: true,
+        show: true
     },
     },
     {
     {
         label: "Like Tweet",
         label: "Like Tweet",
-        icon: require("@/assets/svg/icon-like.svg"),
+        icon: require("@/assets/svg/icon-task-twitter.svg"),
         nodeType: "div",
         nodeType: "div",
         type: 2,
         type: 2,
         checked: true,
         checked: true,
+        show: false
+    },
+    {
+        label: "Comment and Tag 3 friends",
+        icon: require("@/assets/svg/icon-task-twitter.svg"),
+        nodeType: "div",
+        type: 9,
+        checked: true,
+        show: true
+    },
+    {
+        label: "Repost to Facebook",
+        icon: require("@/assets/svg/icon-task-facebook.svg"),
+        nodeType: "div",
+        text: '',
+        type: 8,
+        checked: true,
+        show: true
     },
     },
     {
     {
         label: "Join Discord",
         label: "Join Discord",
@@ -574,6 +627,7 @@ let formList = reactive([
         text: '',
         text: '',
         type: 7,
         type: 7,
         checked: true,
         checked: true,
+        show: true
     },
     },
 ]);
 ]);
 
 
@@ -861,15 +915,14 @@ const submitRequest = async () => {
     let { amountValue = 0, totalCount = 0 } = baseFormData;
     let { amountValue = 0, totalCount = 0 } = baseFormData;
     baseFormData.amountCurrencyCode = currentCurrencyInfo.value.currencyCode;
     baseFormData.amountCurrencyCode = currentCurrencyInfo.value.currencyCode;
     // 组装提交参数
     // 组装提交参数
-    formList[0]["text"] = atUserList.value;
 
 
     let finishConditions = [];
     let finishConditions = [];
     for (let i = 0; i < formList.length; i++) {
     for (let i = 0; i < formList.length; i++) {
         let item = {};
         let item = {};
         item.type = formList[i]["type"];
         item.type = formList[i]["type"];
-        if (item.type == 1 && formList[i]["text"]) {
+        if (item.type == 1 && atUserList.value.length) {
             // follow 参数
             // follow 参数
-            let relatedUsers = formList[i]["text"];
+            let relatedUsers = atUserList.value;
             item.relatedUsers = relatedUsers;
             item.relatedUsers = relatedUsers;
             finishConditions.push(item);
             finishConditions.push(item);
         } else  if (formList[i]["type"] == 7) {
         } else  if (formList[i]["type"] == 7) {
@@ -879,6 +932,7 @@ const submitRequest = async () => {
                 finishConditions.push(item);
                 finishConditions.push(item);
             }
             }
         } else  if (formList[i]["checked"]) {
         } else  if (formList[i]["checked"]) {
+            // 其余任务
             finishConditions.push(item);
             finishConditions.push(item);
         }
         }
     }
     }
@@ -942,7 +996,6 @@ const initParams = () => {
     resetFormIpt();
     resetFormIpt();
 
 
     // clear follow value
     // clear follow value
-    formList[0].text = [];
     atUserList.value = [];
     atUserList.value = [];
 
 
     submitIng.value = false;
     submitIng.value = false;
@@ -954,11 +1007,16 @@ const initParams = () => {
     currentCurrencyInfo.value = {};
     currentCurrencyInfo.value = {};
 
 
     // clear discord value
     // clear discord value
-    formList[3].text = '';
+    setDiscordIptTxt({text: ''});
 
 
     discordInviteInfo.value = {};
     discordInviteInfo.value = {};
 };
 };
 
 
+const setDiscordIptTxt = ({text}) => {
+    const index = formList.findIndex(item => item.type == 7);
+    formList[index]['text'] = text;
+}
+
 /**
 /**
  * 支付完成回调
  * 支付完成回调
  */
  */
@@ -1149,21 +1207,37 @@ const onIptSetErrorTxt = (params = {}) => {
  * 监听开关触发事件
  * 监听开关触发事件
  */
  */
 const formSwitchChange = (val, params, index) => {
 const formSwitchChange = (val, params, index) => {
-    console.log('formSwitchChange')
-    if(!val) {
-        if(params.type == 7) {
+    closeDiscordTask(val, params, index);
+}
+
+
+const hideTask = (params, index) => {
+    formList[index]['checked'] = false;
+    formList[index]['show'] = false;
+    closeDiscordTask(false, {type: 7}, index)
+}
+
+const clickDropdown = (params, index) => {
+    formList[index]['show'] = true;
+    formList[index]['checked'] = true;
+}
+
+const closeDiscordTask = (val, params, index) => {
+    if(params.type == 7) {
+        if(!val) {
             //错误类型 discord 清空discord错误校验
             //错误类型 discord 清空discord错误校验
             if(iptErrType == 'discord') {
             if(iptErrType == 'discord') {
                 iptErrMsgTxt.value = '';
                 iptErrMsgTxt.value = '';
                 formList[index]['text'] = '';
                 formList[index]['text'] = '';
                 onIptSetErrorTxt();
                 onIptSetErrorTxt();
             }
             }
+        } else {
+            onIptSetErrorTxt();
         }
         }
-    } else {
-        onIptSetErrorTxt();
     }
     }
 }
 }
 
 
+
 /** 监听 discord 输入 */
 /** 监听 discord 输入 */
 const onIptDiscordAddress = (e, index) => {
 const onIptDiscordAddress = (e, index) => {
     let val = formList[index].text;
     let val = formList[index].text;
@@ -1172,6 +1246,8 @@ const onIptDiscordAddress = (e, index) => {
         checked = true;
         checked = true;
         formList[index].checked = checked;
         formList[index].checked = checked;
         formList[index].text = formList[index].text.replace(/\s/g,'');
         formList[index].text = formList[index].text.replace(/\s/g,'');
+    } else if(!val){
+        discordInviteInfo.value = {};
     }
     }
     onIptDiscordDebounce()
     onIptDiscordDebounce()
 }
 }
@@ -1764,6 +1840,13 @@ onMounted(() => {
                         margin-bottom: 10px;
                         margin-bottom: 10px;
                         font-weight: 500;
                         font-weight: 500;
                         font-size: 14px;
                         font-size: 14px;
+                        display: flex;
+                        align-items: center;
+                        justify-content: space-between;
+
+                        .icon-add-task {
+                            cursor: pointer;
+                        }
                     }
                     }
 
 
                     .form-require {
                     .form-require {
@@ -1799,7 +1882,7 @@ onMounted(() => {
                             }
                             }
 
 
                             .control {
                             .control {
-                                min-width: 280px;
+                                min-width: 258px;
                                 margin-left: 18px;
                                 margin-left: 18px;
                                 box-sizing: border-box;
                                 box-sizing: border-box;
                                 border-left: 1px solid #ECECEC;
                                 border-left: 1px solid #ECECEC;
@@ -1851,8 +1934,13 @@ onMounted(() => {
                                     }
                                     }
                                 }
                                 }
                             }
                             }
+
+                            .icon-task-close {
+                                margin-left: 6px;
+                                cursor: pointer;
+                            }
                         }
                         }
-                        .form-item:last-child {
+                        .border-hide {
                             border-bottom: none !important;
                             border-bottom: none !important;
                         }
                         }
                     }
                     }

+ 441 - 120
src/view/iframe/red-packet/red-packet.vue

@@ -23,11 +23,12 @@
       </div>
       </div>
 
 
       <div class="list">
       <div class="list">
-        <div class="item" v-for="item, i in state.detail.taskCondition" v-bind:key="i">
-          <template v-if="item.type == 1 && item.relatedUsers && item.relatedUsers.length > 0">
+        <template v-for="item, i in state.detail.taskCondition" v-bind:key="i">
+          <div class="item" v-if="item.type == 1 && item.relatedUsers && item.relatedUsers.length > 0">
             <div class="item-content">
             <div class="item-content">
               <div class="item-follow-title">
               <div class="item-follow-title">
-                <img :src="require('@/assets/svg/icon-follow.svg')" alt />
+                <img :src="require('@/assets/svg/icon-task-twitter.svg')" alt />
+                <!-- <img :src="require('@/assets/svg/icon-follow.svg')" alt /> -->
                 <div class="item-title">Follow</div>
                 <div class="item-title">Follow</div>
                 <img :src="require('@/assets/gif/red-right.gif')" alt class="red-right"
                 <img :src="require('@/assets/gif/red-right.gif')" alt class="red-right"
                   v-show="!state.done.follow && state.done.follow_red" />
                   v-show="!state.done.follow && state.done.follow_red" />
@@ -40,16 +41,17 @@
                     <span :class="{ finished: item2.finished }">@{{ item2.name }}</span>
                     <span :class="{ finished: item2.finished }">@{{ item2.name }}</span>
                     <img :src="require('@/assets/svg/icon-true-ed.svg')" alt />
                     <img :src="require('@/assets/svg/icon-true-ed.svg')" alt />
                   </div>
                   </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>
                     <span :class="{ finished: item2.finished }">@{{ item2.name }}</span>
                     <img :src="require('@/assets/svg/icon-add.svg')" alt />
                     <img :src="require('@/assets/svg/icon-add.svg')" alt />
                   </div>
                   </div>
                 </template>
                 </template>
               </div>
               </div>
             </div>
             </div>
-          </template>
-          <template v-if="item.type == 2">
-            <img :src="require('@/assets/svg/icon-like.svg')" alt />
+          </div>
+          <div class="item" v-if="item.type == 2">
+            <img :src="require('@/assets/svg/icon-task-twitter.svg')" alt />
+            <!-- <img :src="require('@/assets/svg/icon-like.svg')" alt /> -->
             <div class="item-content">
             <div class="item-content">
               <div class="item-title">Like</div>
               <div class="item-title">Like</div>
             </div>
             </div>
@@ -57,9 +59,10 @@
               v-show="!state.done.like && state.done.like_red" />
               v-show="!state.done.like && state.done.like_red" />
             <img v-if="state.done.like" :src="require('@/assets/svg/icon-true.svg')" alt />
             <img v-if="state.done.like" :src="require('@/assets/svg/icon-true.svg')" alt />
             <div v-else class="btn" @click="clickLikeBtn">Like</div>
             <div v-else class="btn" @click="clickLikeBtn">Like</div>
-          </template>
-          <template v-if="item.type == 3">
-            <img :src="require('@/assets/svg/icon-retweet.svg')" alt />
+          </div>
+          <div class="item" v-if="item.type == 3">
+            <img :src="require('@/assets/svg/icon-task-twitter.svg')" alt />
+            <!-- <img :src="require('@/assets/svg/icon-retweet.svg')" alt /> -->
             <div class="item-content">
             <div class="item-content">
               <div class="item-title">Retweet</div>
               <div class="item-title">Retweet</div>
             </div>
             </div>
@@ -67,8 +70,31 @@
               v-show="!state.done.retweet && state.done.retweet_red" />
               v-show="!state.done.retweet && state.done.retweet_red" />
             <img v-if="state.done.retweet" :src="require('@/assets/svg/icon-true.svg')" alt />
             <img v-if="state.done.retweet" :src="require('@/assets/svg/icon-true.svg')" alt />
             <div v-else class="btn" @click="clickRetweetBtn">Retweet</div>
             <div v-else class="btn" @click="clickRetweetBtn">Retweet</div>
-          </template>
-          <template v-if="item.type == 7">
+          </div>
+          <!-- Comment、艾特 friends -->
+          <div class="item" v-if="item.type == 9">
+            <img :src="require('@/assets/svg/icon-task-twitter.svg')" alt />
+            <div class="item-content">
+              <div class="item-title">Comment and Tag 3 friends</div>
+            </div>
+            <img :src="require('@/assets/gif/red-right.gif')" alt class="red-right"
+              v-show="!state.done.reply && state.done.reply_red" />
+            <img v-if="state.done.reply" :src="require('@/assets/svg/icon-true.svg')" alt />
+            <div v-else class="btn" @click="clickReply(item)">Comment</div>
+          </div>
+          <!-- repost feacebook -->
+          <div class="item" v-if="item.type == 8">
+            <img :src="require('@/assets/svg/icon-task-facebook.svg')" alt />
+            <div class="item-content">
+              <div class="item-title">Repost to Facebook</div>
+            </div>
+            <img :src="require('@/assets/gif/red-right.gif')" alt class="red-right"
+              v-show="!state.done.repost_facebook && state.done.repost_facebook_red" />
+            <img v-if="state.done.repost_facebook" :src="require('@/assets/svg/icon-true.svg')" alt />
+            <div v-else class="btn" @click="clickRepostFacebook(item)">Repost</div>
+          </div>
+          <!-- join discord  -->
+          <div class="item" v-if="item.type == 7">
             <img :src="require('@/assets/svg/icon-discord-mini.svg')" alt />
             <img :src="require('@/assets/svg/icon-discord-mini.svg')" alt />
             <div class="item-content">
             <div class="item-content">
               <div class="item-title">Join Discord</div>
               <div class="item-title">Join Discord</div>
@@ -84,8 +110,8 @@
                 Join
                 Join
               </div>
               </div>
             </template>
             </template>
-          </template>
-        </div>
+          </div>
+        </template>
       </div>
       </div>
       <!-- <div class="people" @click="clickRoad">
       <!-- <div class="people" @click="clickRoad">
         <div class="txt">
         <div class="txt">
@@ -155,8 +181,7 @@
           <div class="luck-content">
           <div class="luck-content">
             <div class="luck-title" v-if="item.simpleUserInfoVO.nickName">{{ item.simpleUserInfoVO.nickName }}</div>
             <div class="luck-title" v-if="item.simpleUserInfoVO.nickName">{{ item.simpleUserInfoVO.nickName }}</div>
             <div class="luck-title" v-else>Twitter User</div>
             <div class="luck-title" v-else>Twitter User</div>
-
-            <div class="luck-time">{{ moment(item.receiveTimestamp).format('MM-DD HH:mm:ss') }}</div>
+            <div class="luck-time">{{ moment(item.receiveTimestamp).format('MM-DD HH:mm') }}</div>
           </div>
           </div>
           <div class="luck-money">
           <div class="luck-money">
             <img :src="state.detail.currencyIconPath" alt />
             <img :src="state.detail.currencyIconPath" alt />
@@ -345,11 +370,12 @@ import { getQueryString, guid, getBit } from '@/uilts/help.js'
 import { message } from 'ant-design-vue';
 import { message } from 'ant-design-vue';
 import FontAmount from '@/view/components/font-amount.vue'
 import FontAmount from '@/view/components/font-amount.vue'
 import GetMore from '@/view/iframe/publish/components/get-more.vue'
 import GetMore from '@/view/iframe/publish/components/get-more.vue'
-import { getChromeStorage } from '@/uilts/chromeExtension.js'
+import { setChromeStorage, getChromeStorage } from '@/uilts/chromeExtension.js'
 import Report from "@/log-center/log"
 import Report from "@/log-center/log"
 import { srcPublishSuccess } from '@/http/publishApi'
 import { srcPublishSuccess } from '@/http/publishApi'
 import { discordAuthUrl, checkGuildJoined } from '@/http/discordApi'
 import { discordAuthUrl, checkGuildJoined } from '@/http/discordApi'
-import { discordAuthRedirectUri } from '@/http/configAPI'
+import { discordAuthRedirectUri, faceShareRedirectUrl } from '@/http/configAPI'
+import { getFrontConfig } from "@/http/account";
 import GlobalTip from '@/view/components/global-tip.vue'
 import GlobalTip from '@/view/components/global-tip.vue'
 
 
 var moment = require('moment');
 var moment = require('moment');
@@ -358,9 +384,14 @@ let discordAuthorizeRequired = false;
 let joinDiscordActionState = 'default'; //authAndJoinIng  joinIng  reAuth
 let joinDiscordActionState = 'default'; //authAndJoinIng  joinIng  reAuth
 let joinDiscordIng = ref(false);
 let joinDiscordIng = ref(false);
 
 
+let facebookAppConfig = {
+  facebookAppId: "",
+  faceShareRedirectUrl
+};
+
 let state = reactive({
 let state = reactive({
   status: '',
   status: '',
-  loading_show: false,
+  loading_show: true,
   detail: {},
   detail: {},
   luck_list_end: false,
   luck_list_end: false,
   page_index: 1,
   page_index: 1,
@@ -374,9 +405,14 @@ let state = reactive({
     follow: false,
     follow: false,
     like: false,
     like: false,
     retweet: false,
     retweet: false,
-    join_discord: false
+    join_discord: false,
+    repost_facebook: false,
+    reply: false
   }
   }
 })
 })
+
+let fullName = '';
+
 function clickRetry() {
 function clickRetry() {
   init()
   init()
 }
 }
@@ -388,35 +424,52 @@ async function clickLikeBtn() {
   if (!_userInfo) {
   if (!_userInfo) {
     return
     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.detail.finishTaskTypeV2 = state.detail.finishTaskTypeV2.toString() || ''
+  if (state.window_origin.indexOf('facebook.com') >= 0) {
+    state.detail.finishTaskTypeV2 = '2'
   }
   }
-  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 {
+  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
+        }
+      }).catch(()=>{
+        state.loading_show = false
+      })
+      break
+    case '2':
       window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
       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({
   Report.reportLog({
     objectType: Report.objectType.like,
     objectType: Report.objectType.like,
@@ -476,29 +529,53 @@ async function clickRetweetBtn() {
   if (!_userInfo) {
   if (!_userInfo) {
     return
     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() || ''
+  if (state.window_origin.indexOf('facebook.com') >= 0) {
+    state.detail.finishTaskTypeV2 = '2'
   }
   }
-  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
-    }
-  })
+  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
+        }
+      }).catch(()=>{
+        state.loading_show = 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;
+  }
+
   // 埋点
   // 埋点
   Report.reportLog({
   Report.reportLog({
     objectType: Report.objectType.retweet,
     objectType: Report.objectType.retweet,
@@ -507,6 +584,106 @@ async function clickRetweetBtn() {
   });
   });
 }
 }
 
 
+function onTweetReplyClick(params) {
+  let replyData = {
+    postId: state.postId,
+    type: params.type,
+    taskLuckdropId: state.detail.taskLuckdropId
+  }
+
+  window.parent.postMessage({ actionType: "IFRAME_RED_PACKET_ON_TWEET_REPLY_CLICK", data: replyData }, "*");
+}
+
+async function clickReply(params) {
+  let _userInfo = await checkIsLogin()
+  if (!_userInfo) {
+    return
+  }
+
+  let replyData = {
+    postId: state.postId,
+    type: params.type,
+    taskLuckdropId: state.detail.taskLuckdropId
+  }
+  if (state.window_origin.indexOf('facebook.com') > -1) {
+    let url = `https://twitter.com/${state.tweet_author}/status/${state.tweetId}?actionType=denetFacebookToTwitterReply&deReplyParams=${JSON.stringify(replyData)}`
+    window.open(url)
+  } else {
+    window.parent.postMessage({ actionType: "IFRAME_RED_PACKET_REPLY_CLICK", data: replyData }, "*");
+  }
+}
+
+/**
+ * 点击repost facebook
+ */
+async function clickRepostFacebook(params) {
+  let _userInfo = await checkIsLogin()
+  if (!_userInfo) {
+    return
+  }
+
+  let deUrlParams = {
+    fullName,
+    tweetId: state.tweetId
+  }
+  let href = `${state.postRedirectUrl}?deUrlParams=${JSON.stringify(deUrlParams)}`;
+  console.log(href);
+  let shareUrlparams = {
+    href,
+    type: params.type,
+    taskLuckdropId: state.detail.taskLuckdropId
+  }
+
+  setChromeStorage({
+    shareFacebookData: JSON.stringify({
+      contentStr: state.srcContent
+    })
+  })
+
+  let shareUrl = feacebookShareUrl(shareUrlparams);
+  openShareFacebookWindow({ url: shareUrl });
+}
+
+/**
+ * 分享到facebook
+ */
+function openShareFacebookWindow({ url }) {
+  const width = 800;
+  chrome.windows.create({
+    width,
+    type: 'normal',
+    url
+  }, function (window) {
+
+  })
+}
+
+/**
+ * 分享fecebook 地址
+ */
+function feacebookShareUrl(params = {}) {
+  let { href = '', type = '', taskLuckdropId } = params;
+  let cbParams = JSON.stringify({
+    type,
+    taskLuckdropId
+  })
+  let shareUrl = `https://www.facebook.com/dialog/share?app_id=${facebookAppConfig.facebookAppId}&display=popup&href=${href}&redirect_uri=${facebookAppConfig.faceShareRedirectUrl}?params=${cbParams}`;
+
+  return shareUrl;
+}
+
+/**
+ * 分享成功
+ */
+function facebookShareSuccess(params) {
+  let { taskLuckdropId } = params;
+
+  if (taskLuckdropId == state.detail.taskLuckdropId) {
+    state.done.repost_facebook = true;
+    state.done.repost_facebook_red = false;
+  }
+}
+
 
 
 function getValidity() {
 function getValidity() {
   let _d1, _d2, _d3, _h, _m, _s
   let _d1, _d2, _d3, _h, _m, _s
@@ -540,14 +717,14 @@ function getValidity() {
 }
 }
 
 
 const openFollowTabs = (arr_name) => {
 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 array_finish = state.detail.taskCondition[0].relatedUsers.filter((item) => { return item.finished == false })
   let url
   let url
   if (array_finish.length > 0) {
   if (array_finish.length > 0) {
     state.done.follow = false
     state.done.follow = false
     // 打开标签页的方法
     // 打开标签页的方法
     array_finish.forEach((item) => {
     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) => {
       chrome.tabs.create({ url }, (tab) => {
         if (follow_open_tabs.filter((item) => { return item.url == tab.url }).length == 0) {
         if (follow_open_tabs.filter((item) => { return item.url == tab.url }).length == 0) {
           follow_open_tabs.push(tab)
           follow_open_tabs.push(tab)
@@ -565,32 +742,67 @@ async function clickFollowAll(item, is_all) {
   let arr_name = []
   let arr_name = []
   for (let i in item) {
   for (let i in item) {
     if (!item[i].finished) {
     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.detail.finishTaskTypeV2 = state.detail.finishTaskTypeV2.toString() || ''
+  if (state.window_origin.indexOf('facebook.com') >= 0) {
+    state.detail.finishTaskTypeV2 = '2'
   }
   }
-  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
-          }
-        });
+  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)
+        }
+      }).catch(()=>{
+        state.loading_show = false
       })
       })
+      break
+    case '2':
       openFollowTabs(arr_name)
       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 = {
   let _log_obj = {
     pageSource: Report.pageSource.task_page,
     pageSource: Report.pageSource.task_page,
@@ -618,17 +830,13 @@ const reSetBindTwtterId = (_params) => {
           Report.reportLog({
           Report.reportLog({
             objectType: Report.objectType.tweetPostBinded
             objectType: Report.objectType.tweetPostBinded
           });
           });
-          init()
+          init({ from: 'reSetBindTwtterId' })
         }
         }
       })
       })
     }
     }
   })
   })
 }
 }
 
 
-function showLastTwoPlace(n) {
-  return n
-}
-
 const showCloseEndTimePage = () => {
 const showCloseEndTimePage = () => {
   state.status = 'close'
   state.status = 'close'
   state.close_status = '红包过期了'
   state.close_status = '红包过期了'
@@ -647,11 +855,8 @@ const showSuccessPage = () => {
   state.status = 'success'
   state.status = 'success'
   // 埋点
   // 埋点
   Report.reportLog({
   Report.reportLog({
-    pageSource: Report.pageSource.task_page,
+    pageSource: Report.pageSource.received_success_page,
     businessType: Report.businessType.pageView,
     businessType: Report.businessType.pageView,
-    objectType: Report.objectType.get_giveaway
-  }, {
-    get_giveaway_result: Report.extParams.success
   });
   });
 }
 }
 const showNotOpenPage = () => {
 const showNotOpenPage = () => {
@@ -785,9 +990,22 @@ const handleStatusPage = () => {
 
 
 }
 }
 
 
-function init() {
+function setFrontConfig() {
+  getFrontConfig({
+    params: {},
+  }).then((res) => {
+    if (res.code == 0) {
+      facebookAppConfig.facebookAppId = res.data.fbClientId;
+    }
+  });
+};
+
+function init(initParams) {
+  let { type } = initParams || {};
   onRuntimeMsg();
   onRuntimeMsg();
   onPageVisbile();
   onPageVisbile();
+  onWindowMessage();
+  setFrontConfig();
   getPostDetail({
   getPostDetail({
     params: {
     params: {
       postId: state.postId
       postId: state.postId
@@ -799,16 +1017,21 @@ function init() {
     // 如果金额是0
     // 如果金额是0
     //    显示没有领到钱
     //    显示没有领到钱
     if (res.code == 0) {
     if (res.code == 0) {
+      state.srcContent = res.data.srcContent;
+      state.postRedirectUrl = res.data.postRedirectUrl;
+
       // 判断推特id,绑定逻辑
       // 判断推特id,绑定逻辑
       state.srcContentId = res.data.srcContentId
       state.srcContentId = res.data.srcContentId
+
       if (!state.srcContentId) {
       if (!state.srcContentId) {
         reSetBindTwtterId(res.data)
         reSetBindTwtterId(res.data)
         return
         return
       }
       }
       state.detail = JSON.parse(res.data.postBizData)
       state.detail = JSON.parse(res.data.postBizData)
       state.detail.taskCondition = state.detail.taskCondition || []
       state.detail.taskCondition = state.detail.taskCondition || []
-      console.log(state.detail)
-
+      // 不要删除这个console
+      console.log('postBizData',state.detail)
+      checkFacebookReply();
       handleStatusPage()
       handleStatusPage()
     } else {
     } else {
       handleErrorCode(res)
       handleErrorCode(res)
@@ -842,6 +1065,15 @@ function initTaskDetail() {
                 state.done.join_discord = res.data[i].finished
                 state.done.join_discord = res.data[i].finished
                 discordAuthorizeRequired = res.data[i].discordAuthorizeRequired
                 discordAuthorizeRequired = res.data[i].discordAuthorizeRequired
                 break
                 break
+              case 8:
+                state.done.repost_facebook = res.data[i].finished;
+                break;
+              case 9:
+                state.done.reply = res.data[i].finished;
+                if (!state.done.reply) {
+                  onTweetReplyClick({ type: 9 });
+                }
+                break;
             }
             }
           }
           }
         } else {
         } else {
@@ -854,6 +1086,7 @@ function initTaskDetail() {
 
 
 let tab_index = 0
 let tab_index = 0
 const doTaskReport = (req, sender) => {
 const doTaskReport = (req, sender) => {
+  state.loading_show = false
   let follow_name = req.task_data.follow_name || ''
   let follow_name = req.task_data.follow_name || ''
   // 1 Twitter follow Twitter ScreenName
   // 1 Twitter follow Twitter ScreenName
   // 2 Tweet like
   // 2 Tweet like
@@ -863,16 +1096,20 @@ const doTaskReport = (req, sender) => {
     case 'retweet':
     case 'retweet':
       event_type = 3
       event_type = 3
       state.done.retweet = req.task_done
       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;
       break;
     case 'like':
     case 'like':
       event_type = 2
       event_type = 2
       state.done.like = req.task_done
       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
       break
     case 'follow':
     case 'follow':
       event_type = 1
       event_type = 1
-      chrome.tabs.remove(sender.tab.id)
       // for (let i = 0; i < follow_open_tabs.length; i++) {
       // for (let i = 0; i < follow_open_tabs.length; i++) {
       //   if (follow_open_tabs[i].id == sender.tab.id) {
       //   if (follow_open_tabs[i].id == sender.tab.id) {
       //     follow_open_tabs.splice(i, 1)
       //     follow_open_tabs.splice(i, 1)
@@ -901,9 +1138,13 @@ const doTaskReport = (req, sender) => {
       if (!has_no_finished) {
       if (!has_no_finished) {
         state.done.follow = true
         state.done.follow = true
         state.done.follow_red = false
         state.done.follow_red = false
+        openFollowTabs(state.detail.taskCondition[0].relatedUsers)
       }
       }
       break
       break
   }
   }
+  if (req.do_type != 'api') {
+    chrome.tabs.remove(sender.tab.id)
+  }
   if (req.task_done) {
   if (req.task_done) {
     addFinishEvent({
     addFinishEvent({
       params: {
       params: {
@@ -919,20 +1160,42 @@ onMounted(() => {
   state.process_mode = process.env.NODE_ENV
   state.process_mode = process.env.NODE_ENV
   state.postId = getQueryString('postId')
   state.postId = getQueryString('postId')
   state.tweetId = getQueryString('tweetId')
   state.tweetId = getQueryString('tweetId')
+  state.tweet_author = getQueryString('tweet_author');
+  state.window_origin = getQueryString('window_origin');
+
+  getTweetAuthor();
+
   init()
   init()
   // state.loading_show = true
   // state.loading_show = true
   // state.status = 'opened'
   // state.status = 'opened'
   // state.close_status = '没有领到钱'
   // state.close_status = '没有领到钱'
 })
 })
 
 
+function getTweetAuthor() {
+  if (state.window_origin.indexOf('twitter.com') > -1) {
+    window.parent.postMessage({
+      actionType: "IFRAME_RED_PACKET_GET_TWEET_AUTHOR", data: {
+        postId: state.postId,
+        taskLuckdropId: state.detail.taskLuckdropId
+      }
+    }, "*");
+  }
+}
+
+function checkFacebookReply() {
+  console.log('checkFacebookReply')
+  if (state.window_origin.indexOf('twitter.com') > -1) {
+    window.parent.postMessage({
+      actionType: "IFRAME_RED_PACKET_CHECK_FACEBOOK_REPLY", data: {
+        postId: state.postId
+      }
+    }, "*");
+  }
+}
 
 
 // 点击领取
 // 点击领取
 function clickOpenRedPacket() {
 function clickOpenRedPacket() {
-  chrome.runtime.sendMessage({
-    actionType: 'CONTENT_GET_PINED'
-  }, res => {
-    console.log(res);
-  })
+  callEventPageMethod('CONTENT_GET_PINED', {})
   handleRedPacket()
   handleRedPacket()
 }
 }
 
 
@@ -950,6 +1213,8 @@ function handleRedPacket() {
     } else {
     } else {
       handleErrorCode(res)
       handleErrorCode(res)
     }
     }
+  }).catch(()=>{
+    state.loading_show = false
   })
   })
   // 埋点
   // 埋点
   Report.reportLog({
   Report.reportLog({
@@ -1059,6 +1324,7 @@ function handleFinishRedPacket() {
               }
               }
               break
               break
             case '7':
             case '7':
+              //join discord
               discordAuthorizeRequired = _data[i].discordAuthorizeRequired;
               discordAuthorizeRequired = _data[i].discordAuthorizeRequired;
               if (_data[i].finished) {
               if (_data[i].finished) {
                 state.done.join_discord = true
                 state.done.join_discord = true
@@ -1068,6 +1334,26 @@ function handleFinishRedPacket() {
                 state.done.join_discord_red = true
                 state.done.join_discord_red = true
               }
               }
               break
               break
+            case '8':
+              //repost feacebook
+              if (_data[i].finished) {
+                state.done.repost_facebook = true
+                state.done.repost_facebook_red = false
+              } else {
+                state.done.repost_facebook = false;
+                state.done.repost_facebook_red = true
+              }
+              break
+            case '9':
+              //reply
+              if (_data[i].finished) {
+                state.done.reply = true
+                state.done.reply_red = false
+              } else {
+                state.done.reply = false;
+                state.done.reply_red = true
+              }
+              break
           }
           }
         }
         }
         // 埋点
         // 埋点
@@ -1093,6 +1379,8 @@ function handleFinishRedPacket() {
       });
       });
       handleErrorCode(res)
       handleErrorCode(res)
     }
     }
+  }).catch(()=>{
+    state.loading_show = false
   })
   })
 }
 }
 
 
@@ -1244,6 +1532,24 @@ function handleErrorCode(res) {
 //     businessType: Report.businessType.pageView
 //     businessType: Report.businessType.pageView
 //   });
 //   });
 // }
 // }
+function onWindowMessage() {
+  window.addEventListener("message", function (event) {
+    if (event.data) {
+      switch (event.data.actionType) {
+        case 'CONTENT_RED_PACKET_REPLY_RASK_FINSH':
+          state.done.reply = true;
+          state.done.reply_red = false;
+          break;
+        case 'CONTENT_RED_PACKET_GET_TWEET_AUTHOR':
+          fullName = event.data.data.fullName
+          break;
+        case 'CONTENT_RED_PACKET_FACEBOOK_REPLY':
+          clickReply(event.data.data)
+          break;
+      }
+    }
+  });
+}
 
 
 function onPageVisbile() {
 function onPageVisbile() {
   document.addEventListener('visibilitychange', function () {
   document.addEventListener('visibilitychange', function () {
@@ -1262,12 +1568,22 @@ function onRuntimeMsg() {
       case 'BACK_DISCORD_LOGIN_SUCCESS':
       case 'BACK_DISCORD_LOGIN_SUCCESS':
         discordLoginSuccess();
         discordLoginSuccess();
         break;
         break;
+      case 'BG_FACEBOOK_SHARE_SUCCESS':
+        facebookShareSuccess(req.data);
+        break;
       case 'DO_TASK':
       case 'DO_TASK':
         if (!req.task_type || state.tweetId != req.tweet_Id) {
         if (!req.task_type || state.tweetId != req.tweet_Id) {
           return
           return
         }
         }
         state.loading_show = false
         state.loading_show = false
-        doTaskReport(req, sender)
+        doTaskReport(req, sender);
+        break;
+      case 'CONTENT_RED_PACKET_REPLY_RASK_FINSH':
+        if(req.data && req.data.postId == state.postId) {
+          state.done.reply = true;
+          state.done.reply_red = false;
+        }
+        break;
     }
     }
   })
   })
 }
 }
@@ -1656,6 +1972,8 @@ body {
           width: 40px;
           width: 40px;
           height: 40px;
           height: 40px;
           margin-right: 9px;
           margin-right: 9px;
+          border-radius: 50%;
+          border: solid 2px #fff;
         }
         }
 
 
         .big {
         .big {
@@ -1692,6 +2010,7 @@ body {
       display: flex;
       display: flex;
       justify-content: space-between;
       justify-content: space-between;
       color: #B0B0B0;
       color: #B0B0B0;
+      font-weight: 500;
       border-bottom: 1px solid #F2F2F2;
       border-bottom: 1px solid #F2F2F2;
 
 
       div:last-child {
       div:last-child {
@@ -1717,7 +2036,7 @@ body {
         text-align: center;
         text-align: center;
 
 
         img {
         img {
-          margin-top: 90px;
+          margin-top: 70px;
           width: 100px;
           width: 100px;
           height: 100px;
           height: 100px;
         }
         }
@@ -1768,18 +2087,18 @@ body {
           flex: auto;
           flex: auto;
 
 
           .luck-title {
           .luck-title {
+            color: #444444;
             font-weight: 500;
             font-weight: 500;
             font-size: 16px;
             font-size: 16px;
             letter-spacing: 0.3px;
             letter-spacing: 0.3px;
-            color: #444444;
+            margin-bottom: 5px;
           }
           }
 
 
           .luck-time {
           .luck-time {
             font-weight: 400;
             font-weight: 400;
             font-size: 12px;
             font-size: 12px;
             line-height: 14px;
             line-height: 14px;
-
-            color: #9b9b9b;
+            color: #B0B0B0;
           }
           }
         }
         }
 
 
@@ -1818,8 +2137,7 @@ body {
   .success {
   .success {
     .luck-list-title {
     .luck-list-title {
       margin-top: 17px;
       margin-top: 17px;
-      margin-bottom: 11px;
-      border-bottom: 1px solid #D1D1D1;
+      border-bottom: 1px solid #ECECEC;
     }
     }
   }
   }
 
 
@@ -1866,6 +2184,7 @@ body {
     }
     }
 
 
     .list {
     .list {
+      overflow-y: auto;
       padding: 0 16px 0 16px;
       padding: 0 16px 0 16px;
       background: #ffffff;
       background: #ffffff;
       flex: 1;
       flex: 1;
@@ -1873,8 +2192,10 @@ body {
       .item {
       .item {
         display: flex;
         display: flex;
         align-items: center;
         align-items: center;
-        min-height: 50px;
+        // min-height: 50px;
         border-bottom: 1px solid #f0f0f0;
         border-bottom: 1px solid #f0f0f0;
+        padding: 12px 0;
+        box-sizing: border-box;
 
 
         img {
         img {
           width: 24px;
           width: 24px;
@@ -1908,7 +2229,7 @@ body {
             flex: 1;
             flex: 1;
             margin-left: 10px;
             margin-left: 10px;
             font-weight: 500;
             font-weight: 500;
-            font-size: 16px;
+            font-size: 15px;
             letter-spacing: 0.3px;
             letter-spacing: 0.3px;
             color: #000000;
             color: #000000;
           }
           }

+ 30 - 7
src/view/popup/popup.vue

@@ -84,7 +84,9 @@
                                 </div>
                                 </div>
                                 <div class="right">
                                 <div class="right">
                                     <div class="msg">
                                     <div class="msg">
-                                        <div class="bold">
+                                        <div class="bold" 
+                                            :class="{'align-content': (item.type == 2 || (item.type == 1 && item.status == 1)) && 
+                                                                        item.amount.length + item.currencySymbol.length > 12 }">
                                             <!-- 收到的 -->
                                             <!-- 收到的 -->
                                             <template v-if="item.type == 1">
                                             <template v-if="item.type == 1">
                                                 <!-- 进行中-->
                                                 <!-- 进行中-->
@@ -97,8 +99,10 @@
                                                         <a-tooltip :title="item.amount">
                                                         <a-tooltip :title="item.amount">
                                                             {{ getBit(item.amount) }}</a-tooltip>
                                                             {{ getBit(item.amount) }}</a-tooltip>
                                                     </span>
                                                     </span>
-                                                    <span class="coin-type">{{ item.currencySymbol || '' }}</span>
-                                                    <img :src="item.currencyIconPath" alt="">
+                                                    <div class="coin-type-wrapper">
+                                                        <span class="coin-type">{{ item.currencySymbol || '' }}</span>
+                                                        <img :src="item.currencyIconPath" alt="">
+                                                    </div>
                                                 </template>
                                                 </template>
                                                 <!-- 已过期 -->
                                                 <!-- 已过期 -->
                                                 <template v-else-if="item.status == 2">
                                                 <template v-else-if="item.status == 2">
@@ -112,8 +116,10 @@
                                                         -{{ getBit(item.amount) }}
                                                         -{{ getBit(item.amount) }}
                                                     </a-tooltip>
                                                     </a-tooltip>
                                                 </span>
                                                 </span>
-                                                <span class="coin-type">{{ item.currencySymbol || '' }}</span>
-                                                <img :src="item.currencyIconPath" alt="">
+                                                <div class="coin-type-wrapper">
+                                                    <span class="coin-type">{{ item.currencySymbol || '' }}</span>
+                                                    <img :src="item.currencyIconPath" alt="">   
+                                                </div>
                                             </template>
                                             </template>
                                         </div>
                                         </div>
                                         <!-- 发出的红包显示 -->
                                         <!-- 发出的红包显示 -->
@@ -834,7 +840,7 @@ body {
                     height: 100%;
                     height: 100%;
                     display: flex;
                     display: flex;
                     justify-content: space-between;
                     justify-content: space-between;
-                    border-bottom: 1px solid #d1d1d1;
+                    border-bottom: 1px solid #ECECEC;
                     box-sizing: border-box;
                     box-sizing: border-box;
                     padding: 10px 14px 10px 0;
                     padding: 10px 14px 10px 0;
 
 
@@ -849,7 +855,7 @@ body {
 
 
                         .time {
                         .time {
                             font-size: 12px;
                             font-size: 12px;
-                            color: #b6b6b6;
+                            color: #B0B0B0;
                         }
                         }
                     }
                     }
 
 
@@ -876,6 +882,11 @@ body {
                                     color: #E29A2E;
                                     color: #E29A2E;
                                 }
                                 }
 
 
+                                .coin-type-wrapper {
+                                    display: flex;
+                                    align-items: center;
+                                }
+
                                 .coin-type {
                                 .coin-type {
                                     margin-left: 3px;
                                     margin-left: 3px;
                                 }
                                 }
@@ -887,6 +898,15 @@ body {
                                 }
                                 }
                             }
                             }
 
 
+                            .align-content {
+                                flex-direction: column;
+                                align-items: flex-end;
+
+                                .blance {
+                                    max-width: 130px;
+                                }
+                            }
+
                             .desc {
                             .desc {
                                 font-size: 12px;
                                 font-size: 12px;
                                 color: #b6b6b6;
                                 color: #b6b6b6;
@@ -981,6 +1001,9 @@ body {
                     .left {
                     .left {
                         font-weight: 500;
                         font-weight: 500;
                         font-size: 16px;
                         font-size: 16px;
+                        .time {
+                            color: #B0B0B0;
+                        }
                     }
                     }
 
 
                     .right {
                     .right {

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor