// ==UserScript==
// @name 蓝湖
// @namespace http://tampermonkey.net/
// @version 0.2.45
// @description try to take over the world!
// @author HolmesZhao
// @include *://lanhuapp.com/web*
// @include *://lanhu.zuoyebang.cc/web*
// @grant none
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js
// ==/UserScript==
(function() {
'use strict';
window.onbeforeunload = function(e) {
let pid = getQueryVariable("pid")
console.log(pid)
if (pid != '' && pid != null) {
window.localStorage.setItem('lanhu_current_pid', pid)
}
return;
};
var authorization = ""
function listen() {
var origin = {
setRequestHeader: XMLHttpRequest.prototype.setRequestHeader
}
XMLHttpRequest.prototype.setRequestHeader = function (a, b) {
if (arguments[0] == 'Authorization') {
authorization = arguments[1]
}
origin.setRequestHeader.apply(this, arguments)
}
}
listen()
function getQueryVariable(variable) {
let len = window.location.href.indexOf('?')
if (len <= 0) { return false; }
var query = window.location.href.substring(len + 1);
var vars = query.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
if(pair[0] == variable){return pair[1];}
}
return(false);
}
function saveUrl() {
let pid = getQueryVariable("pid")
let url = $('.mminput')[0].value
if (url == '' || url == null) {
alert('请填写 URL')
return
}
let urls = JSON.parse(window.localStorage.getItem('lanhu_old_urls'))
if (urls == null) { urls = {} }
urls[pid] = url
window.localStorage.setItem('lanhu_old_urls', JSON.stringify(urls))
}
function clearUrls() {
window.localStorage.removeItem('lanhu_old_urls')
}
function copyUrl() {
let urls = JSON.parse(window.localStorage.getItem('lanhu_old_urls'))
let pid = getQueryVariable("pid")
if (pid == '' || pid == null) {
pid = window.localStorage.getItem('lanhu_current_pid')
}
if (urls == null) {
alert('请填写 URL 并保存')
return;
}
if (pid == '' || pid == null) {
alert('pid 不存在')
return;
}
let url = urls[pid];
let btn = document.getElementsByClassName('mmbutton')[0];
let btnText = btn.innerText;
let textarea = "<textarea id=\"copyFont\" style=\"opacity: 0;\">" + url + "</textarea>";
btn.innerHTML = textarea;
var element = document.getElementById("copyFont");
element.select(); // 选择对象
document.execCommand("Copy"); // 执行浏览器复制命令
btn.innerText = btnText
}
function loadUrl() {
let urls = JSON.parse(window.localStorage.getItem('lanhu_old_urls'))
let pid = getQueryVariable("pid")
if (pid == '' || pid == null) {
pid = window.localStorage.getItem('lanhu_current_pid')
}
if (urls == null) {
alert('请填写 URL 并保存')
return;
}
if (pid == '' || pid == null) {
alert('pid 不存在')
return;
}
window.location.href = urls[pid]
}
function login() {
let login_url = "http://lanhu.zuoyebang.cc/api/account/login_url"
let toast = document.getElementsByClassName("lan-toast")
var needLogin = false
for (let i = 0; i < toast.length; ++i) {
let text = toast[i].textContent
if (text.length > 0) {
needLogin = true
break
}
}
if (needLogin) {
window.localStorage.setItem('lanhu_needAuth', true)
window.location.href = login_url
return;
}
if (window.localStorage.getItem('lanhu_needAuth') == "true") {
window.localStorage.setItem('lanhu_needAuth', false)
loadUrl()
}
}
setTimeout(login, 1000);
// Your code here...
var colorJson = {}
var colorMMJJson = {
"Background": "F8F7F7",
"Separator": "F0F0F0",
"NavigationBarBackground": "FFFFFE",
"MainTitle": "141414",
"MainTint": "FEE791",
"AccessoryTitle": "666666",
"AccessoryText": "A3A3A3",
"Disable": "CCCCCC",
"PureWhite": "FFFFFF",
"PureBlack": "000000",
"LinkText": "5373B2",
"Tip_Strong": "FFA317",
"Tip_Failure": "FE5347",
"Tip_Weak": "FFF6D4",
"Tip_Success": "10C772",
"TextButtonMain": "FCCE00",
"ButtonDisabled": "E3E5E8",
"LabelNormal": "F8F8F7",
"LabelSelected": "FFF5D6",
"Accessory1": "57E3D0",
"Accessory2": "FCCE00",
"Accessory3": "FF9EA8",
"Accessory4": "8EC2FF",
"Accessory5": "56EOCE",
}
// 错题 app 的颜色
var colorStudyJson = {
"BackgroundTitle": "FFFFFF",
"Tip_Strong": "FFA317",
"Disable": "B8BBC2",
"LinkText": "3777FF",
"Tip_Success": "07C16A",
"NavigationBarBackground": "FAFCFF",
"AccessoryTitle": "8F9396",
"MainTitle": "292F3D",
"Tip_Failure": "F8554F",
"Tip_Weak": "FFF6D4",
"Background": "F5F7FA",
"Separator": "EDEEF0",
"Accessory1": "FF7631",
"Accessory2": "FFBF27",
"TextButtonMain": "0687FF",
"VIPFont": "994D12",
"LabelSelected": "E9F6FF",
"LabelNormal": "F7F9FC",
}
// 国际版 app 的颜色
var colorInternationalJson = {
"BackgroundTitle": "FFFFFF",
"Tip_Strong": "FE7600",
"Disable": "B8BBC2",
"LinkText": "0687FF",
"Tip_Success": "2BD8A6",
"NavigationBarBackground": "FFFFFE",
"AccessoryTitle": "9A9EA4",
"MainTitle": "17191C",
"Tip_Failure": "F8554F",
"Tip_Weak": "0687FE",
"Background": "F4F4F4",
"Separator": "F0F0F0",
"Accessory1": "FF7631",
"Accessory2": "FFBF27",
"TextButtonMain": "F9E667",
"LabelSelected": "E9F6FF",
"LabelNormal": "F7F9FC",
}
var fontJson = {
"MMRegularFontName": "苹方-简 常规体",
"MMMediumFontName": "苹方-简 中黑体",
"MMSemiboldFontName": "苹方-简 中粗体",
"MMMnumbersFontName": "Mnumbers Regular",
"MMBiaopan01FontName": "Biaopan01 Regular"
}
// 需要将 fontJson 中的 key 去掉 FontName 字符
// normalFonts 没有提供快捷创建的方式, 比如: .regularFont(with: .Mark)
// normalFonts 中标记的是特殊字体, 使用如下: .font(with: .Mnumbers, size: .Content)
var normalFonts = [
"MMMnumbers",
"MMBiaopan01"
]
var fontSizeJson = {}
var fontSizeOldJson = {
"MMSpecialBigFontSize": "34pt",
"MMSpecialMiddleFontSize": "24pt",
"MMSpecialSmallFontSize": "21",
"MMTitleFontSize": "18pt",
"MMTitleTabSelectFontSize": "16pt",
"MMTitleTabNormalFontSize": "15pt",
"MMContentFontSize": "14pt",
"MMAccessoryFontSize": "13pt",
"MMDescriptionFontSize": "12pt",
"MMLabelFontSize": "11pt",
"MMMarkFontSize": "10pt",
"MMProgressFontSize": "8pt",
}
var fontSizeNewJson = {
"MMSpecialBigFontSize": "36pt",
"MMSpecialMiddleFontSize": "28pt",
"MMSpecialSmallFontSize": "20pt",
"MMTitleFontSize": "18pt",
"MMSubTitleFontSize": "16pt",
"MMTitleTabSelectFontSize": "16.1pt",
"MMTitleTabNormalFontSize": "15pt",
"MMContentFontSize": "14pt",
"MMAccessoryFontSize": "13pt",
"MMDescriptionFontSize": "12pt",
"MMLabelFontSize": "11pt",
"MMMarkFontSize": "10pt",
"MMProgressFontSize": "8pt",
}
var color = '';
var font = '';
var fontSize = '';
var fontSizeValue = '';
var app = 'mmj';
function changeColorText() {
var copy_texts = document.getElementsByClassName('copy_text');
for (let index = 0; index < copy_texts.length; index++) {
const element = copy_texts[index];
for (const key in colorJson) {
if (colorJson.hasOwnProperty(key)) {
const value = colorJson[key];
if (element.innerText.indexOf(value) != -1 ||
element.innerText.indexOf(value.toLowerCase()) != -1) {
element.innerText = key;
color = key;
return;
}
}
}
}
}
function changeFontText() {
var layer_names = document.getElementsByClassName('layer_name');
for (let index = 0; index < layer_names.length; index++) {
const element = layer_names[index];
for (const key in fontJson) {
if (fontJson.hasOwnProperty(key)) {
const value = fontJson[key];
if (element.innerText.indexOf(value) != -1) {
element.innerText = key;
font = key;
return;
}
}
}
}
}
function changeFontSizeText() {
var item_titles = document.getElementsByClassName('item_title');
for (let index = 0; index < item_titles.length; index++) {
const element = item_titles[index];
if (element.innerText.indexOf('字号') != -1) {
let sizeDom = element.parentElement.getElementsByClassName('two')[0];
let hasChanged = false;
for (const key in fontSizeJson) {
if (fontSizeJson.hasOwnProperty(key)) {
const value = fontSizeJson[key];
if (sizeDom.innerText.indexOf(value) != -1) {
sizeDom.innerText = key;
fontSize = key;
hasChanged = true;
fontSizeValue = parseInt(sizeDom.innerText).toString();
return;
}
}
}
if ((hasChanged == false) && (isNaN(parseInt(sizeDom.innerText)) == false)) {
fontSize = parseInt(sizeDom.innerText).toString();
}
}
}
}
function changeText(params) {
changeColorText();
changeFontText();
changeFontSizeText();
}
function addButton(name, marginLeft, top, fun) {
var txt = document.createTextNode(name);
var btn = document.createElement('button');
btn.className = 'mmbutton';
btn.style = "z-index: 9999; font-size: large; position: fixed; top: " + top +"px; left: " + (marginLeft) + "px;border:1px solid black; padding: 0 10px;";
btn.onclick = fun;
btn.appendChild(txt);
document.body.appendChild(btn);
return btn.offsetWidth + btn.offsetLeft;
};
function addTextField(name, marginLeft, top) {
$('head').append($(`
<style type="text/css">
.mminput:active {
border:1px solid black;
border-color:#58ACFA;
-webkit-transition:border linear .2s,-webkit-box-shadow linear .5s;
-webkit-box-shadow:0 0 5px #58ACFA;
-moz-box-shadow: 0 0 5px #58ACFA;
box-shadow:0 0 5px #58ACFA;
}
.mminput:focus {
border:1px solid black;
border-color:#58ACFA;
-webkit-transition:border linear .2s,-webkit-box-shadow linear .5s;
-webkit-box-shadow:0 0 5px #58ACFA;
-moz-box-shadow: 0 0 5px #58ACFA;
box-shadow:0 0 5px #58ACFA;
}
</style>
`));
var input = document.createElement('input');
input.className = 'mminput';
input.style = "z-index: 9999; font-size: large; position: fixed; top: "+ top +"px; left: " + (marginLeft) + "px; border:1px solid gray;";
input.placeholder = name;
let urls = JSON.parse(window.localStorage.getItem('lanhu_old_urls'));
let pid = window.localStorage.getItem('lanhu_current_pid');
if (urls != null && urls[pid]) {
input.value = urls[pid].split('zuoyebang.cc')[1];
}
document.body.appendChild(input);
}
function remove() {
let style = document.getElementsByClassName('mu-paper mu-drawer mu-paper-round mu-paper-2 open right')[0].getAttribute('style');
if (style.indexOf('display') == -1) {
drawerStyle = style;
document.getElementsByClassName('mu-paper mu-drawer mu-paper-round mu-paper-2 open right')[0].setAttribute('style', 'display: none;');
} else {
document.getElementsByClassName('mu-paper mu-drawer mu-paper-round mu-paper-2 open right')[0].setAttribute('style', drawerStyle);
}
};
function getFont() {
font = font.split('Font')[0];
let fontCode = ""
if (normalFonts.indexOf(font) != -1) {
font = "OCFontName" + font.slice(2);
// .font(with: .Mnumbers, size: .Content)
fontCode = "[UIFont MM_FontWith:" + font + " size:" + fontSize + "]";
} else {
if (fontSize.slice(2, -8) == "") {
font = "OCFontName" + font.slice(2);
// .font(with: .Mnumbers, size: .Content)
fontCode = "[UIFont MM_FontWith:" + font + " size:" + fontSize + "]";
} else {
// [UIFont MMMediumFontWithFontSize:MMTitleFontSize]
fontCode = "[UIFont " + font + "FontWithFontSize:"+ fontSize +"]";
}
}
let btn = document.getElementsByClassName('mmbutton')[3];
let btnText = btn.innerText;
let textarea = "<textarea id=\"copyFont\" style=\"opacity: 0;\">" + fontCode + "</textarea>";
btn.innerHTML = textarea;
var element = document.getElementById("copyFont");
element.select(); // 选择对象
document.execCommand("Copy"); // 执行浏览器复制命令
btn.innerText = btnText
};
function getSwiftFont() {
font = font.split('Font')[0];
let fontCode = ""
if (normalFonts.indexOf(font) != -1) {
// .font(with: .Mnumbers, size: .Content)
fontCode = "." +
"font(with: ." +
font.slice(2) +
", size:" +
(fontSize.slice(2, -8) == '' ? fontSize : ("." + fontSize.slice(2, -8))) +
")"
} else {
if (fontSize.slice(2, -8) == "") {
// .font(with: .Mnumbers, size: 36)
fontCode = "." +
"font(with: ." +
font.slice(2) +
", size:" +
fontSize +
")"
} else {
// .mediumFont(with: .Content)
fontCode = "." +
font.charAt(2).toLowerCase() +
font.slice(3) +
"Font(with: ." +
fontSize.slice(2, -8) + ")"
}
}
let btn = document.getElementsByClassName('mmbutton')[5];
let btnText = btn.innerText;
let textarea = "<textarea id=\"copyFont\" style=\"opacity: 0;\">" + fontCode + "</textarea>";
btn.innerHTML = textarea;
var element = document.getElementById("copyFont");
element.select(); // 选择对象
document.execCommand("Copy"); // 执行浏览器复制命令
btn.innerText = btnText
};
function getColor() {
color = color.split('_').join('');
color = color.charAt(0).toLowerCase() + color.slice(1);
// UIColor.mm_mainTitleColor
let colorCode = "UIColor.mm_" + color + "Color";
let btn = document.getElementsByClassName('mmbutton')[4];
let btnText = btn.innerText;
let textarea = "<textarea id=\"copyColor\" style=\"opacity: 0;\">" + colorCode + "</textarea>";
btn.innerHTML = textarea;
var element = document.getElementById("copyColor");
element.select(); // 选择对象
document.execCommand("Copy"); // 执行浏览器复制命令
btn.innerText = btnText
}
function getSwiftColor() {
color = color.split('_').join('');
color = color.charAt(0).toLowerCase() + color.slice(1);
// .mm_mainTitle()
let colorCode = "UIColor.mt." + color;
let btn = document.getElementsByClassName('mmbutton')[6];
let btnText = btn.innerText;
let textarea = "<textarea id=\"copyColor\" style=\"opacity: 0;\">" + colorCode + "</textarea>";
btn.innerHTML = textarea;
var element = document.getElementById("copyColor");
element.select(); // 选择对象
document.execCommand("Copy"); // 执行浏览器复制命令
btn.innerText = btnText
}
function changeApp() {
let btn = document.getElementsByClassName('mmbutton')[0];
let key = 'mbkj'
app = localStorage.getItem(key)
if (app == '' || app == null) {
app = 'mmj'
}
switch (app) {
case 'mmj':
btn.innerText = '错题APP'
colorJson = colorStudyJson
fontSizeJson = fontSizeOldJson
localStorage.setItem(key, 'study');
break;
case 'study':
btn.innerText = '国际版'
colorJson = colorMMJJson
fontSizeJson = fontSizeOldJson
localStorage.setItem(key, 'international');
break;
case 'international':
btn.innerText = '喵喵机'
colorJson = colorMMJJson
fontSizeJson = fontSizeNewJson
localStorage.setItem(key, 'mmj');
break;
default:
break;
}
}
function appName() {
let key = 'mbkj'
app = localStorage.getItem(key)
if (app == '' || app == null) {
app = 'mmj'
}
switch (app) {
case 'mmj':
colorJson = colorMMJJson
fontSizeJson = fontSizeNewJson
return '喵喵机'
case 'study':
colorJson = colorStudyJson
fontSizeJson = fontSizeOldJson
return '错题APP'
case 'international':
colorJson = colorInternationalJson
fontSizeJson = fontSizeOldJson
return '国际版'
default:
return ""
}
}
async function request(urlString) {
return new Promise(function (resolve, reject) {
// js发送http请求 利用相应的代码片段-->
var xhr = new XMLHttpRequest(); // 初始化js中的内置对象XMLHttpRequest-->
//定义 事件绑定中的函数,定义在xhr实例化之后,因为函数中需要xhr
function success() {
console.log("完成请求-响应啦!!!!!!!") //请求响应成功后再打印
// console.log(xhr.responseText) //拿到 响应的响应体信息,响应正文
console.log(xhr.status) //拿到请求的响应状态码
if (xhr.status != 200) {
//alert('请求 image 错误')
reject(xhr.status)
return
}
const data = JSON.parse(xhr.responseText) //把响应正文转换为json对象
resolve(data)
}
xhr.onload = success; //当请求响应完成后,去执行success函数
xhr.open("get", urlString); // 提供HTTP请求的 方法和url-->
xhr.setRequestHeader("Authorization", authorization);
xhr.send(); // 发起真正的请求-->
});
}
// 展示切图, 目前没用
function imageHandle(json) {
var images = json.info
images = images.filter(image => image.image != null);
// console.log(images);
var results = []
var logs = []
images.forEach(element => {
const imageUrl = element.image.imageUrl
if (results.indexOf(imageUrl) !== -1) {
return
}
results.push(imageUrl)
const log = {};
log.name = element.name
log.imageUrl = imageUrl
log.id = imageUrl.split('/').pop()
logs.push(log)
});
console.log(logs);
return logs;
/*
results.forEach(element => {
var div = document.createElement("div");
div.style.display = "flex";
div.style.alignItems = "center";
div.style.justifyContent = "center";
div.style.width = "100px";
div.style.height = "100px";
div.style.margin = "10px";
div.className = "image";
div.innerHTML = `<img src="${element}" style="width: -webkit-fill-available; height: -webkit-fill-available;">`;
document.getElementById('app').appendChild(div);
})
*/
}
async function copyImagesJSON() {
let href = window.location.href;
let image_id = href
.split('&')
.filter(e => e.indexOf('image_id') !== -1)
.map (e => { return e.split('=')[1] })[0]
if (image_id == null) {
console.log("没有找到 image_id")
return
}
let imageSearch = await request("http://lanhu.zuoyebang.cc/api/project/image?image_id=" + image_id);
let sketchurl = imageSearch.result.versions[0].json_url
if (sketchurl == null) {
alert('切图下载失败, 没有找到 json')
return
}
let jsonString = await request(sketchurl).then(imageHandle)
let btn = document.getElementsByClassName('mmbutton')[8];
let btnText = btn.innerText;
let textarea = "<textarea id=\"copyImagesJSON\" style=\"opacity: 0;\">" + JSON.stringify(jsonString) + "</textarea>";
btn.innerHTML = textarea;
var element = document.getElementById("copyImagesJSON");
element.select(); // 选择对象
document.execCommand("Copy"); // 执行浏览器复制命令
btn.innerText = btnText
const title = document.getElementsByClassName('current_name name_only')[0].innerText
const url = 'http://mb.nps.zwyxxd.press:2061/lanhu_handle.html?images=' + window.btoa(window.encodeURIComponent(JSON.stringify(jsonString))) + '&url=' + window.encodeURIComponent(window.location.href) + '&name=' + title
window.open(url)
}
var drawerStyle = '';
var btnLeft = screen.width/5;
var marginLeft = 30;
btnLeft += marginLeft;
btnLeft = addButton(appName(), btnLeft, 0, changeApp);
btnLeft += marginLeft;
addTextField("输入网址", btnLeft, 40);
btnLeft = addButton('点击开关抽屉', btnLeft, 0, remove);
btnLeft += marginLeft;
addButton('SaveUrl', btnLeft + 50, 40, saveUrl);
btnLeft = addButton('点击更换文字', btnLeft, 0, changeText);
btnLeft += marginLeft;
addButton('LoadUrl', btnLeft, 40, loadUrl);
btnLeft = addButton('OC 字体', btnLeft, 0, getFont);
btnLeft += marginLeft;
addButton('CopyUrl', btnLeft, 40, copyUrl);
btnLeft = addButton('OC 颜色', btnLeft, 0, getColor);
btnLeft += marginLeft;
addButton('切图JSON', btnLeft, 40, copyImagesJSON);
btnLeft = addButton('Swift 字体', btnLeft, 0, getSwiftFont);
btnLeft += marginLeft;
btnLeft = addButton('Swift 颜色', btnLeft, 0, getSwiftColor);
})();