能否使用油猴脚本,判断若是在登录页A,并且监听window.open,在window.open B页面的时候,将cookie复制到粘贴板,当跳转到B页面的时候,从粘贴板中设置cookie到B页面?
使用油猴(Tampermonkey)脚本可以实现对页面行为的监听与修改,包括监听window.open事件、处理Cookie等操作。不过,直接通过这种方式在不同域名之间复制和粘贴Cookie存在一些安全性和技术上的挑战:
- 同源策略:浏览器的安全机制限制了JavaScript访问不同源(协议+域名+端口组合)的Cookie。
- 用户交互:从技术角度看,自动将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);
}
}
})();

浙公网安备 33010602011771号