QQ、支付宝、#东等网站默认使用账号密码登录,不出现二维码登录界面,可自定义设置在指定网站开启和关闭,有需求或问题请反馈。
// ==UserScript== // @name 拒绝二维码登录 // @namespace NoQRCodeLogin // @version 3.1.1 // @description QQ、支付宝、#东等网站默认使用账号密码登录,不出现二维码登录界面,可自定义设置在指定网站开启和关闭,有需求或问题请反馈。 // @author Eva // @license GPL // @match *://passport.jd.com/* // @match *://*.baidu.com/* // @match *://*.douban.com/* // @match *://passport.suning.com/* // @match *://*.zhihu.com/* // @match *://*.alipay.com/* // @match *://account.aliyun.com/* // @match *://*.qq.com/* // @match *://*.weiyun.com/* // @match *://*.cloud.tencent.com/* // @match *://*.qcloud.com/* // @match *://mp.weixin.qq.com/* // @match *://www.acfun.cn/* // @match *://music.163.com/* // @match *://you.163.com/* // @match *://*.douyu.com/* // @match *://*.huya.com/* // @match *://*.s###m.com/* // @match *://ipassport.kaola.com/* // @match *://login.10086.cn/* // @match *://mail.10086.cn/* // @match *://*.e.189.cn/* // @match *://js.189.cn/* // @match *://*.aliyundrive.com/* // @match *://passport.csdn.net/* // @match *://account.dianping.com/* // @match *://etax.#####tax.gov.cn/* // @match *://*.115.com/* // @match *://*.tianya.cn/* // @match *://*.dnspod.cn/* // @match *://www.qcc.com/* // @match *://mms.pinduoduo.com/* // @match *://passport.shop.jd.com/* // @match *://*.tyrz.gd.gov.cn/* // @match *://*.baixing.com/* // @match *://*.passport.sangon.com/* // @match *://*.passport.21cnjy.com/* // @match *://login.xueanquan.com/* // @match *://account.geekbang.org/* // @match *://*.icourse163.org/* // @match *://*.ziroom.com/* // @match *://*.fuwu.nhsa.gov.cn/* // @match *://bbs.nga.cn/* // @match *://ngabbs.com/* // @match *://nga.178.com/* // @match *://www.ouryao.com/* // @match *://leetcode.cn/* // @match *://home.51cto.com/* // @match *://*.manmanbuy.com/* // @match *://uc.#####z.com/* // @match *://pan.quark.cn/* // @match *://passport.oray.com/* // @match *://xueqiu.com/* // @match *://www.hqwx.com/* // @match *://passport.cbi360.net/* // @match *://shb3144.eapps.dingtalkcloud.com/* // @match *://oapi.dingtalk.com/* // @grant unsafeWindow // @grant GM_getValue // @grant GM_setValue // @grant GM.deleteValue // @grant GM_registerMenuCommand // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js // @run-at document-end // ==/UserScript== (function () { // 注册菜单 GM_registerMenuCommand("拒绝二维码登录开关设置", () => { const settings = new Settings() settings.show() }) // 定义默认配置 const settingData = { 'jd': { 'name': '#东', 'url': 'passport.jd.com', 'enabled': true }, 'baidu': { 'name': '百度', 'url': 'baidu.com', 'enabled': true }, 'douban': { 'name': '豆瓣', 'url': 'douban.com', 'enabled': true }, 'suning': { 'name': '苏宁易购', 'url': 'passport.suning.com', 'enabled': true }, 'zhihu': { 'name': '知乎', 'url': 'zhihu.com', 'enabled': true }, 'alipay': { 'name': '支付宝', 'url': 'alipay.com', 'enabled': true }, 'aliyun': { 'name': '阿里云', 'url': 'account.aliyun.com', 'enabled': true }, 'qq': { 'name': '腾讯QQ(含微云)', 'url': ['xui.ptlogin2.qq.com', 'ssl.xui.ptlogin2.qq.com', 'ssl.xui.ptlogin2.weiyun.com', 'ui.ptlogin2.qq.com'], 'enabled': true }, 'qq_support': { 'name': '腾讯兔小巢', 'url': 'support.qq.com', 'enabled': true }, 'tencent_cloud': { 'name': '腾讯云', 'url': ['cloud.tencent.com', 'qcloud.com'], 'enabled': true }, 'qq_exmail': { 'name': '腾讯企业邮箱', 'url': 'exmail.qq.com', 'enabled': true }, 'weixin_pay': { 'name': '微信支付', 'url': 'pay.weixin.qq.com', 'enabled': true }, 'weixin_mp': { 'name': '微信公众##', 'url': 'mp.weixin.qq.com', 'enabled': true }, 'acfun': { 'name': 'AcFun', 'url': 'www.acfun.cn', 'enabled': true }, 'netease_music': { 'name': '网易云音乐', 'url': 'music.163.com', 'enabled': true }, 'netease_you': { 'name': '网易严选', 'url': 'you.163.com', 'enabled': true }, 'douyu': { 'name': '斗鱼', 'url': 'douyu.com', 'enabled': true }, 'huya': { 'name': '虎牙直播', 'url': 'huya.com', 'enabled': true }, 's###m': { 'name': '什么值得买', 'url': 's###m.com', 'enabled': true }, 'kaola': { 'name': '考拉海购', 'url': 'ipassport.kaola.com', 'enabled': true }, '10086': { 'name': '##移动', 'url': 'login.10086.cn', 'enabled': true }, '10086_mail': { 'name': '139邮箱', 'url': 'mail.10086.cn', 'enabled': true }, '189_e': { 'name': '天翼云盘', 'url': 'open.e.189.cn', 'enabled': true }, '189_js': { 'name': '江苏电信', 'url': 'js.189.cn', 'enabled': true }, 'aliyundrive': { 'name': '阿里云盘', 'url': 'aliyundrive.com', 'enabled': true }, 'csdn': { 'name': 'CSDN', 'url': 'passport.csdn.net', 'enabled': true }, 'dianping': { 'name': '大众点评', 'url': 'account.dianping.com', 'enabled': true }, '#####tax': { 'name': '自然人电子税务局', 'url': 'etax.#####tax.gov.cn', 'enabled': true }, '115': { 'name': '115云', 'url': '115.com', 'enabled': true }, 'tianya': { 'name': '##社区', 'url': 'tianya.cn', 'enabled': true }, 'dnspod': { 'name': 'DNSPod', 'url': 'dnspod.cn', 'enabled': true }, 'qcc': { 'name': '企查查', 'url': 'www.qcc.com', 'enabled': true }, 'pinduoduo_mms': { 'name': '拼多多商家', 'url': 'mms.pinduoduo.com', 'enabled': true }, 'jd_shop': { 'name': '#麦', 'url': 'passport.shop.jd.com', 'enabled': true }, 'gd_tyrz': { 'name': '广东统一身份认证', 'url': 'tyrz.gd.gov.cn', 'enabled': true }, 'baixing': { 'name': '百姓网', 'url': 'baixing.com', 'enabled': true }, 'sangon': { 'name': '生工', 'url': 'passport.sangon.com', 'enabled': true }, '21cnjy': { 'name': '21世纪教育', 'url': 'passport.21cnjy.com', 'enabled': true }, 'xueanquan': { 'name': '学校安全教育##', 'url': 'login.xueanquan.com', 'enabled': true }, 'geekbang': { 'name': '极客邦科技', 'url': 'account.geekbang.org', 'enabled': true }, 'icourse163': { 'name': '##大学MOOC', 'url': 'icourse163.org', 'enabled': true }, 'ziroom': { 'name': '自如', 'url': 'ziroom.com', 'enabled': true }, 'nhsa_fuwu': { 'name': '国家医保服务##', 'url': 'fuwu.nhsa.gov.cn', 'enabled': true }, 'nga': { 'name': 'NGA玩家社群', 'url': ['bbs.nga.cn', 'ngabbs.com', 'nga.178.com'], 'enabled': true }, 'ouryao': { 'name': '蒲公英论坛', 'url': 'ouryao.com', 'enabled': true }, 'leetcode_cn': { 'name': '力扣##', 'url': 'leetcode.cn', 'enabled': true }, '51cto': { 'name': '51CTO', 'url': 'home.51cto.com', 'enabled': true }, 'manmanbuy': { 'name': '慢慢买', 'url': ['home.manmanbuy.com', 'home-test.manmanbuy.com'], 'enabled': true }, '#####z': { 'name': '站长工具', 'url': 'uc.#####z.com', 'enabled': true }, 'quark_pan': { 'name': '夸克网盘', 'url': 'pan.quark.cn', 'enabled': true }, 'oray': { 'name': '贝锐', 'url': 'passport.oray.com', 'enabled': true }, 'xueqiu': { 'name': '雪球', 'url': 'xueqiu.com', 'enabled': true }, 'hqwx': { 'name': '环球网校', 'url': 'www.hqwx.com', 'enabled': true }, 'cbi360': { 'name': '建设通', 'url': 'passport.cbi360.net', 'enabled': true }, 'shb': { 'name': '售后宝', 'url': 'shb3144.eapps.dingtalkcloud.com', 'enabled': true }, 'dingtalk_oauth2': { 'name': '钉钉单点登录', 'url': 'oapi.dingtalk.com', 'enabled': true }, } const _main = main() // 检查更新当前用户配置,并返回最新用户配置 const storageData = checkSettingUpdate() start() function start() { const current = window.location.hostname let match = false for (const key in storageData) { const data = storageData[key] const url = data.url const enabled = data.enabled if (Array.isArray(url)) { url.forEach(x => { if (current.includes(x)) { console.log("网址:%s 可切换为密码登录,状态:%s", x, enabled ? '启用' : '禁用') match = true if (enabled) _main[key]() return } }) if (match) break } else { if (current.includes(url)) { console.log("网址:%s 可切换为密码登录,状态:%s", url, enabled ? '启用' : '禁用') if (enabled) _main[key]() break } } } } function main() { return { // #东 jd() { const targetNode = $('.login-box')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).css('display') === 'none') { $('.login-tab-r')[0].click() // 停止观察 observer.disconnect() } } } }) }, // 百度 baidu() { const targetNode = document.body observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'childList') { const addedNodes = Array.from(mutation.addedNodes) addedNodes.forEach(() => { const btn = $('[id^=TANGRAM__PSP_][id$=__footerULoginBtn]') if (btn.length > 0) { setTimeout(() => btn.trigger("click"), 100) // 停止观察 observer.disconnect() } }) } } }) }, // 豆瓣 douban() { const targetNode = $('.account-tab-account')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).hasClass('on')) { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // 苏宁易购 suning() { const targetNode = $('.pc-login')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).css('display') === 'none') { $('.login-tab .tab-item')[1].click() // 停止观察 observer.disconnect() } } } }) }, // 知乎 zhihu() { const process = () => { const targetNode = $('.SignFlow-tab:contains("密码登录")').map(function () { if ($(this).text() == "密码登录") return this })[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).hasClass('SignFlow-tab--active')) { targetNode.click() // 停止观察 observer.disconnect() } } } }) } process() const targetNode = document.body observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'childList') { const addedNodes = Array.from(mutation.addedNodes) addedNodes.forEach((node) => { if ($(node).find('.SignContainer-content').length > 0) { process() // 停止观察 observer.disconnect() } }) } } }) }, // 支付宝 alipay() { // 右上角登录按钮 const processEntry = () => { const targetNode = $('li[data-status="show_login"]')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).hasClass(' active ')) { setTimeout(() => targetNode.click(), 150) // 停止观察 observer.disconnect() } } } }) } // 通用 const processNormal = () => { const targetNode = $('#J-qrcode-target')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).hasClass('qrcode-target-hide')) { setTimeout(() => targetNode.click(), 500) // 停止观察 observer.disconnect() } } } }) } // iframe 登录 const processIframe = () => { const targetNode = $('#J_popbox')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).hasClass('stat-login')) { const iframe = $('#J_loginIframe') const method = iframe.contents().find('#J-loginFormMethod') const target = iframe.contents().find('#J-qrcode-target') if (method.length > 0 && target.length > 0) { if (target.hasClass('qrcode-target-hide')) { setTimeout(() => target[0].click(), 500) } // 停止观察 observer.disconnect() } } } } }) } // 收银台 const excashier = () => { const targetNode = $('#J_tip_qr')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).css('display') === 'block') { setTimeout(() => $('a[seed="J_tip_qr-switchTipBtn"]')[0].click(), 150) // 停止观察 observer.disconnect() } } } }) } if (matchURL('excashier.alipay.com')) { excashier() } else { processEntry() processNormal() processIframe() } }, // 阿里云 aliyun() { const targetNode = $('.aliyun-account-consoleicon-user')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).closest('.tabs-item').hasClass('active')) { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // 腾讯 QQ(包含微云) qq() { const targetNode = $('#bottom_qlogin')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).css('display') === 'block') { $('#switcher_plogin')[0].click() // 停止观察 observer.disconnect() } } } }) }, // 腾讯兔小巢 qq_support() { const targetNode = $('.t-checkbox__former')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).prop('checked')) { targetNode.click() setTimeout(() => $('.super_login_qq_link')[0].click(), 0) // 停止观察 observer.disconnect() } } } }) }, // 腾讯云 tencent_cloud() { const process = (observer) => { const btn = $(btnElement) if (btn.length > 0 && !btn.closest('.accsys-tp-tabs__item').hasClass('is-active')) { setTimeout(() => btn.trigger("click"), 100) // 停止观察 observer.disconnect() return true } return false } const targetNode = document.body const btnElement = '.accsys-tp-tabs__item-label:contains("邮箱登录")' observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (!process(observer)) { if (mutation.type === 'childList') { const addedNodes = Array.from(mutation.addedNodes) addedNodes.forEach(() => process(observer)) } } } }) }, // 腾讯企业邮箱 qq_exmail() { const targetNode = $('.login_account_pwd_panel')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).css('display') === 'none') { $('.js_show_pwd_panel')[0].click() // 停止观察 observer.disconnect() } } } }) }, // 微信支付 weixin_pay() { const targetNode = $('#IDSwitchAccountLogin')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).hasClass('selected')) { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // 微信公众## weixin_mp() { const targetNode = $('.login__type__container__account')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).css('display') === 'none') { $('.login__type__container__scan a')[0].click() // 停止观察 observer.disconnect() } } } }) }, // AcFun acfun() { const targetNode = $('#login')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).hasClass('login-account')) { $('#login-switch').click() // 停止观察 observer.disconnect() } } } }) }, // 网易云音乐 netease_music() { $('body').bind('DOMNodeInserted', (e) => { const switchBtn = $(e.target).find('a:contains("选择其他登录模式")') const termBtn = $(e.target).find('#j-official-terms') if (switchBtn.length > 0) { setTimeout(() => switchBtn[0].click(), 0) } if (termBtn.length > 0) { setTimeout(() => { termBtn[0].click() $('a:contains("网易邮箱帐号登录")')[0].click() }, 0) } }) }, // 网易严选 netease_you() { $('body').bind('DOMNodeInserted', (e) => { if ($(e.target).hasClass('j-yx-loginBox') && $(e.target).css('display') === 'none') { setTimeout(() => $(e.target).find('.j-yx-qrLogin')[0].click(), 1000) } }) }, // 斗鱼 douyu() { const process = () => { const targetNode = $('.scancode-login')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).hasClass('status-scan')) { setTimeout(() => $(".scanicon-toLogin")[0].click(), 100) $(".inputLoginBtn").on('click', () => { const nickname = $('.loginbox-login-subtype').find('[data-subtype="login-by-nickname"]') if (nickname && !nickname.hasClass('active')) { setTimeout(() => nickname[0].click(), 100) } }) // 停止观察 observer.disconnect() } } } }) } process() $('body').bind('DOMNodeInserted', (e) => { if ($(e.target).find('.scancode-login').length > 0) { process() } }) }, // 虎牙直播 huya() { const targetNode = $('#quick-login-wrap')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).css('display') != 'none') { $(targetNode).find('.change-login i')[0].click() // 停止观察 observer.disconnect() } } } }) }, // 什么值得买 s###m() { const targetNode = $('.login')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).css('display') === 'none') { $('.qrcode-change')[0].click() // 停止观察 observer.disconnect() } } } }) }, // 考拉海购 kaola() { const passwordLogin = () => { const targetNode = $('#login')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).hasClass('login-view-sms')) { $(targetNode).find('.password-login-tab-item')[0].click() // 停止观察 observer.disconnect() } } } }) } const targetNode = $('.icon-sms')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).length > 0) { targetNode.click() // 停止观察 observer.disconnect() passwordLogin() } } } }) }, // ##移动 10086() { const targetNode = $('#J_pc')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).css('display') != 'none') { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // 139 邮箱 '10086_mail'() { const targetNode = $('#Account')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).hasClass('on')) { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // 天翼云盘 '189_e'() { const targetNode = document.body observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { const btn = $(targetNode).find('#tab-pw') if (btn.length > 0 && !btn.hasClass('current')) { btn[0].click() // 停止观察 observer.disconnect() } } } }) }, // 江苏电信 '189_js'() { const targetNode = $('.login_con.mobile')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).css('display') === 'none') { $('#menu1 li')[0].click() // 停止观察 observer.disconnect() } } } }) }, // 阿里云盘 aliyundrive() { const targetNode = $('#login .login-blocks.block0').find(':contains("账号登录")')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).prop("nodeName") == 'A') { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // CSDN csdn() { const targetNode = $('.login-box-tabs-items')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { const btn = $(targetNode).find('span:contains(密码登录)') if (btn.length > 0) { btn[0].click() // 停止观察 observer.disconnect() } } } }) }, // 大众点评 dianping() { const passwordLogin = () => { const targetNode = $('.pwd')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).children('div').hasClass('segment-label-grey')) { targetNode.click() // 停止观察 observer.disconnect() } } } }) } const targetNode = $('.pc-icon')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).length > 0) { targetNode.click() // 停止观察 observer.disconnect() passwordLogin() } } } }) }, // 自然人电子税务局 #####tax() { $('body').bind('DOMNodeInserted', (e) => { const login_container = $(e.target).find('.password-login-container') if (login_container.css('display') === 'none') { $('.login-mode-text:contains(密码登录)')[0].click() } }) }, // 115 云 115() { const targetNode = document.body observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { const qrcodeBtn = $('a[lgb-nav="qrcode"]') if (qrcodeBtn.length > 0 && qrcodeBtn.css('display') === 'none') { $('a[lgb-nav="login"]')[0].click() // 停止观察 observer.disconnect() } } }) }, // ##社区 tianya() { const process = () => { const targetNode = $('.normal-login-tab')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($('#loginWin_content_wrapper').hasClass('loginWin-qrcode-login-wrapper')) { targetNode.click() // 停止观察 observer.disconnect() } } } }) } process() $('body').bind('DOMNodeInserted', (e) => { if ($(e.target).find('#loginWin_content_wrapper').length > 0) { process() } }) }, // DNSPod dnspod() { const targetNode = $('a[href^="/login/email"]')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).parent('.dp-login__tabitem').hasClass('is-active')) { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // 企查查 qcc() { const login_change = $('.login-change') if (login_change.length > 0 && $('.right-c').css('display') === 'none') { login_change.find('img').click() } const targetNode = $('.login-tab a:contains("密码登录")')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).hasClass('active')) { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // 拼多多商家 pinduoduo_mms() { $('body').bind('DOMNodeInserted', (e) => { const password_section = $(e.target).find('.password-section') if (password_section.length > 0 && password_section.css('display') === 'none') { setTimeout(() => $('.login-tab').find('.tab-item.last-item')[0].click(), 100) } }) }, // #麦 jd_shop() { const targetNode = $('[data-tab-id="form"]')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).hasClass('active')) { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // 广东省统一身份认证## gd_tyrz() { const process = (login_link) => { const nav_active = $('.gd-tabs-nav-active span').text() if (nav_active.includes('个人登录')) { login_link[0].click() } if (nav_active.includes('法人登录')) { if ($('.gd-tabs-pane .qr').length > 0) login_link[1].click() } } const targetNode = $('#app')[0] observe(targetNode, (mutations, observer) => { const login_link = $('a:contains(账号密码)') if (login_link.length > 0) { process(login_link) $('.gd-tabs-nav').on('click', () => { process(login_link) }) // 停止观察 observer.disconnect() } }, { subtree: true, attributeFilter: [] }) }, // 百姓网 baixing() { const targetNode = $('[href="#mobile"]')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).attr('aria-expanded') != 'true') { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // 生工 sangon() { const targetNode = $('.ant-tabs-tab span:contains("密码登录")').map(function () { if ($(this).text() == "密码登录") return this })[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).closest('.ant-tabs-tab').hasClass('ant-tabs-tab-active')) { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // 21 世纪教育 '21cnjy'() { const targetNode = $('.login-method__tab--ac')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if ($(targetNode).css('display') != 'none') { targetNode.click() // 停止观察 observer.disconnect() } } } }) }, // 学校安全教育## xueanquan() { const targetNode = $('#app')[0] observe(targetNode, (mutations, observer) => { mutations.forEach(() => { const btnElement = $('.codelogin-bto') if (btnElement.length > 0) { btnElement[0].click() // 停止观察 observer.disconnect() } }) }) }, // 极客邦科技 geekbang() { $('body').bind('DOMNodeInserted', (e) => { if ($(e.target).hasClass('page-sms-login')) $('a:contains("密码登录")')[0].click() }) }, // ##大学 MOOC icourse163() { $('body').bind('DOMNodeInserted', (e) => { const login = $(e.target).find('.ux-login-set-scan-code_ft_back') if (login.length > 0) login[0].click() }) }, // 自如 ziroom() { $('body').bind('DOMNodeInserted', (e) => { const login_accont = $(e.target).find('.ziroom-login-accont') if (login_accont.length > 0 && login_accont.css('display') === 'none') setTimeout(() => $('#swichAccontHook')[0].click(), 100) }) }, // 国家医保服务## nhsa_fuwu() { $('body').bind('DOMNodeInserted', (e) => { if ($(e.target).find('.code-wrap').length > 0) { $('#iframe').on('load', () => { $('.other-login')[0].click() }) } }) }, // NGA 玩家社区 nga() { if (matchURL('nuke/account_copy.html?login')) { $('body').bind('DOMNodeInserted', (e) => { const btn = $(e.target).find('a:contains("使用密码登录")') if (btn.length > 0) setTimeout(() => btn[0].click(), 0) }) } }, // 蒲公英论坛 ouryao() { if (matchURL('plugin.php')) { const targetNode = $('.login-content li:contains("账号登录")')[0] observe(targetNode, (mutations, observer) => { for (let mutation of mutations) { if (mutation.type === 'attributes') { if (!$(targetNode).hasClass('layui-this')) { setTimeout(() => targetNode.click(), 100) // 停止观察 observer.disconnect() } } } }) } }, // 力扣## leetcode_cn() { $('body').bind('DOMNodeInserted', (e) => { const btn = $(e.target).find('[data-cypress="sign-in-with-password"]') if (btn.length > 0) setTimeout(() => btn[0].click(), 0) }) }, // 51CTO '51cto'() { const targetNode = $('#login-wechat')[0] observe(targetNode, (mutations, observer) => { mutations.forEach((mutation) => { if (mutation.type === 'attributes') { if ($(targetNode).css('display') != 'none') { $(targetNode).find('.password_corner')[0].click() // 停止观察 observer.disconnect() } setTimeout(() => $('.login-type-switch')[1].click(), 100) } }) }) }, // 慢慢买 manmanbuy() { const targetNode = $('#WXAPP')[0] observe(targetNode, (mutations, observer) => { mutations.forEach((mutation) => { if (mutation.type === 'attributes') { if ($(targetNode).closest('.loginWxApp').css('display') === 'block') { $(targetNode)[0].click() // 停止观察 observer.disconnect() } } }) }) }, // 站长工具 #####z() { const targetNode = document.body observe(targetNode, (mutations, observer) => { const el = $('.account-box') if (el.length > 0 && el.css('display') === 'none') { $('.icon-other-account')[0].click() // 停止观察 observer.disconnect() } }) }, // 夸克网盘 quark_pan() { const targetNode = document.body observe(targetNode, (mutations, observer) => { const el = $('.text:contains("手机登录")') if (el.length > 0) { el[0].click() // 停止观察 observer.disconnect() } }) }, // 贝锐 oray() { const targetNode = $('.login-option-item p:contains("帐号/手机")')[0] observe(targetNode, (mutations, observer) => { mutations.forEach((mutation) => { if (mutation.type === 'attributes') { if (!$(targetNode).closest('.login-option-item').hasClass('active')) { setTimeout(() => targetNode.click(), 100) // 停止观察 observer.disconnect() } } }) }) }, // 雪球 xueqiu() { const targetNode = $('#app')[0] observe(targetNode, (mutations, observer) => { setTimeout(() => { const el = $('a:contains("账号密码登录")') if (el.length > 0 && !el.hasClass('newLogin_active_2CK')) { el[0].click() // 停止观察 observer.disconnect() } }, 200) }) }, // 环球网校 hqwx() { const targetNode = $('.gedu-wx-qrcode-box')[0] observe(targetNode, (mutations, observer) => { mutations.forEach((mutation) => { if (mutation.type === 'attributes') { if (!$(targetNode).css('display') != 'none') { setTimeout(() => $('.gedu-wx-qrcode-login-type-item[data-type="mima"]').click(), 100) // 停止观察 observer.disconnect() } } }) }) }, // 建设通 cbi360() { const targetNode = $('.login-id-w')[0] observe(targetNode, (mutations, observer) => { mutations.forEach((mutation) => { if (mutation.type === 'attributes') { if ($(targetNode).parent().css('display') === 'none') { setTimeout(() => $('.home-content-login-nav').find(':contains("账号密码登录")').click(), 100) // 停止观察 observer.disconnect() } } }) }) }, // 售后宝 shb() { const targetNode = $('#app')[0] observe(targetNode, (mutations, observer) => { if ($('.login-box').length > 0 && $('.login-box .login-title').css('display') != 'none') { const targetNode = $('#dingtalk-login-frame')[0] observe(targetNode, (mutations, observer) => { const iframe = $('#iframe_dd') if (iframe.length > 0) { $('button.el-button.tips-color.el-button--text').click() // 停止观察 observer.disconnect() } }) // 停止观察 observer.disconnect() } }) }, // 钉钉 Oauth2 登录 dingtalk_oauth2() { const targetNode = $('a:contains("登录钉钉账号")')[0] observe(targetNode, () => { targetNode.click() }) } } } function observe(targetNode, callback, extendConf) { if (targetNode) { console.log("targetNode", targetNode) targetNode.classList.add('temp') setTimeout(() => targetNode.classList.remove('temp'), 0) } // 观察器的配置(需要观察什么变动) const defaultConf = { childList: true, attributeFilter: ["class", "style"] } const conf = $.extend({}, defaultConf, extendConf) if (extendConf) console.log('observer conf', conf) if (callback) { // 创建一个观察器实例并传入回调函数 const observer = new MutationObserver(callback) // 以上述配置开始观察目标节点 if (targetNode) observer.observe(targetNode, conf) } } //判断网址是否匹配 function matchURL(url) { return window.location.href.includes(url) } function setCookie(c_name, value, expireDays) { const expireDate = new Date() expireDate.setDate(expireDate.getDate() + expireDays) document.cookie = c_name + "=" + escape(value) + ((expireDays == null) ? "" : "expires=" + expireDate.toUTCString() + "path=/") } function getStorageData() { return GM_getValue('NoQRCodeLoginData') } function setStorageData(value) { return GM_setValue('NoQRCodeLoginData', value) } function deleteStorageData() { GM.deleteValue("NoQRCodeLoginData") } function checkSettingUpdate() { // 更新设置 let needUpate = false let storageData = getStorageData() // console.log('默认数据', settingData) // console.log('用户数据', storageData) // 初始化数据 if (!storageData) { needUpate = true storageData = settingData console.log('初始化用户配置', storageData) } // 更新数据 if ($.isPlainObject(storageData)) { const settingDataKeys = Object.keys(settingData) const storageDataKeys = Object.keys(storageData) // 用户配置中比默认配置多的属性,意味着需要删除 storageDataKeys.filter(key => !settingDataKeys.includes(key)).forEach(key => { needUpate = true console.log('删除配置', key, storageData[key]) delete storageData[key] }) for (const item in settingData) { const data = storageData[item] const defaultData = settingData[item] if (data) { // 比较 name 和 url const nameEquals = data.name == defaultData.name const urlEquals = data.url.toString() == defaultData.url.toString() if (!nameEquals) { needUpate = true console.log('更新名称:%s 为 %s', data.name, defaultData.name) data.name = defaultData.name } if (!urlEquals) { needUpate = true console.log('更新[%s]网址:%s 为 %s', data.name, data.url, defaultData.url) data.url = defaultData.url } } else { // 没有则新增 needUpate = true storageData[item] = defaultData console.log('新增配置', item, storageData[item]) } } } // 处理旧数据 if (Array.isArray(storageData)) { needUpate = true let newStorageData = {} for (const item in settingData) { const itemName = settingData[item].name // 旧数据转换为新数据 storageData.forEach(data => { if (data.name == itemName) { newStorageData[item] = data } }) } storageData = newStorageData console.log('更新旧数据格式', storageData) } if (needUpate) setStorageData(storageData) return storageData } class Settings { constructor() { this.init() } mask = $('<div id="settingLayerMask"></div>') ele = $('<div id="settingLayer"></div>') init() { let self = this self.addContent() self.addGlobalStyle() self.mask.append(self.ele) $('body').append(self.mask) self.ele.click((e) => { self.bindClick(e) e.stopPropagation() }) self.mask.click(() => self.hide()) $(document).keyup((e) => { if (e.key === "Escape") self.hide() }) } addContent() { // 各网站开关 const itemList = $('<div id="itemlist"></div>') for (const key in storageData) { const item = storageData[key] const itemDiv = $('<section class="switch"></section>') const checkDiv = $('<div class="checkbox"></div>') if (item.enabled) checkDiv.addClass('on') itemDiv.append($('<span></span>').text(item.name)).append(checkDiv.append($('<input type="checkbox" />').attr('key', key).attr('name', item.name)).append($('<label class="switchLabel"></label>'))) itemList.append(itemDiv) } // 按钮(反馈、保存等) const btnEle = $('<div id="btnEle"></div>') // Greasyfork 反馈按钮 const feedbackGreasyforkEle = $('<span class="feedback"></span>').append($('<a target="_blank" href="https://greasyfork.org/zh-CN/scripts/37988-%E6%8B%92%E7%BB%9D%E4%BA%8C%E7%BB%B4%E7%A0%81%E7%99%BB%E5%BD%95">反馈 Greasy Fork</a>')) // 保存按钮 const saveEle = $('<span id="noqrlogin-save" title="save & close">保存并关闭</span>') // 关闭按钮 const closeEle = $('<span id="noqrlogin-close" title="close 关闭"></span>') this.ele.append(itemList).append(btnEle.append($('<div class="btnEleLayer"></div>').append(feedbackGreasyforkEle).append(saveEle))).append(closeEle) } show() { let self = this setTimeout(() => self.mask.css('display', 'flex'), 30) } hide() { let self = this setTimeout(() => self.mask.css('display', 'none'), 100) } addGlobalStyle() { var globalStyle = ' /* 开关按钮 */\n' + ' #itemlist {\n' + ' display: flex;\n' + ' display: -webkit-flex;\n' + ' align-content: center;\n' + ' align-items: center;\n' + ' justify-content: center;\n' + ' flex-flow: row wrap;\n' + ' }\n' + '\n' + ' section {\n' + ' float: left;\n' + ' width: 200px;\n' + ' padding: 6px 20px;\n' + ' }\n' + '\n' + ' .switch span {\n' + ' height: 30px;\n' + ' line-height: 32px;\n' + ' font-size: 16px;\n' + ' vertical-align: top;\n' + ' }\n' + '\n' + ' .switch .checkbox {\n' + ' float: right;\n' + ' padding-top: 4px;\n' + ' }\n' + '\n' + ' .checkbox {\n' + ' position: relative;\n' + ' display: inline-block;\n' + ' }\n' + '\n' + ' .checkbox:after,\n' + ' .checkbox:before {\n' + ' -webkit-font-feature-settings: normal;\n' + ' -moz-font-feature-settings: normal;\n' + ' font-feature-settings: normal;\n' + ' -webkit-font-kerning: auto;\n' + ' font-kerning: auto;\n' + ' -moz-font-language-override: normal;\n' + ' font-language-override: normal;\n' + ' font-stretch: normal;\n' + ' font-style: normal;\n' + ' font-synthesis: weight style;\n' + ' font-variant: normal;\n' + ' font-weight: normal;\n' + ' text-rendering: auto;\n' + ' }\n' + '\n' + ' .checkbox label {\n' + ' width: 80px;\n' + ' height: 24px;\n' + ' background: #ccc;\n' + ' position: relative;\n' + ' display: inline-block;\n' + ' border-radius: 46px;\n' + ' -webkit-transition: 0.4s;\n' + ' transition: 0.4s;\n' + ' cursor: pointer;\n' + ' }\n' + '\n' + ' .checkbox label:after {\n' + ' content: \'\';\n' + ' position: absolute;\n' + ' width: 50px;\n' + ' height: 50px;\n' + ' border-radius: 100%;\n' + ' left: 0;\n' + ' top: -5px;\n' + ' z-index: 2;\n' + ' background: #fff;\n' + ' box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);\n' + ' -webkit-transition: 0.4s;\n' + ' transition: 0.4s;\n' + ' cursor: pointer;\n' + ' }\n' + '\n' + ' .checkbox input {\n' + ' display: none;\n' + ' }\n' + '\n' + ' .checkbox.on label:after {\n' + ' left: 36px;\n' + ' }\n' + '\n' + ' .checkbox.on label {\n' + ' background: #4BD865;\n' + ' }\n' + '\n' + ' .switch .checkbox label {\n' + ' width: 60px;\n' + ' }\n' + '\n' + ' .switch .checkbox label:after {\n' + ' top: 0;\n' + ' width: 24px;\n' + ' height: 24px;\n' + ' }\n' + '\n' + ' /* 弹出层 */\n' + ' #settingLayerMask {\n' + ' display: none;\n' + ' justify-content: center;\n' + ' align-items: center;\n' + ' position: fixed;\n' + ' top: 0;\n' + ' right: 0;\n' + ' bottom: 0;\n' + ' left: 0;\n' + ' background-color: rgba(0, 0, 0, .5);\n' + ' z-index: 200000000;\n' + ' overflow: auto;\n' + ' font-family: arial, sans-serif;\n' + ' min-height: 100%;\n' + ' font-size: 16px;\n' + ' transition: 0.5s;\n' + ' opacity: 1;\n' + ' user-select: none;\n' + ' -moz-user-select: none;\n' + ' padding-bottom: 80px;\n' + ' box-sizing: border-box;\n' + ' }\n' + '\n' + ' #settingLayer {\n' + ' display: flex;\n' + ' flex-wrap: wrap;\n' + ' padding: 20px;\n' + ' margin: 0px 25px 50px 5px;\n' + ' background-color: #fff;\n' + ' border-radius: 4px;\n' + ' position: absolute;\n' + ' width: 60%;\n' + ' transition: 0.5s;\n' + ' }\n' + '\n' + '\n' + ' #btnEle {\n' + ' position: absolute;\n' + ' width: 100%;\n' + ' bottom: 4px;\n' + ' right: 0;\n' + ' background: #fff;\n' + ' border-radius: 4px;\n' + ' }\n' + '\n' + ' #btnEle span {\n' + ' display: inline-block;\n' + ' background: #EFF4F8;\n' + ' border: 1px solid #3abdc1;\n' + ' margin: 12px auto 10px;\n' + ' color: #3abdc1;\n' + ' padding: 5px 10px;\n' + ' border-radius: 4px;\n' + ' cursor: pointer;\n' + ' outline: none;\n' + ' transition: 0.3s;\n' + ' }\n' + '\n' + ' #btnEle a {\n' + ' color: #999;\n' + ' text-decoration: none;\n' + ' }\n' + '\n' + ' #btnEle a:hover {\n' + ' text-decoration: underline;\n' + ' color: #ef8957;\n' + ' }\n' + '\n' + ' #btnEle span.feedback:hover {\n' + ' border-color: #ef8957;\n' + ' }\n' + '\n' + ' #btnEle span:not(.feedback):hover {\n' + ' background: #3ACBDD;\n' + ' color: #fff;\n' + ' }\n' + '\n' + ' #btnEle .feedback {\n' + ' border-color: #aaa;\n' + ' }\n' + '\n' + ' #btnEle>div {\n' + ' width: 100%;\n' + ' margin-bottom: -100%;\n' + ' display: flex;\n' + ' justify-content: space-around;\n' + ' background: #EFF4F8;\n' + ' border-radius: 4px;\n' + ' }\n' + '\n' + ' /*close button*/\n' + ' #noqrlogin-close {\n' + ' background: white;\n' + ' color: #3ABDC1;\n' + ' line-height: 20px;\n' + ' text-align: center;\n' + ' height: 20px;\n' + ' width: 20px;\n' + ' font-size: 20px;\n' + ' padding: 10px;\n' + ' border: 3px solid #3ABDC1;\n' + ' border-radius: 50%;\n' + ' transition: .5s;\n' + ' top: -20px;\n' + ' right: -20px;\n' + ' position: absolute;\n' + ' cursor: pointer;\n' + ' }\n' + '\n' + ' #noqrlogin-close::before {\n' + ' content: \'\\2716\';\n' + ' }\n' + '\n' + ' #noqrlogin-close:hover {\n' + ' background: indianred;\n' + ' border-color: indianred;\n' + ' color: #fff;\n' + ' }'; $("<style></style>").text(globalStyle).appendTo($("head")) } bindClick(e) { let self = this const targetClass = e.target.className const targetid = e.target.id // 关闭按钮 if (targetid == 'noqrlogin-close') { self.hide() } // 保存设置 if (targetid == 'noqrlogin-save') { $('section.switch input').each((i, o) => { const key = $(o).attr('key') const item = storageData[key] if (item) item.enabled = $(o.closest('.checkbox')).hasClass('on') }) setStorageData(storageData) self.hide() } // 切换开关 if (targetClass == 'switchLabel') { const switchEle = $(e.target).closest('.checkbox') if (switchEle.hasClass('on')) { switchEle.removeClass('on') } else { switchEle.addClass('on') } } } } })()