ParseCard.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  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 _iframe = document.createElement('iframe')
  302. let _iframe_url = ''
  303. let tweet_str = ''
  304. if (tweet_Id) {
  305. tweet_str = `&tweetId=${tweet_Id}`
  306. }
  307. _iframe.id = post_Id
  308. _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}`;
  309. // debugger mode
  310. if (window.location.href.includes('denet_debugger')) {
  311. _iframe_url = _iframe_url + '&denet_debugger=1'
  312. }
  313. _iframe.src = _iframe_url
  314. _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px; border: 1px solid #DCDCDC; border-radius: 20px;'
  315. if (if_center) {
  316. _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px; display:block; margin:auto; border: 1px solid #DCDCDC; border-radius: 20px;'
  317. }
  318. return _iframe
  319. }
  320. createNftIframe({ project_Id, tweet_Id }) {
  321. let project_arr = project_Id.split('/');
  322. let projectId = project_arr[0]
  323. let _iframe = document.createElement('iframe')
  324. _iframe.id = project_Id
  325. _iframe.src = chromeExtensionUrl + ('iframe/nft-card.html') + `?projectId=${projectId}&tweetId=${tweet_Id}&twitterAccount=${project_arr[1]}`;
  326. _iframe.style.cssText = 'border:medium none; width:375px; min-height:300px;'
  327. return _iframe
  328. }
  329. createNftGroupIframe({ project_Id, tweet_Id }) {
  330. let _iframe = document.createElement('iframe')
  331. _iframe.id = project_Id
  332. _iframe.src = chromeExtensionUrl + ('iframe/nft-group-card.html') + `?projectId=${project_Id}&tweet_Id=${tweet_Id}`;
  333. _iframe.style.cssText = 'border:medium none; width:505px; min-height:180px;'
  334. return _iframe
  335. }
  336. createTreasureIframe(params = { page_type, tweet_Id, post_Id, invite_code, invite_channel }) {
  337. let _iframeId = `denet-${guid()}`
  338. let _iframe = document.createElement('iframe')
  339. _iframe.id = _iframeId
  340. _iframe.dataset.card = 'denet'
  341. _iframe.src = chromeExtensionUrl + ('iframe/treasure-hunt.html') + `?params=${JSON.stringify(params)}&iframeId=${_iframeId}`;
  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 = '', invite_channel }) {
  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, invite_channel }))
  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()