// ==UserScript==
// @name Xbox CLoud Gaming优化整合
// @name:zh-CN Xbox CLoud Gaming优化整合
// @namespace http://tampermonkey.net/xbox/nft
// @version 1.1.5
// @description:zh-cn 整合和修改现有脚本,感谢@TGSAN,@刘翠两位大佬,该脚本支持ios(使用Userscripts),pc,安卓,优化项:游戏语言简体繁体选择+免代理直连(默认韩服)+safari免添加桌面+高码率+禁用低画质+裸连网络中强制开启触屏控制(开加速器失效)+美化悬浮按钮的样式+锁定默认服务器(默认关闭)。 【若你有好的想法或者有BUG可以进xbox云游戏交流群531602832反馈】
// @author 奈非天
// @match https://www.xbox.com/*/play*
// @run-at document-start
// @grant unsafeWindow
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_unregisterMenuCommand
// @grant GM_registerMenuCommand
// @original-script https://gf.qytechs.cn/zh-CN/scripts/455741-xbox-cloud-gaming%E4%BC%98%E5%8C%96%E6%95%B4%E5%90%88
// @description 整合和修改现有脚本,感谢@TGSAN,@刘翠两位大佬,该脚本支持ios(使用Userscripts),pc,安卓,优化项:游戏语言简体繁体选择+免代理直连(默认韩服)+safari免添加桌面+高码率+禁用低画质+裸连网络中强制开启触屏控制(开加速器失效)+美化悬浮按钮的样式+锁定默认服务器(默认关闭)。 【若你有好的想法或者有BUG可以进xbox云游戏交流群531602832反馈】
// ==/UserScript==
(function() {
'use strict';
// Your code here...
//========↓↓↓↓↓是各个功能的总开关↓↓↓↓↓========//
//★★ 1=开 0=关 ★★//
let kr='168.126.63.1';//韩
let us='4.2.2.2';//美
let jp='210.131.113.123';//日
//【换区改下面的kr或者自己写ip】
let fakeIp=kr;
//选择语言
let chooseLanguage=1;
//免代理直连 默认韩服 (影响到玩什么服,如果开加速器可以关闭,否则即使使用了日本线路的梯子或者加速器,免代理的IP是韩服,那么玩的还是韩服)
let no_need_VPN_play=1;
//强制开启触屏控制(开加速器失效)
let enable_controll=1;
//高码率
let high_bitrate=1;
//safari免添加桌面
let no_need_to_add_desktop=1;
//禁用低画质
let no_low_quality=1;
//默认服务器(默认关闭)
let blockXcloudServer=0;
//========↑↑↑↑↑是各个功能的总开关↑↑↑↑↑========//
//默认服务器//Korea Japan
let defaultXcloudServer='Korea';
//若智能语言报错默认使用的语言,简体zh-CN,繁体zh-TW
let IfErrUsedefaultGameLanguage='zh-CN';
const originFetch = fetch;
let languageMenuItemList = [];
let xcloud_game_language;//
let default_language_list=['zh-CN','zh-TW']
let default_language_list_Chinese={'zh-CN':'简体','zh-TW':'繁体','Auto':'智能简繁'}
let isSptGM=false;
try{
GM_getValue('abcdegfhijklmn');
isSptGM=true;
}catch(e){}
let windowCtx = self.window;
if (self.unsafeWindow) {
console.log("使用unsafeWindow模式");
windowCtx = self.unsafeWindow;
} else {
console.log("使用原生模式");
}
windowCtx.fetch = (...arg) => {
let arg0 = arg[0];
let url = "";
let isRequest = false;
switch (typeof arg0) {
case "object":
url = arg0.url;
isRequest = true;
break;
case "string":
url = arg0;
break;
default:
break;
}
if (url.indexOf('/v2/login/user') > -1){//xgpuweb.gssv-play-prod.xboxlive.com
return new Promise((resolve, reject) => {
if (isRequest && arg0.method == "POST") {
arg0.json().then(json => {
let body = JSON.stringify(json);
if(no_need_VPN_play==1){
console.log('xff欺骗开始'+url)
arg[0].headers.set('x-forwarded-for',fakeIp);
}
arg[0] = new Request(url, {
method: arg0.method,
headers: arg0.headers,
body: body,
});
originFetch(...arg).then(res => {
console.log('xff欺骗结束');
res.json().then(json => {
json["offeringSettings"]["allowRegionSelection"] = true;
if(blockXcloudServer==1){
console.log('修改服务器开始');
let newServerList = [];
let currentAutoServer;
let closedChinaServer=[];
json["offeringSettings"]["regions"].forEach((region) => {
newServerList.push(region["name"]);
//region['name'].indexOf('Japan')>-1 ||
if(region['name'].indexOf(defaultXcloudServer)>-1){
closedChinaServer.push(region["name"]);
}
if (region["isDefault"] === true) {
currentAutoServer = region["name"];
}
});
let selectedServer=closedChinaServer[0];
if (selectedServer !== "Auto" && newServerList.includes(selectedServer)) {
json["offeringSettings"]["regions"].forEach((region) => {
if (region["name"] === selectedServer) {
region["isDefault"] = true;
} else {
region["isDefault"] = false;
}
});
}
console.log('修改服务器开始');
}
let body = JSON.stringify(json);
let newRes = new Response(body, {
status: res.status,
statusText: res.statusText,
headers: res.headers
})
resolve(newRes);
}).catch(err => {
reject(err);
});
}).catch(err => {
reject(err);
});
});
} else {
console.error("[ERROR] Not a request.");
return originFetch(...arg);
}
});
}else if (url.indexOf('/v5/sessions/cloud/play') > -1) {
changeBasicBtnCss();
if(chooseLanguage==1){
return new Promise(async(resolve, reject) => {
console.log('语言开始')
let selectedLanguage=IfErrUsedefaultGameLanguage;
if(isSptGM){
selectedLanguage=xcloud_game_language;
console.log('配置项语言:'+selectedLanguage);
}
if(selectedLanguage=='Auto' || !isSptGM){
const regex = /\/([a-zA-Z0-9]+)\/?/gm;
let matches;
let latestMatch;
while ((matches = regex.exec(document.location.pathname)) !== null) {
if (matches.index === regex.lastIndex) {
regex.lastIndex++;
}
matches.forEach((match, groupIndex) => {
// console.log(`Found match, group ${groupIndex}: ${match}`);
latestMatch = match;
});
}
if (latestMatch) {
let pid = latestMatch;
try {
let res = await fetch(
"https://catalog.gamepass.com/products?market=US&language=en-US&hydration=PCInline", {
"headers": {
"content-type": "application/json;charset=UTF-8",
},
"body": "{\"Products\":[\"" + pid + "\"]}",
"method": "POST",
"mode": "cors",
"credentials": "omit"
});
let jsonObj =await res.json();
let languageSupport = jsonObj["Products"][pid]["LanguageSupport"]
for(let i=0;i<default_language_list.length;i++){
if (default_language_list[i] in languageSupport) {
selectedLanguage=default_language_list[i];
break;
}
}
if(selectedLanguage=='Auto'){
//防止接口没有返回支持语言
selectedLanguage=IfErrUsedefaultGameLanguage;
}
}catch(e){}
}
}
if (isRequest && arg0.method == "POST") {
arg0.json().then(json => {
json["settings"]["locale"] = selectedLanguage;
let body = JSON.stringify(json);
arg[0] = new Request(url, {
method: arg0.method,
headers: arg0.headers,
body: body,
mode: arg0.mode,
credentials: arg0.credentials,
cache: arg0.cache,
redirect: arg0.redirect,
referrer: arg0.referrer,
integrity: arg0.integrity
});
originFetch(...arg).then(res => {
console.log(`语言结束, 选择语言: ${selectedLanguage}.`)
resolve(res);
}).catch(err => {
reject(err);
});
});
} else {
console.error("[ERROR] Not a request.");
return originFetch(...arg);
}
});
}else {
return originFetch(...arg);
}
} else if (url.indexOf('/v2/titles') > -1 && enable_controll==1) { // /v2/titles or /v2/titles/mru
// Enable CustomTouchOverlay
console.log('修改触摸开始')
return new Promise((resolve, reject) => {
originFetch(...arg).then(res => {
res.json().then(json => {
// console.error(json);
try {
json["results"].forEach(result => {
if (result["details"]["supportedInputTypes"].includes("CustomTouchOverlay") === false) {
result["details"]["supportedInputTypes"].push("CustomTouchOverlay");
// console.log("[Xbox Cloud Gaming Global Touch Controll] Hook " + result["titleId"]);
}
if (result["details"]["supportedInputTypes"].includes("MKB") === false) {
result["details"]["supportedInputTypes"].push("MKB");
// console.log("[Xbox Cloud Gaming Global Touch Controll] Hook " + result["titleId"]);
}
if (result["details"]["supportedInputTypes"].includes("GenericTouch") === false) {
result["details"]["supportedInputTypes"].push("GenericTouch");
// console.log("[Xbox Cloud Gaming Global Touch Controll] Hook " + result["titleId"]);
}
if (result["details"]["supportedInputTypes"].includes("NativeTouch") === false) {
result["details"]["supportedInputTypes"].push("NativeTouch");
// console.log("[Xbox Cloud Gaming Global Touch Controll] Hook " + result["titleId"]);
}
});
} catch (err) {}
let body = JSON.stringify(json);
let newRes = new Response(body, {
status: res.status,
statusText: res.statusText,
headers: res.headers
})
resolve(newRes);
console.log('修改触摸结束')
}).catch(err => {
reject(err);
});
}).catch(err => {
reject(err);
});
});
}else {
return originFetch(...arg);
}
}
//添加菜单
if(isSptGM){
function checkSelected(name){
let selected = GM_getValue("xcloud_game_language");
return name == selected;
}
//注册(不可用)语言选项
function registerSelectableMenuItem(name) {
return GM_registerMenuCommand((checkSelected(name) ? "✅" : "🔲") + " " + default_language_list_Chinese[name] , function() {
xcloud_game_language = name;
GM_setValue("xcloud_game_language", xcloud_game_language);
updateLanguageMenuItem();
});
}
function updateLanguageMenuItem() {
languageMenuItemList.forEach(command => {
GM_unregisterMenuCommand(command);
});
languageMenuItemList = [];
languageMenuItemList.push(registerSelectableMenuItem("Auto"));
default_language_list.forEach((language) => {
languageMenuItemList.push(registerSelectableMenuItem(language));
});
}
if(chooseLanguage==1){
xcloud_game_language = GM_getValue("xcloud_game_language",'Auto');
updateLanguageMenuItem();
}
}
function HookProperty(object, property, value)
{
Object.defineProperty(object, property, {
value: value
});
}
let fakeuad = {
"brands": [
{
"brand": "Microsoft Edge",
"version": "999"
},
{
"brand": "Chromium",
"version": "999"
},
{
"brand": "Not=A?Brand",
"version": "24"
}
],
"mobile": false,
"platform": "Windows"
};
try{
if(high_bitrate==1){
HookProperty(windowCtx.navigator, "userAgent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/999.0.0.0 Safari/537.36 Edg/999.0.0.0");
HookProperty(windowCtx.navigator, "appVersion", "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/999.0.0.0 Safari/537.36 Edg/999.0.0.0");
HookProperty(windowCtx.navigator, "platform", "Win32");
HookProperty(windowCtx.navigator, "appName", "Netscape");
HookProperty(windowCtx.navigator, "appCodeName", "Mozilla");
HookProperty(windowCtx.navigator, "product", "Gecko");
HookProperty(windowCtx.navigator, "vendor", "Google Inc.");
HookProperty(windowCtx.navigator, "vendorSub", "");
HookProperty(windowCtx.navigator, "maxTouchPoints", undefined);
HookProperty(windowCtx.navigator, "userAgentData", fakeuad);
}
if(no_low_quality==1){
HookProperty(windowCtx.navigator, "connection", undefined);
}
if(no_need_to_add_desktop==1){
HookProperty(windowCtx.navigator, "standalone", true);
}
}catch(e){}
function changeBasicBtnCss(){
let btnCss = `
.EditErgoMenu-module__basicControlsButtonColor___1sLIY{
width:10px;
min-width:10px;
background-color:rgba(255,0,0,0)!important;
overflow: hidden;
}
.GripHandle-module__container___3clUM{
background:rgba(0, 0, 0, 0);
}
.Grip-module__container___2t3Ev{
opacity:0.3;
}
.StreamHUD-module__buttonsContainer___9B1o3{
background-color:rgba(255,0,0,0)
}
`;
var basicStyle = document.createElement('style');
basicStyle.innerHTML = btnCss;
var doc = document.head || document.documentElement;
doc.appendChild(myStyle);
}
})();