ParseCard.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. import { iframeHost } from '@/http/configAPI'
  2. import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
  3. import ToolBox from '@/view/content/tool-box/index.vue'
  4. import { createApp } from 'vue'
  5. import { getStorage, setStorage, guid } from '@/uilts/help'
  6. import { chromeExtensionUrl } from '@/uilts/chromeExtension'
  7. // 解析卡片类
  8. // 1.dom匹配
  9. // 2.找出网页匹配 获取twitterid
  10. // 3.获取短链接postid
  11. // 4.渲染iframe twitterid
  12. // 5.获取红包状态页面
  13. // 6.查询twitterid状态
  14. // 7.绑定twitterid
  15. class ParseCard {
  16. constructor() {
  17. }
  18. parseFaceBookCard() {
  19. let de_net_card = []
  20. let arr_article = document.querySelectorAll('div[role="article"]') || []
  21. let _html
  22. for (let i in arr_article) {
  23. _html = arr_article[i].innerHTML || ''
  24. if (_html.includes('denetme.net') && !this.isHasIframeByFacebook(arr_article[i])) {
  25. de_net_card.push({
  26. time: new Date().getTime(),
  27. dom: arr_article[i]
  28. })
  29. }
  30. }
  31. return de_net_card
  32. }
  33. // 兼容mask
  34. compatibleMask(article) {
  35. let has_denet = false
  36. try {
  37. let arr_span = article.querySelectorAll('span') || []
  38. let arr_shadow = []
  39. arr_span.forEach((item) => {
  40. if (item.shadowRoot) {
  41. arr_shadow.push(item.shadowRoot)
  42. }
  43. })
  44. let item
  45. for (let i in arr_shadow) {
  46. item = arr_shadow[i].childNodes
  47. if (has_denet) {
  48. break
  49. }
  50. if (item) {
  51. for (let j in item) {
  52. if (item[j].innerText && (item[j].innerText.includes('#DeNet') || item[j].innerText.includes('#DNFT'))) {
  53. has_denet = true
  54. break
  55. }
  56. }
  57. }
  58. }
  59. } catch (error) {
  60. }
  61. // 是否有#DeNet
  62. return has_denet
  63. }
  64. parseAllDeNetCard(has_iframe = false) {
  65. let de_net_card = []
  66. try {
  67. let arr_article = document.querySelectorAll('article') || []
  68. let _txt
  69. for (let i in arr_article) {
  70. _txt = arr_article[i].innerText || ''
  71. if (has_iframe) {
  72. if ((_txt.includes('#DeNet') || _txt.includes('#DNFT') || this.compatibleMask(arr_article[i]))) {
  73. de_net_card.push({
  74. time: new Date().getTime(),
  75. dom: arr_article[i]
  76. })
  77. }
  78. } else {
  79. if ((_txt.includes('#DeNet') || _txt.includes('#DNFT') || this.compatibleMask(arr_article[i])) && !this.isHasIframeByArticle(arr_article[i])) {
  80. de_net_card.push({
  81. time: new Date().getTime(),
  82. dom: arr_article[i]
  83. })
  84. }
  85. }
  86. }
  87. } catch (error) {
  88. }
  89. return de_net_card
  90. }
  91. parseCardParmas(dom_card) {
  92. let tweet_Id = ''
  93. let short_url = ''
  94. let a_arr = dom_card.querySelectorAll('a') || []
  95. a_arr = Array.from(a_arr).reverse()
  96. for (let i in a_arr) {
  97. // 获取推特id
  98. if (a_arr[i].href && a_arr[i].href.indexOf('/status/') > 0 && !tweet_Id) {
  99. tweet_Id = a_arr[i].href.split('/status/')[1] || ''
  100. tweet_Id = tweet_Id.split('/')[0]
  101. }
  102. if (a_arr[i].href && a_arr[i].href.includes('https://t.co') && !short_url) {
  103. short_url = a_arr[i].href
  104. }
  105. if (tweet_Id && short_url) {
  106. break
  107. }
  108. }
  109. return { tweet_Id, short_url, dom_card }
  110. }
  111. parseFaceBookParmas(dom_card) {
  112. let tweet_Id = ''
  113. let short_url = ''
  114. let tweet_author = '';
  115. let a_arr = dom_card.querySelectorAll('a[role="link"]') || []
  116. a_arr = Array.from(a_arr).reverse()
  117. for (let i in a_arr) {
  118. // 获取推特id
  119. if (a_arr[i].href.indexOf('facebook.com') > 0 && a_arr[i].href.indexOf('denetme') > 0 && a_arr[i].href.indexOf('nft') == -1) {
  120. let faceUrl = new URL(a_arr[i].href);
  121. let faceSearch = new URLSearchParams(faceUrl.search);
  122. let faceJumpUrl = decodeURIComponent(faceSearch.get('u'));
  123. if (faceJumpUrl !== 'null') {
  124. let urlArr = new URL(faceJumpUrl);
  125. let searchArr = new URLSearchParams(urlArr.search);
  126. let deUrlParams = searchArr.get('deUrlParams') || '{}';
  127. deUrlParams = JSON.parse(deUrlParams);
  128. if (!tweet_Id) {
  129. tweet_Id = deUrlParams.tweetId;
  130. }
  131. if (!short_url) {
  132. short_url = faceJumpUrl
  133. }
  134. if (!tweet_author) {
  135. tweet_author = deUrlParams.fullName;
  136. }
  137. }
  138. } else {
  139. if (a_arr[i].href.indexOf('denetme.net') > 0 && a_arr[i].href.indexOf('nft') == -1) {
  140. let urlArr = new URL(a_arr[i].href);
  141. let searchArr = new URLSearchParams(urlArr.search);
  142. let deUrlParams = searchArr.get('deUrlParams') || '{}';
  143. deUrlParams = JSON.parse(deUrlParams);
  144. if (!tweet_Id) {
  145. tweet_Id = deUrlParams.tweetId;
  146. }
  147. if (!short_url) {
  148. short_url = a_arr[i].href
  149. }
  150. if (!tweet_author) {
  151. tweet_author = deUrlParams.fullName;
  152. }
  153. }
  154. }
  155. if (tweet_Id && short_url) {
  156. break
  157. }
  158. }
  159. return { tweet_Id, short_url, dom_card, tweet_author }
  160. }
  161. hideCard() {
  162. if (dom.querySelector('iframe')) {
  163. return
  164. }
  165. }
  166. parseAllDeNetCardParmas(has_iframe = false) {
  167. let json_data = []
  168. this.parseAllDeNetCard(has_iframe).forEach((item) => {
  169. let _obj = this.parseCardParmas(item.dom)
  170. if (_obj.tweet_Id && _obj.short_url && _obj.dom_card) {
  171. _obj.time = item.time
  172. json_data.push(_obj)
  173. }
  174. })
  175. return json_data
  176. }
  177. parseFacebookCardParmas() {
  178. let json_data = []
  179. this.parseFaceBookCard().forEach((item) => {
  180. let _obj = this.parseFaceBookParmas(item.dom)
  181. if (_obj.short_url && _obj.dom_card) {
  182. _obj.time = item.time
  183. json_data.push(_obj)
  184. }
  185. })
  186. return json_data
  187. }
  188. // 获取短链接和渲染卡片数据
  189. async getCardParmas(card_json_data) {
  190. let sort_link_data = getStorage('denetCardData') || []
  191. // let sort_link_data = await getChromeStorage('cardData') || []
  192. let has_post_Id_card_data = this.getLocalHasPostIdData(sort_link_data, card_json_data)
  193. let need_net_short_urls = this.filterShortUrl(sort_link_data, card_json_data)
  194. // 校验存储大小
  195. let new_item = this.checkShortUrlArraySize(sort_link_data)
  196. if (sort_link_data.length != new_item.length) {
  197. setStorage('denetCardData', new_item)
  198. }
  199. return {
  200. has_post_Id_card_data,
  201. need_net_short_urls
  202. }
  203. }
  204. filterShortUrl(sort_link_data, card_json_data) {
  205. let has = false
  206. let need_net_short_urls = []
  207. card_json_data.forEach((card_item) => {
  208. has = false
  209. sort_link_data.forEach((local_item) => {
  210. if (card_item.short_url == local_item.short_url && local_item.post_Id) {
  211. has = true
  212. }
  213. })
  214. if (!has) {
  215. need_net_short_urls.push(card_item.short_url)
  216. }
  217. })
  218. // 返回的是没有postid的
  219. return need_net_short_urls
  220. }
  221. getLocalHasPostIdData(sort_link_data = [], card_json_data = []) {
  222. //
  223. let has_post_Id_card_data = []
  224. card_json_data.forEach((item) => {
  225. let filter_item = sort_link_data.filter((filter) => {
  226. return filter.short_url == item.short_url && filter.post_Id
  227. })
  228. if (filter_item.length > 0) {
  229. item.post_Id = filter_item[0].post_Id
  230. has_post_Id_card_data.push(item)
  231. }
  232. })
  233. return has_post_Id_card_data
  234. }
  235. netShortUrl(need_net_short_urls = [], callback) {
  236. // 1. 获取短链接
  237. let denetCardData = getStorage('denetCardData') || []
  238. need_net_short_urls.forEach((short_url) => {
  239. // // 本地没有 存储
  240. if (denetCardData.filter((item) => { return item.short_url == short_url }).length == 0) {
  241. denetCardData.push({
  242. short_url
  243. })
  244. }
  245. })
  246. setStorage('denetCardData', denetCardData)
  247. // 发起网络请求
  248. if (!navigator.onLine) {
  249. return
  250. }
  251. let now_time
  252. for (let i in denetCardData) {
  253. now_time = new Date().getTime()
  254. // 没请求过 || 现在时间 - 网络请求时间 >= 3s && 没有post_Id
  255. if ((!denetCardData[i].fetch_time || (now_time - denetCardData[i].fetch_time) >= 3000) && !denetCardData[i].post_Id) {
  256. // 发起网络请求请求
  257. denetCardData[i].fetch_time = now_time
  258. fetch(denetCardData[i].short_url) // 返回一个Promise对象
  259. .then((res) => {
  260. return res.text() // res.text()是一个Promise对象
  261. }).then((res) => {
  262. res = res.toString()
  263. let str_arr = res.match(/denetme.net\/([\s\S]*?)"/) || []
  264. let post_Id = str_arr[1] || ''
  265. if (!post_Id) {
  266. return
  267. }
  268. denetCardData[i].post_Id = post_Id
  269. setStorage('denetCardData', denetCardData)
  270. callback && callback()
  271. }).catch((error) => {
  272. console.log('catch', error)
  273. })
  274. }
  275. }
  276. }
  277. checkShortUrlArraySize(_array) {
  278. if (new Blob(_array).size >= 1024 * 1024 * 4) {
  279. _array.splice(0, parseInt(_array.length / 2))
  280. }
  281. return _array
  282. }
  283. createToolBoxIframe({ post_Id = '', tweet_Id = '' }, if_center = false) {
  284. let _iframe = document.createElement('iframe')
  285. let _iframe_url = ''
  286. let tweet_str = ''
  287. if (tweet_Id) {
  288. tweet_str = `&tweetId=${tweet_Id}`
  289. }
  290. _iframe.id = post_Id
  291. _iframe_url = chromeExtensionUrl + ('iframe/tool-box.html') + `?page_type=${'card'}&postId=${post_Id}&tweetId=${tweet_Id}`;
  292. _iframe.allow = "camera *;microphone *"
  293. // debugger mode
  294. if (window.location.href.includes('denet_debugger')) {
  295. _iframe_url = _iframe_url + '&denet_debugger=1'
  296. }
  297. _iframe.src = _iframe_url
  298. _iframe.scrolling = 'no'
  299. _iframe.style.cssText = 'border:medium none; width:505px; height:545px; max-height:545px; filter: drop-shadow(rgba(0, 0, 0, 0.2) 0px 4px 20px);'
  300. return _iframe
  301. }
  302. createIframe({ post_Id = '', tweet_Id = '', tweet_author = '', page_type = '' }, if_center = false) {
  303. let _iframe = document.createElement('iframe')
  304. let _iframe_url = ''
  305. let tweet_str = ''
  306. if (tweet_Id) {
  307. tweet_str = `&tweetId=${tweet_Id}`
  308. }
  309. _iframe.id = post_Id
  310. _iframe_url = chromeExtensionUrl + ('iframe/red-packet.html') + `?postId=${post_Id}${tweet_str}&tweet_author=${tweet_author}&window_origin=${window.location.origin}&page_type=${page_type}`;
  311. // debugger mode
  312. if (window.location.href.includes('denet_debugger')) {
  313. _iframe_url = _iframe_url + '&denet_debugger=1'
  314. }
  315. _iframe.src = _iframe_url
  316. _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px; border: 1px solid #DCDCDC; border-radius: 20px;'
  317. if (if_center) {
  318. _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px; display:block; margin:auto; border: 1px solid #DCDCDC; border-radius: 20px;'
  319. }
  320. return _iframe
  321. }
  322. createNftIframe({ project_Id, tweet_Id }) {
  323. let project_arr = project_Id.split('/');
  324. let projectId = project_arr[0]
  325. let _iframe = document.createElement('iframe')
  326. _iframe.id = project_Id
  327. _iframe.src = chromeExtensionUrl + ('iframe/nft-card.html') + `?projectId=${projectId}&tweetId=${tweet_Id}&twitterAccount=${project_arr[1]}`;
  328. _iframe.style.cssText = 'border:medium none; width:375px; min-height:300px;'
  329. return _iframe
  330. }
  331. createNftGroupIframe({ project_Id, tweet_Id }) {
  332. let _iframe = document.createElement('iframe')
  333. _iframe.id = project_Id
  334. _iframe.src = chromeExtensionUrl + ('iframe/nft-group-card.html') + `?projectId=${project_Id}&tweet_Id=${tweet_Id}`;
  335. _iframe.style.cssText = 'border:medium none; width:505px; min-height:180px;'
  336. return _iframe
  337. }
  338. createTreasureIframe(params = { page_type, tweet_Id, post_Id, invite_code }) {
  339. let _iframe = document.createElement('iframe')
  340. _iframe.id = params.post_Id
  341. _iframe.src = chromeExtensionUrl + ('iframe/treasure-hunt.html') + `?params=${JSON.stringify(params)}&iframeId=${guid()}`;
  342. _iframe.style.cssText = 'border:medium none; width:375px; min-height:580px; border: 1px solid #DCDCDC; border-radius: 20px;'
  343. return _iframe
  344. }
  345. isHasIframeByArticle(dom_card) {
  346. if (!dom_card || !dom_card.parentElement) {
  347. return
  348. }
  349. if (dom_card.querySelector('iframe')) {
  350. let type = 'parnet'
  351. let dom = dom_card.querySelector('div[aria-labelledby]')
  352. if (dom) {
  353. type = 'card'
  354. } else {
  355. type = 'txt'
  356. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  357. }
  358. if (type == 'card') {
  359. let _iframe = dom.querySelectorAll('iframe') || []
  360. if (_iframe.length == 0) {
  361. dom.style.display = 'none'
  362. }
  363. if (_iframe.length == 1) {
  364. for (let i = 0; i < dom.childNodes.length; i++) {
  365. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  366. dom.children[i].style.display = 'none'
  367. }
  368. }
  369. }
  370. if (_iframe.length > 1) {
  371. for (let i = 0; i < _iframe.length; i++) {
  372. if (i > 0) {
  373. _iframe[i].remove()
  374. }
  375. }
  376. }
  377. } else {
  378. let arr_iframe = dom.closest('article').querySelectorAll('iframe') || []
  379. if (arr_iframe.length > 1) {
  380. for (let i = 0; i < arr_iframe.length; i++) {
  381. if (i > 0) {
  382. arr_iframe[i].remove()
  383. }
  384. }
  385. }
  386. }
  387. return true
  388. }
  389. return false
  390. }
  391. isHasIframeByFacebook(dom_card) {
  392. if (!dom_card || !dom_card.parentElement) {
  393. return
  394. }
  395. let arr_iframe = dom_card.querySelectorAll('iframe') || []
  396. if (arr_iframe.length > 0) {
  397. if (arr_iframe.length > 1) {
  398. for (let i = 0; i < arr_iframe.length; i++) {
  399. if (i > 0) {
  400. arr_iframe[i].remove()
  401. }
  402. }
  403. }
  404. return true
  405. }
  406. return false
  407. }
  408. addDomView({ tweet_Id, element, parentElement, post_Id }) {
  409. const div = document.createElement('div')
  410. div.id = 'denet-' + tweet_Id
  411. div.style.cssText = `
  412. width: 505px;
  413. height: 545px;`
  414. div.dataset.tweetId = tweet_Id || ''
  415. div.dataset.postId = post_Id || ''
  416. parentElement.appendChild(div)
  417. createApp(element).mount(`#${div.id}`)
  418. }
  419. replaceDomView({ dom_card, tweet_Id, post_Id, time, short_url, page_type = '' }) {
  420. if (!dom_card || !dom_card.parentElement) {
  421. return
  422. }
  423. // class == denet-toolbox
  424. let type
  425. let dom = dom_card.querySelector('div[aria-labelledby]')
  426. if (dom) {
  427. type = 'card'
  428. for (let i = 0; i < dom.childNodes.length; i++) {
  429. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  430. dom.children[i].style.display = 'none'
  431. }
  432. }
  433. } else {
  434. type = 'txt'
  435. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  436. }
  437. dom.style = 'min-height:500px'
  438. if (dom) {
  439. // debugger mode
  440. if (window.location.href.includes('denet_debugger')) {
  441. let div = document.createElement('div')
  442. div.style.color = 'red'
  443. div.innerText = `
  444. tweet_Id:${tweet_Id} ,
  445. post_Id:${post_Id}
  446. 获取dom时间:${time}
  447. 短链接:${short_url}
  448. 渲染时长:${(new Date().getTime() - time) / 1000}s
  449. `
  450. dom.parentElement.appendChild(div)
  451. }
  452. // this.createIframe({ post_Id, tweet_Id, page_type })
  453. this.addDomView({ tweet_Id, post_Id, element: ToolBox, parentElement: dom })
  454. }
  455. }
  456. replaceIframeToolBox({ dom_card, tweet_Id, post_Id, time, short_url, page_type = '' }) {
  457. if (!dom_card || !dom_card.parentElement) {
  458. return
  459. }
  460. let type
  461. let dom = dom_card.querySelector('div[aria-labelledby]')
  462. if (dom) {
  463. type = 'card'
  464. for (let i = 0; i < dom.childNodes.length; i++) {
  465. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  466. dom.children[i].style.display = 'none'
  467. }
  468. }
  469. } else {
  470. type = 'txt'
  471. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  472. }
  473. dom.style = 'min-height:545px'
  474. if (dom) {
  475. // debugger mode
  476. if (window.location.href.includes('denet_debugger')) {
  477. let div = document.createElement('div')
  478. div.style.color = 'red'
  479. div.innerText = `
  480. tweet_Id:${tweet_Id} ,
  481. post_Id:${post_Id}
  482. 获取dom时间:${time}
  483. 短链接:${short_url}
  484. 渲染时长:${(new Date().getTime() - time) / 1000}s
  485. `
  486. dom.parentElement.appendChild(div)
  487. }
  488. dom.appendChild(this.createToolBoxIframe({ post_Id, tweet_Id, page_type }))
  489. }
  490. }
  491. replaceDOMRedPacket({ dom_card, tweet_Id, post_Id, time, short_url, page_type = '' }) {
  492. if (!dom_card || !dom_card.parentElement) {
  493. return
  494. }
  495. let type
  496. let dom = dom_card.querySelector('div[aria-labelledby]')
  497. if (dom) {
  498. type = 'card'
  499. for (let i = 0; i < dom.childNodes.length; i++) {
  500. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  501. dom.children[i].style.display = 'none'
  502. }
  503. }
  504. } else {
  505. type = 'txt'
  506. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  507. }
  508. dom.style = 'min-height:500px'
  509. if (dom) {
  510. // debugger mode
  511. if (window.location.href.includes('denet_debugger')) {
  512. let div = document.createElement('div')
  513. div.style.color = 'red'
  514. div.innerText = `
  515. tweet_Id:${tweet_Id} ,
  516. post_Id:${post_Id}
  517. 获取dom时间:${time}
  518. 短链接:${short_url}
  519. 渲染时长:${(new Date().getTime() - time) / 1000}s
  520. `
  521. dom.parentElement.appendChild(div)
  522. }
  523. dom.appendChild(this.createIframe({ post_Id, tweet_Id, page_type }))
  524. }
  525. }
  526. replaceDOMTreasureCard({ invite_code, dom_card, tweet_Id, post_Id, time, short_url, page_type = '' }) {
  527. if (!dom_card || !dom_card.parentElement) {
  528. return
  529. }
  530. let type
  531. let dom = dom_card.querySelector('div[aria-labelledby]')
  532. if (dom) {
  533. type = 'card'
  534. for (let i = 0; i < dom.childNodes.length; i++) {
  535. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  536. dom.children[i].style.display = 'none'
  537. }
  538. }
  539. } else {
  540. type = 'txt'
  541. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  542. }
  543. dom.style = 'min-height:500px'
  544. if (dom) {
  545. dom.appendChild(this.createTreasureIframe({ post_Id, tweet_Id, page_type, invite_code }))
  546. }
  547. }
  548. replaceNftDomRedPacket({ dom_card, tweet_Id, post_Id, time, short_url }) {
  549. if (!dom_card || !dom_card.parentElement) {
  550. return
  551. }
  552. let dom = dom_card.querySelector('div[aria-labelledby]')
  553. if (dom) {
  554. for (let i = 0; i < dom.childNodes.length; i++) {
  555. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  556. dom.children[i].style.display = 'none'
  557. }
  558. }
  559. } else {
  560. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  561. }
  562. dom.style = 'min-height:300px'
  563. if (dom) {
  564. let project_Id = post_Id.replace('nft/', '');
  565. dom.appendChild(this.createNftIframe({ project_Id, tweet_Id }))
  566. }
  567. }
  568. replaceFacebookPacket({ dom_card, tweet_Id, short_url, tweet_author }) {
  569. if (!dom_card || !dom_card.parentElement) {
  570. return
  571. }
  572. let card = dom_card.querySelector('div[id^=jsc_c_]');
  573. let dom = card && card.parentElement;
  574. if (dom) {
  575. let originUrl = new URL(short_url);
  576. let post_Id = originUrl.pathname.slice(1);
  577. if (post_Id.indexOf('luckdraw/') >= 0) {
  578. hideImage(dom);
  579. dom.style = 'min-height:500px'
  580. post_Id = post_Id.replace('luckdraw/', '');
  581. dom.appendChild(this.createIframe({ post_Id, tweet_author, page_type: '抽奖' }, true))
  582. } else if (post_Id.indexOf('/') === -1) {
  583. hideImage(dom);
  584. dom.style = 'min-height:500px'
  585. dom.appendChild(this.createIframe({ post_Id, tweet_author }, true))
  586. }
  587. }
  588. function hideImage(dom) {
  589. for (let i = 0; i < dom.childNodes.length; i++) {
  590. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  591. dom.children[i].style.display = 'none'
  592. }
  593. }
  594. if (dom.nextElementSibling && dom.nextElementSibling.id && dom.nextElementSibling.id.indexOf('jsc_c_') >= 0) {
  595. dom.nextElementSibling.style.display = 'none'
  596. }
  597. }
  598. }
  599. replaceNftGroupDomRedPacket({ dom_card, tweet_Id, post_Id, time, short_url }) {
  600. if (!dom_card || !dom_card.parentElement) {
  601. return
  602. }
  603. let dom = dom_card.querySelector('div[aria-labelledby]')
  604. if (dom) {
  605. for (let i = 0; i < dom.childNodes.length; i++) {
  606. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  607. dom.children[i].style.display = 'none'
  608. }
  609. }
  610. } else {
  611. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  612. }
  613. dom.style = 'min-height:180px'
  614. if (dom) {
  615. let project_Id = post_Id.replace('nft_group/', '');
  616. dom.appendChild(this.createNftGroupIframe({ project_Id, tweet_Id }))
  617. }
  618. }
  619. // 根据推特id获取文章推文
  620. getContentByTwitterId(tweet_Id) {
  621. let txt = ''
  622. let card_json_data = this.parseAllDeNetCardParmas(true)
  623. let result = card_json_data.filter((item) => { return item.tweet_Id == tweet_Id }) || []
  624. if (result.length > 0 && result[0].dom_card) {
  625. txt = result[0].dom_card.querySelector('[data-testid="tweetText"]').innerText.replace('…', ' ')
  626. }
  627. return txt
  628. }
  629. }
  630. export default new ParseCard()