// ==UserScript== // @name 京东ck获取并提交到青龙_后台 // @namespace jdck // @version 0.1.1 // @description 获取京东的ck并提交到青龙面板,需要提交时点击一次运行脚本,需要配置面板client // @author 王一之 // @grant GM_cookie // @grant GM_addValueChangeListener // @grant GM_setValue // @grant GM_getValue // @grant GM_notification // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @connect jd.com // @background // ==/UserScript== /* ==UserConfig== 青龙配置: push: title: 是否推送 description: 开启后,不会通知直接推送到青龙面板 default: false url: title: 青龙面板地址 description: '青龙面板地址,例如: http://127.0.0.1:1080' clientId: title: clientId description: 请在 系统设置->应用设置 添加应用,然后复制client id值 clientSecret: title: clientSecret description: 请在 系统设置->应用设置 添加应用,然后复制client secret值 ckName: title: ck变量名称 description: 京东ck的变量名称 default: JD_COOKIE ==/UserConfig== */ function getCk() { return new Promise((resolve, reject) => { let jdCookie = ''; GM_cookie('list', { domain: '.jd.com', name: "pt_key" }, (item) => { if (item.length == 0) { return reject(); } jdCookie = "pt_key=" + item[0].value; GM_cookie('list', { domain: '.jd.com', name: "pt_pin" }, (item) => { if (item.length == 0) { return reject(); } jdCookie += ";pt_pin=" + item[0].value + ";"; resolve(jdCookie); }); }); }); } function ajax(method, url, token, data) { return new Promise((resolve, reject) => { let headers = {}; if (method != 'get') { headers['Content-Type'] = 'application/json'; } if (token) { headers['Authorization'] = 'Bearer ' + token; } GM_xmlhttpRequest({ url: url, method: method, data: JSON.stringify(data), headers: headers, onload(resp) { let code = resp.response.code || 'unknow'; let msg = resp.response.message || 'unkonw'; if (resp.status == 200) { if (code == 200) { resolve(resp.response); } else { reject(msg); } } else { reject(msg); } }, onerror(resp) { console.log(resp); } }); }); } function updateToken() { return new Promise(async (resolve, reject) => { let url = GM_getValue('青龙配置.url'); let clientId = GM_getValue('青龙配置.clientId'); let clientSecret = GM_getValue('青龙配置.clientSecret'); try { let resp = await ajax('get', url + '/open/auth/token?client_id=' + clientId + '&client_secret=' + clientSecret); token = resp.data.token; GM_setValue('ql.token', token); GM_setValue('ql.expiration', resp.data.expiration); resolve(token); } catch (e) { return reject(e); } }); } function updateCk(ckName, ck, token) { return new Promise(async (resolve, reject) => { try { let url = GM_getValue('青龙配置.url'); let resp = await ajax('get', url + '/open/envs?searchValue=' + ckName, token) if (resp.data.length) { await ajax('put', url + '/open/envs', token, { "name": ckName, "value": ck, "remarks": ckName + ' by ScriptCat', "_id": resp.data[0]._id }); } else { await ajax('post', url + '/open/envs', token, [{ "name": ckName, "value": ck, "remarks": ckName + ' by ScriptCat' }]); } resolve(); } catch (e) { reject(e); } }); } function setQlCk(ck) { return new Promise(async (resolve, reject) => { //获取青龙token let url = GM_getValue('青龙配置.url'); if (!url) { return reject('请配置青龙地址'); } let ckName = GM_getValue('青龙配置.ckName'); let token = GM_getValue('ql.token'); let expiration = GM_getValue('ql.expiration'); if (!token || expiration < (new Date().getTime() / 1000) - 1000) { token = await updateToken(); } try { await updateCk(ckName, ck, token); } catch (e) { if (e == 'UnauthorizedError') { try { token = await updateToken(); await updateCk(ckName, ck, token); } catch (e) { reject(e); } } return reject(e); } }); } return new Promise(async (resolve, reject) => { GM_addValueChangeListener('push-ck', (name, oldval, newval) => { getCk().then(ck => { GM_setClipboard(ck); GM_setValue('jdck', ck); if (GM_getValue('青龙配置.push')) { setQlCk(ck).then(resp => { GM_notification({ title: '京东ck获取并提交到青龙', text: '以将ck复制到了剪辑版,青龙面板推送成功' }); }).catch(e => { GM_notification({ title: '京东ck获取并提交到青龙', text: '以将ck复制到了剪辑版,青龙面板推送失败:' + e, }); }); } else { GM_notification({ title: '京东ck获取并提交到青龙', text: '以将ck复制到了剪辑版,请确定是否还要继续自动提交到青龙面板', buttons: [{ title: '提交', }, { title: '取消' }], onclick(id, index) { if (index === 0) { //获取client并推送到青龙 setQlCk(ck).catch(e => { GM_notification({ title: '京东ck获取并提交到青龙', text: '以将ck复制到了剪辑版,青龙面板推送失败:' + e, }); }); } } }); } }).catch(res => { GM_notification({ title: '京东ck获取并提交到青龙', text: '京东ck获取失败,请确定是否登录', }); }); }); });