能否使用油猴脚本,判断若是在登录页A,并且监听window.open,在window.open B页面的时候,将cookie复制到粘贴板,当跳转到B页面的时候,从粘贴板中设置cookie到B页面?

使用油猴(Tampermonkey)脚本可以实现对页面行为的监听与修改,包括监听window.open事件、处理Cookie等操作。不过,直接通过这种方式在不同域名之间复制和粘贴Cookie存在一些安全性和技术上的挑战:

  1. 同源策略:浏览器的安全机制限制了JavaScript访问不同源(协议+域名+端口组合)的Cookie。
  2. 用户交互:从技术角度看,自动将Cookie复制到剪贴板并随后从剪贴板读取设置到另一个网站的Cookie涉及复杂的用户交互流程,并且这种做法并不符合最佳实践。

然而,我们可以通过一种间接的方法来部分实现你的需求,即在登录成功后,在A站点上生成一个包含B站点所需Cookies的链接或代码块,然后手动将其应用到B站点。这种方法避免了直接跨域操作Cookie的问题,同时提高了透明度和安全性。

示例方案

在A站点(登录页)

你可以创建一个油猴脚本来检测登录状态的变化,并在登录成功后生成一段包含必要信息的代码,供用户复制并手动应用到B站点。

// ==UserScript==
// @name         Copy Cookies to Clipboard
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://a-website.com/*
// @grant        GM_setClipboard
// ==/UserScript==

(function() {
    'use strict';

    // 监听登录成功的逻辑,这里假设登录成功后会重定向或者某个元素出现
    function checkLoginStatus() {
        if (/* 登录成功的条件 */) { // 需要根据实际情况调整判断条件
            const cookies = document.cookie.split("; ").reduce((prev, current) => {
                const [name, ...value] = current.split("=");
                prev[name] = value.join("=");
                return prev;
            }, {});

            // 过滤出需要复制到B站点的cookie
            const neededCookies = ['cookieName1', 'cookieName2']; // 替换为实际需要的cookie名称
            const cookieString = neededCookies.map(name => `${name}=${cookies[name]}`).join('; ');

            // 将cookie字符串复制到剪贴板
            GM_setClipboard(cookieString);

            alert('请将已复制的Cookie粘贴到B站点相应位置');
        }
    }

    // 定期检查登录状态
    setInterval(checkLoginStatus, 5000); // 每隔5秒检查一次,可根据情况调整频率
})();

在B站点

由于不能直接从剪贴板读取数据并设置为Cookie(出于安全考虑),你需要让用户手动执行一段JavaScript代码来完成这个过程。这段代码可以由用户在浏览器控制台中运行:

// 用户需要在B站点打开浏览器控制台并粘贴以下代码
(function() {
    const newCookies = prompt('请输入从A站点复制过来的Cookie:');
    if (newCookies) {
        newCookies.split('; ').forEach(cookie => {
            document.cookie = cookie + '; path=/'; // 根据实际情况调整path和其他属性
        });
        console.log('Cookie设置完成,请刷新页面');
    }
})();

这种方法虽然不是全自动的解决方案,但它提供了一种相对安全的方式来跨域传递必要的认证信息。

注意,此方法仅适用于开发或测试环境,不应在生产环境中使用,因为它可能带来安全隐患。对于生产环境,建议采用更安全的身份验证机制,如OAuth或JWT等。

例如:

// ==UserScript==
// @name         自动复制B站 cookie到粘贴板
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @description  try to take over the world!
// @author       You
// @match        *://space.bilibili.com/*
// @grant        GM_setClipboard
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    let isLogin = false;
    let checkStatusInterval;

    // 监听登录成功的逻辑,这里假设登录成功后会重定向或者某个元素出现
    function checkLoginStatus() {
        if (!isLogin && document.querySelector('.header-entry-mini')) { // 需要根据实际情况调整判断条件
            const cookies = document.cookie.split("; ").reduce((prev, current) => {
                const [name, ...value] = current.split("=");
                prev[name] = value.join("=");
                return prev;
            }, {});

            // 过滤出需要复制到B站点的cookie
            const neededCookies = ['sid']; // 替换为实际需要的cookie名称
            const cookieString = neededCookies.map(name => `${name}=${cookies[name]}`).join('; ');

            // 将cookie字符串复制到剪贴板
            GM_setClipboard(cookieString);

            alert('请将已复制的Cookie粘贴到B站点相应位置');
            isLogin = true;

            // 清除定时器
            clearInterval(checkStatusInterval);
        }
    }

    // 设置定期检查登录状态的定时器
    checkStatusInterval = setInterval(checkLoginStatus, 2000); // 每隔2秒检查一次,可根据情况调整频率

})();
// ==UserScript==
// @name         从剪切板中读取指定cookie并设置给当前域名下
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @description  try to take over the world!
// @author       You
// @match         *://www.xiaolvji.com/u/longmo
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

   // 指定需要设置的Cookie名称列表
    const neededCookies = ['sid']; // 替换为实际需要的cookie名称
    const isHomePage = window.location.href.includes('www.xiaolvji.com');

    if(isHomePage){
    try {
            // 从剪贴板读取文本内容
            navigator.clipboard.readText().then((textFromClipboard)=>{
            if (textFromClipboard) {
                // 解析剪贴板中的Cookies
                const clipboardCookies = textFromClipboard.split('; ').reduce((prev, current) => {
                    const [name, ...value] = current.split("=");
                    prev[name] = value.join("=");
                    return prev;
                }, {});

                // 过滤出需要的Cookies
                const cookiesToSet = neededCookies.filter(name => clipboardCookies.hasOwnProperty(name))
                                                .map(name => `${name}=${clipboardCookies[name]}`);

                // 设置过滤后的Cookies
                cookiesToSet.forEach(cookie => {
                    document.cookie = `${cookie}; path=/`; // 根据实际情况调整path和其他属性
                });

                if (cookiesToSet.length > 0) {
                    console.log('所需Cookie已设置,请刷新页面');
                } else {
                    console.log('剪贴板中未找到指定名称的Cookie');
                }
            } else {
                console.log('剪贴板为空');
            }
            });
            
        
        } catch (err) {
            console.error('无法读取剪贴板内容: ', err);
        }
    }
   
})();
posted @ 2025-03-22 21:33  龙陌  阅读(181)  评论(0)    收藏  举报