ParseCard.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
  2. // 解析卡片类
  3. class ParseCard {
  4. constructor() {
  5. }
  6. parseAllDeNetCard() {
  7. let de_net_card = []
  8. let arr_article = document.querySelectorAll('article') || []
  9. let _txt
  10. for(let i in arr_article){
  11. _txt = arr_article[i].innerText || ''
  12. if(_txt.includes('#DeNet')){
  13. de_net_card.push((arr_article[i]))
  14. }
  15. }
  16. return de_net_card
  17. }
  18. parseCardParmas(dom_card) {
  19. let tweet_Id = ''
  20. let short_url = ''
  21. let a_arr = dom_card.querySelectorAll('a') || []
  22. a_arr = Array.from(a_arr).reverse()
  23. for (let i in a_arr) {
  24. // 获取推特id
  25. if (a_arr[i].href && a_arr[i].href.indexOf('/status/') > 0 && !tweet_Id) {
  26. tweet_Id = a_arr[i].href.split('/status/')[1] || ''
  27. tweet_Id = tweet_Id.split('/')[0]
  28. }
  29. if (a_arr[i].href && a_arr[i].href.includes('https://t.co') && !short_url) {
  30. short_url = a_arr[i].href
  31. }
  32. if (tweet_Id && short_url) {
  33. break
  34. }
  35. }
  36. return { tweet_Id, short_url, dom_card }
  37. }
  38. hideCard() {
  39. if (dom.querySelector('iframe')) {
  40. return
  41. }
  42. }
  43. parseAllDeNetCardParmas() {
  44. let json_data = []
  45. this.parseAllDeNetCard().forEach((item) => {
  46. let _obj = this.parseCardParmas(item)
  47. if(_obj.tweet_Id && _obj.short_url && _obj.dom_card){
  48. json_data.push(_obj)
  49. }
  50. })
  51. return json_data
  52. }
  53. // 获取短链接和渲染卡片数据
  54. async getCardParmas(card_json_data) {
  55. let sort_link_data = await getChromeStorage('cardData') || []
  56. let has_post_Id_card_data = this.getLocalHasPostIdData(sort_link_data, card_json_data)
  57. let need_net_short_url = this.filterShortUrl(sort_link_data, card_json_data)
  58. // 校验存储大小
  59. let new_item = this.checkShortUrlArraySize(sort_link_data)
  60. if (sort_link_data.length != new_item.length) {
  61. setChromeStorage({ cardData: JSON.stringify(new_item) })
  62. }
  63. return {
  64. has_post_Id_card_data,
  65. need_net_short_url
  66. }
  67. }
  68. filterShortUrl(sort_link_data, card_json_data) {
  69. let has = false
  70. let need_net_short_url = []
  71. card_json_data.forEach((card_item) => {
  72. has = false
  73. sort_link_data.forEach((local_item) => {
  74. if (card_item.short_url == local_item.short_url && local_item.post_Id) {
  75. has = true
  76. }
  77. })
  78. if (!has) {
  79. need_net_short_url.push(card_item.short_url)
  80. }
  81. })
  82. // 返回的是没有postid的
  83. return need_net_short_url
  84. }
  85. getLocalHasPostIdData(sort_link_data = [], card_json_data = []) {
  86. //
  87. let has_post_Id_card_data = []
  88. card_json_data.forEach((item) => {
  89. let filter_item = sort_link_data.filter((filter) => {
  90. return filter.short_url == item.short_url && filter.post_Id
  91. })
  92. if (filter_item.length > 0) {
  93. item.post_Id = filter_item[0].post_Id
  94. has_post_Id_card_data.push(item)
  95. }
  96. })
  97. return has_post_Id_card_data
  98. }
  99. checkShortUrlArraySize(_array) {
  100. if (new Blob(_array).size >= 1024 * 1024) {
  101. _array.splice(0, parseInt(_array.length / 2))
  102. }
  103. return _array
  104. }
  105. createIframe(post_Id, tweet_Id) {
  106. let _iframe = document.createElement('iframe')
  107. _iframe.id = post_Id
  108. _iframe.src = chrome.runtime.getURL('/iframe/red-packet.html') + `?postId=${post_Id}&tweetId=${tweet_Id}`;
  109. _iframe.style.cssText = 'border: medium none; width:375px;min-height:500px;'
  110. return _iframe
  111. }
  112. replaceDOMRedPacket({ dom_card, tweet_Id, post_Id }) {
  113. if (!dom_card || !dom_card.parentElement) {
  114. return
  115. }
  116. let type = 'parnet'
  117. let dom = dom_card.querySelector('div[aria-labelledby]')
  118. if (dom) {
  119. type = 'card'
  120. } else {
  121. type = 'txt'
  122. dom = dom_card.querySelector('div[lang][dir=auto]').parentElement
  123. }
  124. if (type == 'card') {
  125. for (let i = 0; i < dom.childNodes.length; i++) {
  126. if(dom.children[i].tagName.toLowerCase() != 'iframe' ){
  127. dom.children[i].style.display = 'none'
  128. }
  129. }
  130. dom.style = 'min-height:500px'
  131. }
  132. if(dom_card.querySelector('iframe')){
  133. return
  134. }
  135. dom.appendChild(this.createIframe(post_Id, tweet_Id))
  136. }
  137. }
  138. export default new ParseCard()