// ==UserScript==
// @name kk-helper
// @namespace https://gf.qytechs.cn
// @homepage https://gf.qytechs.cn
// @version 0.9.3
// @description 个人开发常用帮助脚本
// @author #stephenykk
// @match https://juejin.cn/post/*
// @match https://blog.csdn.net/*/article/details/*
// @match https://www.jianshu.com/p/*
// @match https://segmentfault.com/a/*
// @match https://mp.weixin.qq.com/s*
// @match https://zhuanlan.zhihu.com/p/*
// @match https://sspai.com/post/*
// @match *://www.news.cn/*/**/*.htm*
// @match *://*.people.com.cn/*/**/*.htm*
// @icon https://res.wx.qq.com/a/fed_upload/9300e7ac-cec5-4454-b75c-f92260dd5b47/logo-mp.ico
// @grant none
// @license MIT
// ==/UserScript==
(function () {
"use strict";
function log(...args) {
console.log("[KKCopy]", ...args);
}
function checkEnable() {
if (/qq\.com/.test(location.host)) {
return false;
}
return true;
}
if (!checkEnable()) return;
const autoClick = (ele, callback, seconds = 2) => {
console.log('try auto click ele:', ele);
ele.click()
callback && setTimeout(callback, seconds * 1000)
}
function autoClickPrereleaseBtn() {
if (
location.href.includes(
"https://devops-cloud.bgy.com.cn/ext/@console-plugin/cd/5e787768cc788/deploy/host-deploy"
)
) {
const autoClickNextBtn2 = () => {
const btn = document.querySelector('.grid-card .steps + .btn')
autoClick(btn, autoCheck2)
}
const autoClickNextBtn3 = () => {
const btn = document.querySelector('.grid-card .steps + .btn')
autoClick(btn, autoClickNextBtn4)
}
const autoClickNextBtn4 = () => {
const btn = document.querySelector('.grid-card .steps + .btn')
autoClick(btn)
}
const autoClickNextBtn = () => {
const btn = document.querySelector('.grid-card .steps + .btn')
autoClick(btn, autoClickNextBtn2)
}
const autoCheck1 = () => {
const labelEle = document.querySelector('.cluster-info label')
autoClick(labelEle, autoClickNextBtn, 1)
}
const autoCheck2 = () => {
const labelEle = document.querySelector('.package-grid .ui-checkbox')
autoClick(labelEle, autoClickNextBtn3, 1)
}
setTimeout(() => {
const btnEle = document.querySelector(".cluster-type-btn-group .btn:nth-of-type(2)");
btnEle && btnEle.textContent.includes('预发布') && autoClick(btnEle, autoCheck1)
}, 3000);
}
}
autoClickPrereleaseBtn()
function autoClickHostDeploy() {
if (
// location.href.includes(
// "https://devops-cloud.bgy.com.cn/ext/@console-plugin/cd/5e787768cc788/deploy"
// )
location.href === 'https://devops-cloud.bgy.com.cn/ext/@console-plugin/cd/5e787768cc788/deploy'
) {
setTimeout(() => {
const cardEle = document.querySelector(".manual-card-container .card:first-child");
cardEle && autoClick(cardEle, autoClickPrereleaseBtn, 3)
}, 3000);
}
}
function createBtn(text, listener, style='') {
// if (this.mybtn) return;
const btn = document.createElement("button");
btn.textContent = text || "Submit";
btn.className = "mybtn";
btn.setAttribute('data-txt', text);
btn.style =
"position: fixed; right: 520px; font-size: 30px; z-index: 100000; top: 0; border: 0; background: aliceblue; color: coral; padding: 0 20px; border-radius: 5px; cursor: pointer;" + style;
document.body.appendChild(btn);
btn.addEventListener('click', listener)
console.log('createBtn: btn=', btn);
// this.mybtn = btn;
return btn;
}
function addAutoDeployBtn(times) {
if (times < 1) return;
setTimeout(() => {
if (location.href === 'https://devops-cloud.bgy.com.cn/ext/@console-plugin/cd/5e787768cc788/deploy') {
createBtn('autoDeploy', autoClickHostDeploy)
} else {
addAutoDeployBtn(times - 1)
}
}, 1000)
}
addAutoDeployBtn(5)
// autoClickHostDeploy()
function autoClickLogin() {
if (
location.href.includes(
"/auth/realms/bgy/protocol/openid-connect/auth?client_id"
)
) {
setTimeout(() => {
const link = document.querySelector("#zocial-bgy");
link && link.click();
}, 2000);
}
// if(location.href.includes('https://loginuat.countrygarden.com.cn/idp/authcenter/ActionAuthChain')) {
// setTimeout(() => {
// const btn = document.querySelector(".loginBt");
// btn && btn.click();
// }, 4000);
// }
}
autoClickLogin();
function checkCopyEnable() {
const disable = ["countrygarden", "localhost"].some((kw) =>
location.href.includes(kw)
);
return !disable;
}
function mycopy(text) {
if (!checkCopyEnable()) return;
let input = document.querySelector("#myInputEle");
if (!input) {
const inpEle = document.createElement("input");
inpEle.type = "text";
document.body.insertBefore(inpEle, null);
inpEle.style = "position: fixed; top: -100px; right: 0; z-index: 10000;";
inpEle.setAttribute("id", "myInputEle");
input = inpEle;
const btn = document.createElement("button");
btn.id = "myCpBtn";
// document.body.insertBefore(btn, inpEle)
// btn.style = 'position: fixed; top: 0; left: 0; z-index: 1000'
// btn.textContent = 'copy url'
const doCopy = function () {
input.select();
input.setSelectionRange(0, input.value.length);
document.execCommand("copy");
log("copy done");
};
document.body.addEventListener("dblclick", doCopy);
}
input.value = text;
}
// eslint-disable-next-line
mycopy(`[${document.title}](${location.href})`);
function closeNoticeDialog(times = 1) {
const maxtimes = 100;
const button = document.querySelector(".notice_content + .footer button");
if (button) {
button.click();
} else {
setTimeout(closeNoticeDialog.bind(null, times + 1), 1000);
}
}
closeNoticeDialog();
function $(selector) {
return document.querySelector(selector);
}
class DevopsBuild {
constructor(sysName, isProd) {
const srmBuildUrl =
"https://devops-cloud.bgy.com.cn/next/ci/project/5f6c900f4251e/build";
const gysSrmBuildUrl =
"https://devops-cloud.bgy.com.cn/next/ci/project/5f70e768c3590/build";
const ispBuildUrl =
"https://devops-cloud.bgy.com.cn/next/ci/project/5de90b7183a5b/build";
const intBuildUrl = "https://devops-cloud.bgy.com.cn/next/ci/project/5f6a0872bfc2b/build"
const urls = {
srm: srmBuildUrl,
isp: ispBuildUrl,
int: intBuildUrl,
'gys-srm': gysSrmBuildUrl,
};
const buildUrl = urls[sysName];
if (!buildUrl) {
alert("sysName not valid");
}
this.isProd = isProd;
this.sysName = sysName;
this.buildUrl = buildUrl;
}
start() {
if (
location.href.startsWith("https://devops-cloud.bgy.com.cn/") === false
)
return;
this.btn = this.createBtn();
this.checkShouldShowBtn();
this.decoratePushState();
this.listenClickBtn();
this.constructor.prototype.pushStateCallbackList =
this.constructor.prototype.pushStateCallbackList || [];
this.pushStateCallbackList.push(this.pushStateCallback.bind(this));
}
listenClickBtn() {
this.btn.addEventListener("click", () => {
this.send();
});
}
createBtn() {
if (this.btn) return;
const btn = document.createElement("button");
btn.textContent = this.sysName + ` build ${this.isProd ? 'prod' : 'uat'}`;
btn.className = `build-${this.isProd ? 'prod' : 'uat'}-btn-` + this.sysName;
const right = this.isProd ? '700px' : '250px';
btn.style =
`position: fixed; right: ${right}; font-size: 30px; z-index: 100; top: 0; border: 0; background: aliceblue; color: coral; padding: 0 20px; border-radius: 5px; cursor: pointer;`;
document.body.appendChild(btn);
return btn;
}
pushStateCallback() {
this.checkShouldShowBtn();
}
decoratePushState() {
if (!history.pushState.isMy) {
const pushState = history.pushState;
// eslint-disable-next-line
const self = this;
history.pushState = function myPushState(...args) {
// console.log('=====> pushState call', args, self.pushStateCallbackList)
self.pushStateCallbackList.forEach((cb) => cb());
pushState.apply(history, args);
};
history.pushState.isMy = true;
}
}
checkShouldShowBtn() {
setTimeout(() => {
const shouldShow = location.href.startsWith(this.buildUrl);
this.btn.style.display = shouldShow ? "inline-block" : "none";
if (shouldShow) {
setTimeout(() => this.clickFirstRow(), 3000);
}
}, 2000);
}
sendForSRM() {
fetch(
"https://devops-cloud.bgy.com.cn/next/api/gateway/pipeline.pipeline.Execute/api/pipeline/v1/projects/5f6c900f4251e/pipelines/5f6c903b924f0/execute",
{
headers: {
accept: "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"cache-control": "no-cache",
"content-type": "application/json",
lang: "zh",
pragma: "no-cache",
"sec-ch-ua":
'"Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
},
referrer:
"https://devops-cloud.bgy.com.cn/next/ci/project/5f6c900f4251e/build",
referrerPolicy: "strict-origin-when-cross-origin",
body: `{"inputs":[{"name":"env_param","value":"${this.isProd ? 'prod' : 'uat'}"}],"branch":"${this.isProd ? 'prod' : 'uat'}"}`,
method: "POST",
mode: "cors",
credentials: "include",
}
);
const isBuildingDetail = /build\/\w+$/.test(location.href);
setTimeout(() => {
let buildListUrl = "";
if (!isBuildingDetail) {
buildListUrl = location.href;
} else {
buildListUrl = location.href.replace(/build\/\w+$/, "build");
}
location.href = buildListUrl + "?clickfirst=1";
}, 1000);
}
sendForINT() {
fetch("https://devops-cloud.bgy.com.cn/next/api/gateway/pipeline.pipeline.Execute/api/pipeline/v1/projects/5f6a0872bfc2b/pipelines/5f6a08ea27a78/execute", {
"headers": {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"content-type": "application/json",
"lang": "zh",
"sec-ch-ua": "\"Not/A)Brand\";v=\"99\", \"Google Chrome\";v=\"115\", \"Chromium\";v=\"115\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin"
},
"referrer": "https://devops-cloud.bgy.com.cn/next/ci/project/5f6a0872bfc2b/build",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": "{\"inputs\":[{\"name\":\"env_param\",\"value\":\"uat\"}],\"branch\":\"uat\"}",
"method": "POST",
"mode": "cors",
"credentials": "include"
});
const isBuildingDetail = /build\/\w+$/.test(location.href);
setTimeout(() => {
let buildListUrl = "";
if (!isBuildingDetail) {
buildListUrl = location.href;
} else {
buildListUrl = location.href.replace(/build\/\w+$/, "build");
}
location.href = buildListUrl + "?clickfirst=1";
}, 1000);
}
clickFirstRow() {
const uparams = new URLSearchParams(location.search.replace(/^\?/, ""));
if (!uparams.get("clickfirst")) return;
const link = document.querySelector(
".ant-table-tbody tr:nth-child(2) a:first-child"
);
if (!link) {
console.log("not found first row link");
return;
}
link.click();
}
sendForISP() {
fetch(
"https://devops-cloud.bgy.com.cn/next/api/gateway/pipeline.pipeline.Execute/api/pipeline/v1/projects/5de90b7183a5b/pipelines/5f1f7ed6f1977/execute",
{
headers: {
accept: "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"cache-control": "no-cache",
"content-type": "application/json",
lang: "zh",
pragma: "no-cache",
"sec-ch-ua":
'"Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
},
referrer:
"https://devops-cloud.bgy.com.cn/next/ci/project/5de90b7183a5b/build",
referrerPolicy: "strict-origin-when-cross-origin",
body: '{"inputs":[{"name":"env_param","value":"uat"}],"branch":"uat"}',
method: "POST",
mode: "cors",
credentials: "include",
}
);
const isBuildingDetail = /build\/\w+$/.test(location.href);
setTimeout(() => {
let buildListUrl = "";
if (!isBuildingDetail) {
buildListUrl = location.href;
} else {
buildListUrl = location.href.replace(/build\/\w+$/, "build");
}
location.href = buildListUrl + "?clickfirst=1";
}, 1000);
}
sendForGysSrm() {
fetch("https://devops-cloud.bgy.com.cn/next/api/gateway/pipeline.pipeline.Execute/api/pipeline/v1/projects/5f70e768c3590/pipelines/5f70e769f11f9/execute", {
"headers": {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"cache-control": "no-cache",
"content-type": "application/json",
"lang": "zh",
"pragma": "no-cache",
"sec-ch-ua": "\"Not/A)Brand\";v=\"99\", \"Google Chrome\";v=\"115\", \"Chromium\";v=\"115\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin"
},
"referrer": "https://devops-cloud.bgy.com.cn/next/ci/project/5f70e768c3590/build",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": "{\"inputs\":[{\"name\":\"env_param\",\"value\":\"uat\"}],\"branch\":\"uat\"}",
"method": "POST",
"mode": "cors",
"credentials": "include"
});
const isBuildingDetail = /build\/\w+$/.test(location.href);
setTimeout(() => {
let buildListUrl = "";
if (!isBuildingDetail) {
buildListUrl = location.href;
} else {
buildListUrl = location.href.replace(/build\/\w+$/, "build");
}
location.href = buildListUrl + "?clickfirst=1";
}, 1000);
}
send() {
const sends = {
srm: this.sendForSRM,
isp: this.sendForISP,
int: this.sendForINT,
'gys-srm': this.sendForGysSrm,
};
const send = sends[this.sysName];
if (send) {
send.call(this);
}
}
}
const srmBuild = new DevopsBuild("srm");
srmBuild.start();
const srmProdBuild = new DevopsBuild("srm", true);
srmProdBuild.start();
const ispBuild = new DevopsBuild("isp");
ispBuild.start();
const intBuild = new DevopsBuild("int");
intBuild.start();
const gyssrmBuild = new DevopsBuild("gys-srm");
gyssrmBuild.start();
// isp uat 登录(不可用)自动填充
class FormFiller {
constructor(enableUrl, values, btn) {
this.url = enableUrl;
this.values = values;
this.btn = btn;
}
element(selector) {
return document.querySelector(selector);
}
fill() {
const inputSelectors = Object.keys(this.values);
const inputValues = Object.values(this.values);
inputSelectors.forEach((inpSelctor, i) => {
const input = this.element(inpSelctor);
if (input) {
input.value = inputValues[i];
} else {
console.log("not found element for", inpSelctor);
}
});
}
submit() {
if (this.btn.selector) {
const submitBtn = this.element(this.btn.selector);
submitBtn?.click();
return;
}
console.log("not found submitBtn cancel", this.btn); // debug only
}
createBtn() {
// if (this.mybtn) return;
const btn = document.createElement("button");
btn.textContent = this.btn.text || "Submit";
btn.className = "mybtn";
btn.style =
"position: fixed; right: 250px; font-size: 30px; z-index: 100; top: 0; border: 0; background: aliceblue; color: coral; padding: 0 20px; border-radius: 5px; cursor: pointer;";
document.body.appendChild(btn);
// this.mybtn = btn;
return btn;
}
start() {
if (location.href.includes(this.url) === false) return;
this.mybtn = this.createBtn();
this.mybtn.addEventListener("click", () => {
this.fill();
this.submit();
});
}
}
const ISPUatFormFiller = new FormFiller(
"https://ssploginuat.",
{
"#j_username": "gys_zengzhaohua",
"#j_password": "0Jqg0eny",
},
{
selector: ".loginBt",
text: "zengzhaohua Login",
}
);
ISPUatFormFiller.start();
const SRMUatFormFiller = new FormFiller(
"https://loginuat.countrygarden.com.cn/idp/authcenter",
{
"#j_username": "penghaitao01",
"#j_password": "password",
},
{
selector: ".loginBt",
text: "penghaitao Login",
}
);
SRMUatFormFiller.start()
const SRMProdFormFiller = new FormFiller(
"/idp/authcenter/ActionAuth",
{
"#j_username": "gys_zengzhaohua",
},
{
selector: ".loginBt",
text: "zengzhaohua Login",
}
);
//SRMProdFormFiller.start()
// 选择供应商
class SupplierSelector {
constructor(enableUrl, values, submitBtnSelector, selectSelector) {
this.url = enableUrl;
this.values = values;
this.submitBtnSelector = submitBtnSelector
this.selectSelector = selectSelector;
}
element(selector) {
return document.querySelector(selector);
}
fill(val) {
this.element(this.selectSelector).value = val;
}
submit() {
this.element(this.submitBtnSelector).click();
}
createBtns() {
// if (this.mybtn) return;
const actionDiv = document.createElement("div");
actionDiv.className = "actions";
actionDiv.style =
"position: fixed; left: 550px; z-index: 100000; top: 0;";
const btnStyle =
"font-size: 20px; border: 0; background: aliceblue; color: coral; padding: 0 20px; border-radius: 5px; cursor: pointer; margin: 0 10px;";
this.values.forEach((option) => {
const btn = document.createElement("button");
btn.className = "mybtn" + option.val;
btn.textContent = option.text;
btn.style = btnStyle;
actionDiv.appendChild(btn);
btn.addEventListener("click", () => {
this.fill(option.val);
this.submit();
actionDiv.style.display = 'none'
});
});
document.body.appendChild(actionDiv);
}
start() {
if (typeof this.url === 'string' && location.href.includes(this.url) === false) return;
if (this.url instanceof RegExp && this.url.test(location.href) === false) return;
this.createBtns();
}
}
const supplierAutoSelector = new SupplierSelector(
/sispuat.countrygarden.com.cn\/[^?]*?\?access_token=/,
[
{ val: "1566579841157664769", text: "中建三局" },
{ val: "1566700513699684354", text: "广东腾越" },
{ val: "1572034947512098817", text: "测试供应商001" },
{ val: "1566761465878519810", text: "四川建设" },
{ val: "1566723359788359681", text: "佛山科达机电" },
],
".el-message-box__btns .el-button",
"#supplierSselect"
);
supplierAutoSelector.start();
function redirectToISPUATTenderList(canTryTimes) {
if (!canTryTimes) return
if (location.href === 'https://sispuat.countrygarden.com.cn/#/Home') {
setTimeout(() => {
location.href = 'https://sispuat.countrygarden.com.cn/#/isp/tender-list'
}, 1000)
} else {
setTimeout(() => redirectToISPUATTenderList(canTryTimes - 1), 1000);
}
}
redirectToISPUATTenderList(100)
})();
(function () {
function clearStorageAndCookie(isrefresh = true) {
[sessionStorage, localStorage].forEach((storage) => storage.clear());
clearCookies();
console.log(document.cookie, "done!!");
isrefresh && setTimeout(location.reload.bind(location), 1000);
}
function pick(data, keys) {
return keys.reduce((ret, key) => {
ret[key] = data[key];
return ret;
}, {});
}
function setLocalStorage(data) {
Object.keys(data).forEach((key) => {
localStorage[key] = data[key];
});
console.log("done", localStorage);
}
function getCookies() {
return document.cookie.match(/[\w-]+(?=\=[^;]+)/g) || [];
}
function clearCookies() {
getCookies().forEach((cname) => {
delCookie(cname);
});
}
function setCookie(cname, cvalue, exdays) {
const d = new Date();
d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);
const expires = "; Expires=" + d.toUTCString();
// document.cookie = cname + "=" + cvalue + expires + "; Path=/";
document.cookie = cname + "=" + cvalue + expires;
}
function delCookie(cname) {
console.log("del cookie:", cname);
setCookie(cname, "", -1);
}
function copy(str) {
const el = document.createElement("textarea");
el.value = str;
el.setAttribute("readonly", "");
el.style.position = "absolute";
el.style.left = "-9999px";
document.body.appendChild(el);
el.select();
document.execCommand("copy");
document.body.removeChild(el);
}
function setDebugSwitch(key, val = 1) {
// localStorage.debug = localStorage.debug + 'schema;domain;zxhbEdit=1'
const debugval = localStorage.debug || ''
const pairs = debugval.split(';').map(pair => pair.includes('=') ? pair.split('=') : (pair + '=true').split('='))
const conf = Object.fromEntries(pairs)
conf[key] = val
console.log('new conf:', conf)
const entriesVal = Object.entries(conf).map(pair => pair.join('=')).join(';')
localStorage.debug = entriesVal
}
function debugDomainSchema() {
setDebugSwitch('domain')
setDebugSwitch('schema')
}
function copyISPSupplierInfo() {
copy(
`localStorage.gys_cur_supplier_info = ${JSON.stringify(
localStorage.gys_cur_supplier_info
)}; setTimeout(() => location.reload(), 1000);`
);
console.log("copy done");
}
function getSchema(data = {}) {
const result = Object.keys(data)
.sort()
.reduce((ret, key) => {
return ret + `${key} ${data[key].title}\n`;
}, "");
console.log(result);
copy(result);
}
function toUnicode(str) {
const ls = str.split("");
const result = ls
.map((c) => {
if (/\w/.test(c)) return c;
return "\\u" + c.charCodeAt(0).toString(16).toUpperCase();
})
.join("");
copy(result);
console.log("copy done");
return result;
}
function getk2Params() {
return Object.assign({}, window.KStarForm.vmFormData.vmFormContent);
}
function isPlainObject(val) {
return Object.prototype.toString.call(val).slice(8, -1) === "Object";
}
function getTableTypeDefines(vm) {
const { tableData, schema } = vm.props ?? {};
if (!tableData) {
console.warn("not tableData found:", vm.props);
return;
}
return getTypeDefines(tableData[0], schema);
}
function getTypeDefines(obj = {}, schema = false, level = 10) {
// if (Array.isArray(obj)) {
// if (obj.length === 0) {
// return 'Array<any>'
// }
// return `Array<${getTypeDefines(obj[0], schema, level - 1)}>`
// }
if (Array.isArray(obj)) {
obj = obj[0];
}
const getPrimativeType = (key, val) => {
let type = typeof val;
let text = "";
if (!schema) {
return { type, text };
}
const props = schema.properties ?? {};
if (props[key]) {
type = props[key].type;
text = props[key].title;
}
return { type, text };
};
let ret = "{\n";
Object.keys(obj).forEach((key) => {
if (key.startsWith("_")) return;
const val = obj[key];
const isPrimative = !isPlainObject(val) && !Array.isArray(val);
let title = "";
let valType;
if (isPrimative) {
const { type, text } = getPrimativeType(key, val);
valType = type;
title = text;
} else {
valType = getTypeDefines(val, schema);
}
const keyDefine = `${key}: ${valType};${title ? " // " + title : ""}\n`;
ret += keyDefine;
});
ret += "\n}";
copy(ret);
console.log("copy done!");
return ret;
}
window.my = {
getTableTypeDefines,
getk2Params,
toUnicode,
getSchema,
copyISPSupplierInfo,
setLocalStorage,
pick,
clearStorageAndCookie,
setDebugSwitch,
debugDomainSchema,
}
})();