今天上班在摸鱼,我就好奇屎黄的shared到底是怎么跳转的
为什么会和linux登录有关联,所以就觉得是不是存了什么东西
觉得Cookie和Local看起来一点都不方便
所以他就诞生了,可以查看网页的Cookie和LocalStorage
// ==UserScript==
// @name 导出Cookie和LocalStorage
// @namespace http://tampermonkey.net/
// @version 0.8
// @description 展示和导出Cookie和LocalStorage
// @author xlike
// @match *://*/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// 样式表
const styles = `
#exportBox {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 400px;
background-color: white;
box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.2);
border-radius: 10px;
padding: 20px;
z-index: 10000;
display: none;
font-family: Arial, sans-serif;
}
#exportBox h2 {
margin-top: 0;
text-align: center;
}
#exportBox .options, .exportAll {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
}
#exportBox button {
background-color: #4CAF50;
color: white;
border: none;
padding: 10px;
border-radius: 5px;
cursor: pointer;
width: 48%;
transition: background-color 0.3s ease;
}
#exportBox button:hover {
background-color: #45a049;
}
#exportBox .list {
max-height: 300px;
overflow-y: auto;
margin-bottom: 20px;
border: 1px solid #ddd;
border-radius: 5px;
padding: 10px;
display: none; /* 默认隐藏 */
}
#exportBox .list div {
display: flex;
justify-content: space-between;
background-color: #f9f9f9;
padding: 10px;
margin: 5px 0;
border-radius: 5px;
border: 1px solid #e0e0e0;
max-width: 100%;
}
#exportBox .list div:hover {
background-color: #f1f1f1;
}
#exportBox .list div span {
cursor: pointer;
font-size: 14px;
white-space: nowrap; /* 不换行 */
overflow: hidden; /* 超出隐藏 */
text-overflow: ellipsis; /* 显示省略号 */
}
#exportBox .list div span.copy {
color: blue;
}
#exportBox .list div span.key {
flex-grow: 1;
margin-right: 10px;
font-weight: bold;
max-width: 70%;
}
#openExportBox {
position: fixed;
top: 10px;
right: 10px;
background-color: #4CAF50;
color: white;
border: none;
padding: 10px 20px;
border-radius: 8px;
cursor: pointer;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
z-index: 1000;
}
#openExportBox:hover {
background-color: #45a049;
}
`;
// 插入样式表
const styleSheet = document.createElement("style");
styleSheet.type = "text/css";
styleSheet.innerText = styles;
document.head.appendChild(styleSheet);
// 创建主按钮
const openButton = document.createElement('button');
openButton.id = 'openExportBox';
openButton.textContent = 'Export Data';
document.body.appendChild(openButton);
// 创建弹出框
const exportBox = document.createElement('div');
exportBox.id = 'exportBox';
exportBox.innerHTML = `
<h2>展示和导出Cookie和Local</h2>
<button id="closeExportBox" style="
position: absolute;
top: 10px;
width: 35px;
right: 10px;
background-color: red;
color: white;
border: none;
padding: 5px 10px;
border-radius: 50%;
cursor: pointer;
font-weight: bold;
">X</button>
<div class="options">
<button id="showCookies">Cookies列表</button>
<button id="showLocalStorage">Local列表</button>
</div>
<div class="list" id="dataList"></div>
<div class="exportAll">
<button id="exportCookiesAll">导出所有Cookies</button>
<button id="exportLocalStorageAll">导出所有Local</button>
</div>
`;
document.body.appendChild(exportBox);
// 打开弹出框
openButton.addEventListener('click', () => {
exportBox.style.display = 'block';
});
// 关闭弹出框
document.getElementById('closeExportBox').addEventListener('click', () => {
exportBox.style.display = 'none';
});
// 点击页面外关闭弹出框
window.addEventListener('click', (e) => {
if (e.target === exportBox) {
exportBox.style.display = 'none';
}
});
// 显示 Cookies 列表
document.getElementById('showCookies').addEventListener('click', () => {
const cookies = document.cookie.split('; ').reduce((acc, cookie) => {
const [name, value] = cookie.split('=');
acc[name] = decodeURIComponent(value); // 去掉转义字符
return acc;
}, {});
displayDataList(cookies, 'cookie');
});
// 显示 localStorage 列表
document.getElementById('showLocalStorage').addEventListener('click', () => {
const localStorageData = {};
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
const value = localStorage.getItem(key);
// 尝试解析 JSON,如果失败则保留原始字符串
try {
localStorageData[key] = JSON.parse(value);
} catch (e) {
localStorageData[key] = value; // 不是 JSON 的字符串
}
}
displayDataList(localStorageData, 'localStorage');
});
// 显示数据列表并绑定复制功能
function displayDataList(data, type) {
const dataList = document.getElementById('dataList');
dataList.innerHTML = '';
if (Object.keys(data).length === 0) {
dataList.innerHTML = `<div>No ${type === 'cookie' ? 'Cookies' : 'localStorage'} found.</div>`;
} else {
for (const [key, value] of Object.entries(data)) {
const itemDiv = document.createElement('div');
const keySpan = document.createElement('span');
const copySpan = document.createElement('span');
keySpan.textContent = `${key}: ${typeof value === 'object' ? JSON.stringify(value) : value}`;
keySpan.classList.add('key');
copySpan.textContent = 'Copy';
copySpan.classList.add('copy');
copySpan.addEventListener('click', () => {
const cleanValue = typeof value === 'object'
? JSON.stringify({ [key]: value }, null, 2).replace(/\\n/g, '').replace(/\\/g, '')
: { [key]: value };
navigator.clipboard.writeText(JSON.stringify(cleanValue));
alert(`${type} key-value copied as JSON: ${JSON.stringify(cleanValue)}`);
});
itemDiv.appendChild(keySpan);
itemDiv.appendChild(copySpan);
dataList.appendChild(itemDiv);
}
}
// 显示数据列表
dataList.style.display = 'block';
}
// 导出所有 Cookies
document.getElementById('exportCookiesAll').addEventListener('click', () => {
const cookies = document.cookie.split('; ').reduce((acc, cookie) => {
const [name, value] = cookie.split('=');
acc[name] = decodeURIComponent(value); // 去掉转义字符
return acc;
}, {});
exportDataAsJson(cookies, 'cookies.json');
});
// 导出所有 localStorage
document.getElementById('exportLocalStorageAll').addEventListener('click', () => {
const localStorageData = {};
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
const value = localStorage.getItem(key);
// 尝试解析 JSON,如果失败则保留原始字符串
try {
localStorageData[key] = JSON.parse(value);
} catch (e) {
localStorageData[key] = value; // 不是 JSON 的字符串
}
}
exportDataAsJson(localStorageData, 'localStorage.json');
});
// 导出为 JSON 文件
function exportDataAsJson(data, filename) {
const cleanData = JSON.stringify(data, null, 2).replace(/\\n/g, '').replace(/\\/g, ''); // 去掉所有转义字符
const blob = new Blob([cleanData], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
})();
复制和导出,会下载相对应的.json文件,key-value 格式
我只是学习技术,没有打那种坏心思