GitHub Images Accept-Language Modifier

修改发送给 GitHub 图片服务器的 Accept-Language 请求头,避免中文用户遇到 429 错误

目前为 2025-04-29 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name GitHub Images Accept-Language Modifier
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description 修改发送给 GitHub 图片服务器的 Accept-Language 请求头,避免中文用户遇到 429 错误
  6. // @author Codming
  7. // @match *://*.github.com/*
  8. // @grant GM_xmlhttpRequest
  9. // @run-at document-start
  10. // @connect camo.githubusercontent.com
  11. // @connect avatars.githubusercontent.com
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16. // 拦截 XMLHttpRequest
  17. const originalXhrOpen = XMLHttpRequest.prototype.open;
  18. const originalXhrSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
  19. XMLHttpRequest.prototype.open = function(method, url) {
  20. this._url = url;
  21. return originalXhrOpen.apply(this, arguments);
  22. };
  23. XMLHttpRequest.prototype.setRequestHeader = function(header, value) {
  24. // 检查 URL 是否匹配目标域名
  25. if (this._url &&
  26. (this._url.includes('camo.githubusercontent.com') ||
  27. this._url.includes('avatars.githubusercontent.com'))) {
  28. // 如果是 Accept-Language 头,修改值
  29. if (header.toLowerCase() === 'accept-language') {
  30. value = value.replace('zh-CN', 'en-US').replace('zh;', 'en;');
  31. console.log('Modified Accept-Language for:', this._url, 'New value:', value);
  32. }
  33. }
  34. return originalXhrSetRequestHeader.call(this, header, value);
  35. };
  36. // 拦截 fetch 请求
  37. const originalFetch = window.fetch;
  38. window.fetch = function(resource, init) {
  39. const url = resource instanceof Request ? resource.url : resource;
  40. if (url &&
  41. (url.includes('camo.githubusercontent.com') ||
  42. url.includes('avatars.githubusercontent.com'))) {
  43. init = init || {};
  44. init.headers = init.headers || {};
  45. // 创建修改后的 headers
  46. const newHeaders = new Headers(init.headers);
  47. if (newHeaders.has('accept-language')) {
  48. const langValue = newHeaders.get('accept-language');
  49. const newLangValue = langValue.replace('zh-CN', 'en-US').replace('zh;', 'en;');
  50. newHeaders.set('accept-language', newLangValue);
  51. console.log('Modified fetch Accept-Language for:', url, 'New value:', newLangValue);
  52. }
  53. // 如果 resource 是 Request 对象
  54. if (resource instanceof Request) {
  55. const newRequest = new Request(resource, {
  56. headers: newHeaders
  57. });
  58. return originalFetch.call(this, newRequest, init);
  59. } else {
  60. // 如果是 URL 字符串
  61. init.headers = newHeaders;
  62. return originalFetch.call(this, resource, init);
  63. }
  64. }
  65. return originalFetch.apply(this, arguments);
  66. };
  67. })();