Unlock region restrictions

Bypass some kind of region restrictions.

目前為 2019-04-21 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Unlock region restrictions
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Bypass some kind of region restrictions.
// @author       CharRun
// @grant        GM_xmlhttpRequest
// @include      https://store.steampowered.com/app/*
// @include      https://store.steampowered.com/agecheck/app/*
// @run-at       document-body
// ==/UserScript==

(()=>{
	let DEFAULT_COUNTRY = '美国';
	let messageBox;
	const SupportCountryList = {
		"中国":"cn",
		"美国":"us",
		"加拿大":"ca",
		"俄罗斯":"ru",
		"英国":"gb",
		"澳大利亚":"au",
		"法国":"fr",
		"香港":"hk",
		"印度":"in",
		"日本":"jp",
		"韩国":"kr"
	};

	function controlBar(){
		DEFAULT_COUNTRY = localStorage.getItem('CR_DEFAULT_COUNTRY') || DEFAULT_COUNTRY;
		let postion = document.getElementById('global_action_menu');
		let menu = document.createElement('div');
		let style = document.createElement('style');
		style.innerHTML = `#cr-control-lable{position:relative;background-color:#171a21;color:#b8b6b4;width:150px;border:2px solid gray;border-radius:5px;}#cr-control-lable ul{margin:15px 0;padding:10px 0;box-sizing:border-box;border:1px solid #171a21;border-radius:5px;max-height:300px;min-width:100px;width:auto;overflow:auto;display:none;position:absolute;background-color:#171a21}#cr-control-lable li{padding:0 15px;list-style:none;}#cr-control-lable .icon{position:absolute;width:7.5px;height:7.5px;box-sizing:border-box;border:7.5px solid;top:5px;left:15px;z-index:1;}#cr-control-lable .icon.on{border-color:#fff transparent transparent;}#cr-control-lable .icon.close{border-color:transparent transparent transparent #b8b6b4;}#cr-control-lable #cr-input{width:100%;text-align:center;padding-left:20px;color:#b8b6b4;background-color:#171a21;box-sizing:border-box;border-color:transparent;}#cr-control-lable #cr-input::placeholder{color:#b8b6b4;}#cr-control-lable #cr-input:focus::placeholder{color:#fff;}#cr-control-lable #cr-input:focus{outline:none;color:#fff;}#cr-control-lable button{outline:none;color:#b8b6b4;background-color:#171a21;border:none;text-align:center;box-sizing:border-box;padding:5 auto;}#cr-control-lable button:hover:active{color:#b8b6b4;}#cr-control-lable button:hover{color:#fff;cursor:pointer;}#cr-control-lable li:hover{color:#fff;cursor:pointer;}`;
		// menu.style.display = "inline-block"
		document.getElementsByTagName('head')[0].appendChild(style)
		menu.innerHTML = `<div id='cr-control-lable'><div class="infobox"><div style="position: relative;"><span id="cr-icon"class="icon close"></span><input id="cr-input"type="text"name=""placeholder="输入/选择国家"autocomplete="off"></div><div style="text-align: center;"><button id="cr-check"style="width:32%;">访问</button><button id="cr-default"style="width:64%;">设置默认</button></div><ul id="cr-select-country"></ul></div></div>`
		postion.appendChild(menu)

		let input = document.getElementById("cr-input");
	    let ul = document.getElementById('cr-select-country');
	    let check = document.getElementById('cr-check');
	    let setDefault = document.getElementById('cr-default');
	    input.value = DEFAULT_COUNTRY

	    for(let i in SupportCountryList){
	    	ul.innerHTML += `<li>${i}</li>`
	    }

	    ul.addEventListener('mousedown',function(e){
	        input.value = e.target.innerHTML
	        e.preventDefault();
	       
	     },true);

	    input.onfocus = function(){
	        document.getElementById('cr-icon').className = "icon on"
	        document.getElementById('cr-select-country').style.display = "block"
	    }

	    input.onblur = function(){
	        document.getElementById('cr-icon').className = "icon close"
	        document.getElementById('cr-select-country').style.display = "none"
	    }

	    input.onkeypress = function(e){
	    	if (e.keyCode == 13 || e.which == 13){
	            check.onclick()
	        }
	    }

	    check.onclick = function(){
	    	region = input.value == '' ? DEFAULT_COUNTRY : input.value
	    	messageBox = ShowBlockingWaitDialog(`正在跨区访问`, `${region} 区域匿名数据获取中...`)
	    	anonymousRegion(region);
	    }

	    setDefault.onclick = function(){
	    	DEFAULT_COUNTRY = input.value;
	    	localStorage.setItem('CR_DEFAULT_COUNTRY', DEFAULT_COUNTRY);
	    }
	}


	function allowR18(){
		let date = new Date()
		date.setTime(date.getTime() + 1000 * 3600 * 24 * 365)
		let expires = `expires=${date.toUTCString()};`
		let path = `path=/;`
		document.cookie= "wants_mature_content=1;" + path + expires;
		document.cookie= "birthtime=-729000000;" +  path + expires;
		messageBox && messageBox.Dismiss()
		location = location.href.replace('/agecheck','')
	}


	function cookieParse(){
		let cookieString = document.cookie;
		let cookieArray = cookieString.split(';')
		let cookies = {};
		for(let i = 0 , l = cookieArray.length; i < l ; i++){
			let cookie = cookieArray[i].trim();
			if(cookie == ''){
				continue;
			}else{
				let c = cookie.split('=')
				cookies[c[0]] = c[1]
			}
		}
		return cookies
	}

	function anonymousRegion(region) {
		region = region ? SupportCountryList[region] ? SupportCountryList[region] : region : 'us';
		accountCountry = g_oSuggestParams ? g_oSuggestParams.cc.toLowerCase() : ''; 
		if(accountCountry == region){
			messageBox && messageBox.Dismiss()
			ShowAlertDialog('访问取消','访问区域与当前区域一致','确认').done(setTimeout(()=>location.reload(),1500))
			return
		}
		let url = location.origin + location.pathname + `?cc=${region}`;
		GM_xmlhttpRequest({
			method:'GET',
			url:url,
			headers:{

			},
			anonymous:true,
			onload: ifarme
		})
	}


	function ifarme(res){
		let virtualDom = document.createElement('html');
		virtualDom.innerHTML = res.response;
		if(/"error_box"/ig.exec(res.response)){
			messageBox && messageBox.Dismiss()
			ShowAlertDialog('访问失败','暂不支持R18跨区访问或访问区域受限','确认').done();
			return
		}
		virtualDom.getElementsByTagName('head')[0].innerHTML += '<base target="_blank">'
		virtualDom.getElementsByTagName('body')[0].innerHTML = virtualDom.getElementsByClassName('responsive_page_template_content')[0].innerHTML;
		let content = `<html class="responsive">${virtualDom.innerHTML}</html>`
		let iframe = document.createElement("iframe");
		let rhtml = document.getElementsByClassName('responsive_page_template_content')[0];
		rhtml.innerHTML = ''
		rhtml.appendChild(iframe)

	    iframe.style.width = '100%';
	    iframe.style.border = 'none';
	    iframe.style.height = '0px';
	    iframe.style.overflow = 'hidden';
	    iframe.scrolling = 'no';
	    iframe.frameborder = 'no';

		let frameWin = iframe;
	    if(iframe.contentWindow){
	        frameWin = iframe.contentWindow;
	    }

	    frameWin.document.open();
	    frameWin.document.writeln(content);
	    frameWin.document.close();
	    virtualDom = content = null
		frameWin.onload = function(){
			messageBox && messageBox.Dismiss()
		 	iframe.style.height = frameWin.document.documentElement.scrollHeight + 'px';
		 	t = setInterval(()=>{
		 		iframe.style.height = frameWin.document.documentElement.scrollHeight + 'px';
		 	},500)
		 	setTimeout(()=>clearInterval(t),3000)
		 }
	}

	function autoCheck(){
		let restricted = document.getElementById('error_box')
		if(restricted){
			let cookies = cookieParse();
			let mature_content = cookies.wants_mature_content ? cookies.wants_mature_content : '0';
			messageBox && messageBox.Dismiss()
			if(mature_content == '1'){
				messageBox = ShowBlockingWaitDialog('检测到访问限制', `${DEFAULT_COUNTRY} 区域匿名数据获取中...`)
				anonymousRegion(DEFAULT_COUNTRY)
			}else{
				messageBox = ShowBlockingWaitDialog('R18解除尝试', '设置Cookies中...')
				allowR18()
			}
		}
	}

	(function main(){
		autoCheck()
		controlBar()
	})()


	// function insert(res){
	// 	let rhtml = document.getElementsByClassName('responsive_page_template_content')[0];
	// 	let resContainer = document.createElement('html')
	// 	resContainer.innerHTML = /<head>([\s\S])*<\/body>/ig.exec(res.response);
	// 	let nhtml = resContainer.getElementsByClassName('responsive_page_template_content')[0];

	// const MISS_CSS_LIST = [
	// 	'https://steamstore-a.akamaihd.net/public/shared/css/user_reviews.css?v=fRl7Zc8pKTl-',
	// 	'https://steamstore-a.akamaihd.net/public/shared/css/store_game_shared.css?v=ZIBBVLz7y4BI',
	// 	'https://steamstore-a.akamaihd.net/public/css/v6/game.css?v=WxFCdr52XB55',
	// 	'https://steamstore-a.akamaihd.net/public/css/v6/recommended.css?v=AOAvIZ99nrgu',
	// 	'https://steamstore-a.akamaihd.net/public/css/applications/store/main.css?v=OxxrwLUZ2E2x',
	// 	'https://steamstore-a.akamaihd.net/public/css/applications/store/store.css?v=zJBnwu5HDcJI',
	// 	'https://steamstore-a.akamaihd.net/public/shared/css/apphub.css?v=dunRbO3rtVVd'
	// ]


	// 	cssInject()
	// 	if(rhtml&&nhtml){
	// 		rhtml.innerHTML = nhtml.innerHTML;
	// 		let scriptTags = resContainer.getElementsByTagName('script');
	// 		scriptInject(scriptTags)
	// 	}
	// }

	// function cssInject(){
	// 	for(let i = 0, l = MISS_CSS_LIST.length;i < l;i++){
	// 		let newStyle = document.createElement('link');
	// 		newStyle.href = MISS_CSS_LIST[i];
	// 		newStyle.type = "text/css"
	// 		newStyle.rel = "stylesheet"
	// 		document.head.appendChild(newStyle);
			
	// 	}
	// }

	// function scriptInject(scriptNode){
	// 	setTimeout(()=>{
	// 		for(let i = 0, l = scriptNode.length; i < l; i++){
	// 			try{
	// 				let newScript = document.createElement('script');
	// 				newScript.setAttribute('index',i)
	// 				newScript.innerHTML = scriptNode[i].innerHTML;
	// 				let src = scriptNode[i].getAttribute('src');
	// 				src && newScript.setAttribute('src', src);
	// 				document.head.appendChild(newScript);
	// 			}
	// 			catch(e){console.log(e)}
	// 		}		
	// 	},1000)
	// }
})()