ParseCard.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  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, invite_channel }) {
  339. let _iframeId = `denet-${guid()}`
  340. let _iframe = document.createElement('iframe')
  341. _iframe.id = _iframeId
  342. _iframe.src = chromeExtensionUrl + ('iframe/treasure-hunt.html') + `?params=${JSON.stringify(params)}&iframeId=${_iframeId}`;
  343. _iframe.style.cssText = 'border:medium none; width:375px; min-height:580px; border: 1px solid #DCDCDC; border-radius: 20px;'
  344. return _iframe
  345. }
  346. isHasIframeByArticle(dom_card) {
  347. if (!dom_card || !dom_card.parentElement) {
  348. return
  349. }
  350. if (dom_card.querySelector('iframe')) {
  351. let type = 'parnet'
  352. let dom = dom_card.querySelector('div[aria-labelledby]')
  353. if (dom) {
  354. type = 'card'
  355. } else {
  356. type = 'txt'
  357. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  358. }
  359. if (type == 'card') {
  360. let _iframe = dom.querySelectorAll('iframe') || []
  361. if (_iframe.length == 0) {
  362. dom.style.display = 'none'
  363. }
  364. if (_iframe.length == 1) {
  365. for (let i = 0; i < dom.childNodes.length; i++) {
  366. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  367. dom.children[i].style.display = 'none'
  368. }
  369. }
  370. }
  371. if (_iframe.length > 1) {
  372. for (let i = 0; i < _iframe.length; i++) {
  373. if (i > 0) {
  374. _iframe[i].remove()
  375. }
  376. }
  377. }
  378. } else {
  379. let arr_iframe = dom.closest('article').querySelectorAll('iframe') || []
  380. if (arr_iframe.length > 1) {
  381. for (let i = 0; i < arr_iframe.length; i++) {
  382. if (i > 0) {
  383. arr_iframe[i].remove()
  384. }
  385. }
  386. }
  387. }
  388. return true
  389. }
  390. return false
  391. }
  392. isHasIframeByFacebook(dom_card) {
  393. if (!dom_card || !dom_card.parentElement) {
  394. return
  395. }
  396. let arr_iframe = dom_card.querySelectorAll('iframe') || []
  397. if (arr_iframe.length > 0) {
  398. if (arr_iframe.length > 1) {
  399. for (let i = 0; i < arr_iframe.length; i++) {
  400. if (i > 0) {
  401. arr_iframe[i].remove()
  402. }
  403. }
  404. }
  405. return true
  406. }
  407. return false
  408. }
  409. addDomView({ tweet_Id, element, parentElement, post_Id }) {
  410. const div = document.createElement('div')
  411. div.id = 'denet-' + tweet_Id
  412. div.style.cssText = `
  413. width: 505px;
  414. height: 545px;`
  415. div.dataset.tweetId = tweet_Id || ''
  416. div.dataset.postId = post_Id || ''
  417. parentElement.appendChild(div)
  418. createApp(element).mount(`#${div.id}`)
  419. }
  420. replaceDomView({ dom_card, tweet_Id, post_Id, time, short_url, page_type = '' }) {
  421. if (!dom_card || !dom_card.parentElement) {
  422. return
  423. }
  424. // class == denet-toolbox
  425. let type
  426. let dom = dom_card.querySelector('div[aria-labelledby]')
  427. if (dom) {
  428. type = 'card'
  429. for (let i = 0; i < dom.childNodes.length; i++) {
  430. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  431. dom.children[i].style.display = 'none'
  432. }
  433. }
  434. } else {
  435. type = 'txt'
  436. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  437. }
  438. dom.style = 'min-height:500px'
  439. if (dom) {
  440. // debugger mode
  441. if (window.location.href.includes('denet_debugger')) {
  442. let div = document.createElement('div')
  443. div.style.color = 'red'
  444. div.innerText = `
  445. tweet_Id:${tweet_Id} ,
  446. post_Id:${post_Id}
  447. 获取dom时间:${time}
  448. 短链接:${short_url}
  449. 渲染时长:${(new Date().getTime() - time) / 1000}s
  450. `
  451. dom.parentElement.appendChild(div)
  452. }
  453. // this.createIframe({ post_Id, tweet_Id, page_type })
  454. this.addDomView({ tweet_Id, post_Id, element: ToolBox, parentElement: dom })
  455. }
  456. }
  457. replaceIframeToolBox({ dom_card, tweet_Id, post_Id, time, short_url, page_type = '' }) {
  458. if (!dom_card || !dom_card.parentElement) {
  459. return
  460. }
  461. let type
  462. let dom = dom_card.querySelector('div[aria-labelledby]')
  463. if (dom) {
  464. type = 'card'
  465. for (let i = 0; i < dom.childNodes.length; i++) {
  466. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  467. dom.children[i].style.display = 'none'
  468. }
  469. }
  470. } else {
  471. type = 'txt'
  472. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  473. }
  474. dom.style = 'min-height:545px'
  475. if (dom) {
  476. // debugger mode
  477. if (window.location.href.includes('denet_debugger')) {
  478. let div = document.createElement('div')
  479. div.style.color = 'red'
  480. div.innerText = `
  481. tweet_Id:${tweet_Id} ,
  482. post_Id:${post_Id}
  483. 获取dom时间:${time}
  484. 短链接:${short_url}
  485. 渲染时长:${(new Date().getTime() - time) / 1000}s
  486. `
  487. dom.parentElement.appendChild(div)
  488. }
  489. dom.appendChild(this.createToolBoxIframe({ post_Id, tweet_Id, page_type }))
  490. }
  491. }
  492. replaceDOMRedPacket({ dom_card, tweet_Id, post_Id, time, short_url, page_type = '' }) {
  493. if (!dom_card || !dom_card.parentElement) {
  494. return
  495. }
  496. let type
  497. let dom = dom_card.querySelector('div[aria-labelledby]')
  498. if (dom) {
  499. type = 'card'
  500. for (let i = 0; i < dom.childNodes.length; i++) {
  501. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  502. dom.children[i].style.display = 'none'
  503. }
  504. }
  505. } else {
  506. type = 'txt'
  507. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  508. }
  509. dom.style = 'min-height:500px'
  510. if (dom) {
  511. // debugger mode
  512. if (window.location.href.includes('denet_debugger')) {
  513. let div = document.createElement('div')
  514. div.style.color = 'red'
  515. div.innerText = `
  516. tweet_Id:${tweet_Id} ,
  517. post_Id:${post_Id}
  518. 获取dom时间:${time}
  519. 短链接:${short_url}
  520. 渲染时长:${(new Date().getTime() - time) / 1000}s
  521. `
  522. dom.parentElement.appendChild(div)
  523. }
  524. dom.appendChild(this.createIframe({ post_Id, tweet_Id, page_type }))
  525. }
  526. }
  527. replaceDOMTreasureCard({ invite_code, dom_card, tweet_Id, post_Id, time, short_url, page_type = '', invite_channel }) {
  528. if (!dom_card || !dom_card.parentElement) {
  529. return
  530. }
  531. let type
  532. let dom = dom_card.querySelector('div[aria-labelledby]')
  533. if (dom) {
  534. type = 'card'
  535. for (let i = 0; i < dom.childNodes.length; i++) {
  536. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  537. dom.children[i].style.display = 'none'
  538. }
  539. }
  540. } else {
  541. type = 'txt'
  542. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  543. }
  544. dom.style = 'min-height:500px'
  545. if (dom) {
  546. dom.appendChild(this.createTreasureIframe({ post_Id, tweet_Id, page_type, invite_code, invite_channel }))
  547. }
  548. }
  549. replaceNftDomRedPacket({ dom_card, tweet_Id, post_Id, time, short_url }) {
  550. if (!dom_card || !dom_card.parentElement) {
  551. return
  552. }
  553. let dom = dom_card.querySelector('div[aria-labelledby]')
  554. if (dom) {
  555. for (let i = 0; i < dom.childNodes.length; i++) {
  556. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  557. dom.children[i].style.display = 'none'
  558. }
  559. }
  560. } else {
  561. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  562. }
  563. dom.style = 'min-height:300px'
  564. if (dom) {
  565. let project_Id = post_Id.replace('nft/', '');
  566. dom.appendChild(this.createNftIframe({ project_Id, tweet_Id }))
  567. }
  568. }
  569. replaceFacebookPacket({ dom_card, tweet_Id, short_url, tweet_author }) {
  570. if (!dom_card || !dom_card.parentElement) {
  571. return
  572. }
  573. let card = dom_card.querySelector('div[id^=jsc_c_]');
  574. let dom = card && card.parentElement;
  575. if (dom) {
  576. let originUrl = new URL(short_url);
  577. let post_Id = originUrl.pathname.slice(1);
  578. if (post_Id.indexOf('luckdraw/') >= 0) {
  579. hideImage(dom);
  580. dom.style = 'min-height:500px'
  581. post_Id = post_Id.replace('luckdraw/', '');
  582. dom.appendChild(this.createIframe({ post_Id, tweet_author, page_type: '抽奖' }, true))
  583. } else if (post_Id.indexOf('/') === -1) {
  584. hideImage(dom);
  585. dom.style = 'min-height:500px'
  586. dom.appendChild(this.createIframe({ post_Id, tweet_author }, true))
  587. }
  588. }
  589. function hideImage(dom) {
  590. for (let i = 0; i < dom.childNodes.length; i++) {
  591. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  592. dom.children[i].style.display = 'none'
  593. }
  594. }
  595. if (dom.nextElementSibling && dom.nextElementSibling.id && dom.nextElementSibling.id.indexOf('jsc_c_') >= 0) {
  596. dom.nextElementSibling.style.display = 'none'
  597. }
  598. }
  599. }
  600. replaceNftGroupDomRedPacket({ dom_card, tweet_Id, post_Id, time, short_url }) {
  601. if (!dom_card || !dom_card.parentElement) {
  602. return
  603. }
  604. let dom = dom_card.querySelector('div[aria-labelledby]')
  605. if (dom) {
  606. for (let i = 0; i < dom.childNodes.length; i++) {
  607. if (dom.childNodes[i].dataset && dom.childNodes[i].dataset.testid && dom.childNodes[i].dataset.testid == 'card.wrapper') {
  608. dom.children[i].style.display = 'none'
  609. }
  610. }
  611. } else {
  612. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  613. }
  614. dom.style = 'min-height:180px'
  615. if (dom) {
  616. let project_Id = post_Id.replace('nft_group/', '');
  617. dom.appendChild(this.createNftGroupIframe({ project_Id, tweet_Id }))
  618. }
  619. }
  620. // 根据推特id获取文章推文
  621. getContentByTwitterId(tweet_Id) {
  622. let txt = ''
  623. let card_json_data = this.parseAllDeNetCardParmas(true)
  624. let result = card_json_data.filter((item) => { return item.tweet_Id == tweet_Id }) || []
  625. if (result.length > 0 && result[0].dom_card) {
  626. txt = result[0].dom_card.querySelector('[data-testid="tweetText"]').innerText.replace('…', ' ')
  627. }
  628. return txt
  629. }
  630. }
  631. export default new ParseCard()