ParseCard.js 25 KB

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