修复inoreader图片异常

修复inoreader的图片加载

目前为 2023-04-07 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name fix-image-error at inoreader
  3. // @name:zh-CN 修复inoreader图片异常
  4. // @version 0.0.1
  5. // @namespace https://onerzone.com
  6. // @description Fix image load error by requesting to origin download link
  7. // @description:zh-CN 修复inoreader的图片加载
  8. // @author Noah Xin
  9. // @license MIT
  10. // @supportURL https://github.com/noah-onerzone/tampermonkey-scripts/blob/master/inoreader/fix-image-error.js
  11. // @include http*://*.inoreader.com/*
  12. // @icon http://www.inoreader.com/favicon.ico
  13. // @grant GM_xmlhttpRequest
  14. // @connect *
  15. // ==/UserScript==
  16. const config = {
  17. name: "fix-image-error",
  18. data: [ // weibo images prefix
  19. {
  20. imageServer: 'sinaimg.cn',
  21. customHeader: {
  22. Referer: 'https://weibo.com'
  23. }
  24. }
  25. ]
  26. }
  27.  
  28. /**
  29. *
  30. * @link https://stackoverflow.com/questions/8778863/downloading-an-image-using-xmlhttprequest-in-a-userscript
  31. * @param {*} inputStr
  32. * @returns
  33. */
  34. function customBase64Encode(inputStr) {
  35. var
  36. bbLen = 3,
  37. enCharLen = 4,
  38. inpLen = inputStr.length,
  39. inx = 0,
  40. jnx,
  41. keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  42. + "0123456789+/=",
  43. output = "",
  44. paddingBytes = 0;
  45. var
  46. bytebuffer = new Array(bbLen),
  47. encodedCharIndexes = new Array(enCharLen);
  48.  
  49. while (inx < inpLen) {
  50. for (jnx = 0; jnx < bbLen; ++jnx) {
  51. if (inx < inpLen)
  52. bytebuffer[jnx] = inputStr.charCodeAt(inx++) & 0xff;
  53. else
  54. bytebuffer[jnx] = 0;
  55. }
  56. encodedCharIndexes[0] = bytebuffer[0] >> 2;
  57. encodedCharIndexes[1] = ((bytebuffer[0] & 0x3) << 4) | (bytebuffer[1] >> 4);
  58. encodedCharIndexes[2] = ((bytebuffer[1] & 0x0f) << 2) | (bytebuffer[2] >> 6);
  59. encodedCharIndexes[3] = bytebuffer[2] & 0x3f;
  60. paddingBytes = inx - (inpLen - 1);
  61. switch (paddingBytes) {
  62. case 1:
  63. // Set last character to padding char
  64. encodedCharIndexes[3] = 64;
  65. break;
  66. case 2:
  67. // Set last 2 characters to padding char
  68. encodedCharIndexes[3] = 64;
  69. encodedCharIndexes[2] = 64;
  70. break;
  71. default:
  72. break; // No padding - proceed
  73. }
  74. for (jnx = 0; jnx < enCharLen; ++jnx)
  75. output += keyStr.charAt(encodedCharIndexes[jnx]);
  76. }
  77. return output;
  78. }
  79.  
  80. const getImageUrl = (data) => {
  81. var binResp = customBase64Encode(data.responseText);
  82. let src = `data:image/jpeg;base64,${binResp}`
  83. return src;
  84. }
  85.  
  86. const httpGetReqeust = (url, customHeader) => {
  87. return new Promise((resolve, reject) => {
  88. GM.xmlHttpRequest({
  89. method: "GET",
  90. url: url,
  91. headers: {
  92. "Accept": "*/*",
  93. "referrerPolicy": "no-referrer",
  94. ...customHeader
  95. },
  96. onload: resolve,
  97. onerror: reject,
  98. overrideMimeType: 'text/plain; charset=x-user-defined'
  99. });
  100. })
  101. }
  102.  
  103. const processImage = (dom, customHeader) => {
  104. if (dom.getAttribute('processed-tag') !== 'true') {
  105. dom.setAttribute('alt', 'loading...')
  106. const originalSrc = dom.getAttribute("data-original-src");
  107. httpGetReqeust(originalSrc, customHeader)
  108. .then(data => {
  109. dom.setAttribute('src', getImageUrl(data))
  110. })
  111. .catch(e => console.error(`${config.name} load image failed! ${e}`))
  112. .finally(() => dom.setAttribute('processed-tag', 'true'))
  113. }
  114. }
  115.  
  116. const main = () => {
  117. config.data.forEach(({ imageServer, customHeader }) => {
  118. Array.from(
  119. document.querySelectorAll(`.article_content img[data-original-src*='${imageServer}']`))
  120. .forEach(image => processImage(image, customHeader));
  121. })
  122. }
  123.  
  124. setInterval(main, 3000)