修改发送给 GitHub 图片服务器的 Accept-Language 请求头,避免中文用户遇到 429 错误
// ==UserScript==
// @name GitHub Images Accept-Language Modifier
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 修改发送给 GitHub 图片服务器的 Accept-Language 请求头,避免中文用户遇到 429 错误
// @author Codming
// @match *://*.github.com/*
// @grant GM_xmlhttpRequest
// @run-at document-start
// @connect camo.githubusercontent.com
// @connect avatars.githubusercontent.com
// ==/UserScript==
(function() {
'use strict';
// 拦截 XMLHttpRequest
const originalXhrOpen = XMLHttpRequest.prototype.open;
const originalXhrSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
XMLHttpRequest.prototype.open = function(method, url) {
this._url = url;
return originalXhrOpen.apply(this, arguments);
};
XMLHttpRequest.prototype.setRequestHeader = function(header, value) {
// 检查 URL 是否匹配目标域名
if (this._url &&
(this._url.includes('camo.githubusercontent.com') ||
this._url.includes('avatars.githubusercontent.com'))) {
// 如果是 Accept-Language 头,修改值
if (header.toLowerCase() === 'accept-language') {
value = value.replace('zh-CN', 'en-US').replace('zh;', 'en;');
console.log('Modified Accept-Language for:', this._url, 'New value:', value);
}
}
return originalXhrSetRequestHeader.call(this, header, value);
};
// 拦截 fetch 请求
const originalFetch = window.fetch;
window.fetch = function(resource, init) {
const url = resource instanceof Request ? resource.url : resource;
if (url &&
(url.includes('camo.githubusercontent.com') ||
url.includes('avatars.githubusercontent.com'))) {
init = init || {};
init.headers = init.headers || {};
// 创建修改后的 headers
const newHeaders = new Headers(init.headers);
if (newHeaders.has('accept-language')) {
const langValue = newHeaders.get('accept-language');
const newLangValue = langValue.replace('zh-CN', 'en-US').replace('zh;', 'en;');
newHeaders.set('accept-language', newLangValue);
console.log('Modified fetch Accept-Language for:', url, 'New value:', newLangValue);
}
// 如果 resource 是 Request 对象
if (resource instanceof Request) {
const newRequest = new Request(resource, {
headers: newHeaders
});
return originalFetch.call(this, newRequest, init);
} else {
// 如果是 URL 字符串
init.headers = newHeaders;
return originalFetch.call(this, resource, init);
}
}
return originalFetch.apply(this, arguments);
};
})();