vnc-server / pushcookie /js /background.js
jokyone's picture
Upload 34 files
f5baa4d
chrome.runtime.onInstalled.addListener(() => {
chrome.contextMenus.create({
"id": "copyCookie",
"title": "复制cookie",
"contexts": ["page"]
});
chrome.contextMenus.create({
"id": "pushCookie",
"title": "推送cookie",
"contexts": ["page"]
});
chrome.contextMenus.create({
"id": "clearCookie",
"title": "清除cookie",
"contexts": ["page"]
});
});
let getCurrentTab = async () => {
let queryOptions = {
active: true,
currentWindow: true
};
let [tab] = await chrome.tabs.query(queryOptions);
return tab;
}
let spliceCookies = (cookies) => {
return cookies.map(c => c.name + '=' + c.value).join('; ')
}
let copyCookies = (tag, cookies) => {
const cookieStr = spliceCookies(cookies)
chrome.scripting.executeScript({
target: {
tabId: tag.id
},
func: (val) => navigator.clipboard.writeText(val),
args: [cookieStr]
}, () => {
console.log('cookie复制成功', cookieStr)
chrome.notifications.create({
type: "basic",
title: "cookie复制成功",
message: "cookie已成功复制到剪切板",
iconUrl: "/images/icon-128.png"
})
});
}
let pushCookies = (cookies) => {
chrome.storage.sync.get(['url', 'method', 'fieldName', 'fieldLocation'], config => {
if (!config.url) {
chrome.notifications.create({
type: "basic",
title: "cookie推送失败",
message: "未配置服务器信息",
iconUrl: "/images/icon-128.png"
})
return
}
let cookieStr = spliceCookies(cookies)
console.log("推送配置", config)
console.log("推送cookie", cookieStr)
let request;
switch (config.fieldLocation) {
case 'header':
let headers = {}
headers[config.fieldName] = cookieStr
request = fetch(config.url, {
method: config.method,
headers
})
break;
case 'url':
request = fetch(`${config.url}?${config.fieldName}=${cookieStr}`, {
method: config.method
})
break;
case 'body':
request = fetch(config.url, {
method: config.method,
headers: {
"Content-type": "application/json;charset=UTF-8",
},
body: `{"${config.fieldName}":"${cookieStr}"}`,
})
break;
}
request.then(r => r.text()).then(text => {
console.log("返回结果", text)
chrome.notifications.create({
type: "basic",
title: "cookie推送结果",
message: text,
iconUrl: "/images/icon-128.png"
})
}, err => {
console.error("请求失败", err);
chrome.notifications.create({
type: "basic",
title: "cookie推送出错",
message: err.message,
iconUrl: "/images/icon-128.png"
})
});
})
}
let removeCookies = (cookies, url) => {
for (const cookie of cookies) {
chrome.cookies.remove({
name: cookie.name,
url
})
}
chrome.notifications.create({
type: "basic",
title: "cookie清除成功",
message: "cookie已全部清空",
iconUrl: "/images/icon-128.png"
})
}
chrome.contextMenus.onClicked.addListener(async (itemData) => {
let tag = await getCurrentTab();
let cookies = await chrome.cookies.getAll({
url: tag.url
})
switch (itemData.menuItemId) {
case 'copyCookie':
copyCookies(tag, cookies)
break;
case 'pushCookie':
pushCookies(cookies)
break;
case 'clearCookie':
removeCookies(cookies, tag.url)
break;
}
});
var lastAutoPushTime
let cookieListener = (changeInfo) => {
if (changeInfo.removed) {
//过滤删除cookie的操作
return
}
chrome.storage.sync.get(['listenerUrl', 'minPushInterval', 'cookieNames'], async (config) => {
if (!config.cookieNames.includes(changeInfo.cookie.name)) {
//不在监控的cookie名称之中,不推送
return
}
const topDomain = changeInfo.cookie.domain.split('.').slice(-2).join('.');
if (!config.listenerUrl.includes(topDomain)) {
//不在同一域名下,不推送
return
}
const timeInMs = Date.now()
if (lastAutoPushTime && (timeInMs - lastAutoPushTime) / 1000 < config.minPushInterval) {
//还没到最短间隔时长,不推送
return
}
lastAutoPushTime = timeInMs
setTimeout(function () {
//延迟3秒再推送(网站可能一次性设置了很多cookie,立即获取得到的cookie可能不完整)
chrome.cookies.getAll({
url: config.listenerUrl
},cookies=>pushCookies(cookies))
}, 3000);
});
}
chrome.storage.sync.get(['isAutoPush'], (result) => {
if (result.isAutoPush) {
console.log('开始监听cookie')
chrome.cookies.onChanged.addListener(cookieListener)
}
})
chrome.storage.onChanged.addListener((changes) => {
if (changes.isAutoPush) {
let newVal = changes.isAutoPush.newValue
if (newVal) {
console.log('开始监听cookie')
chrome.cookies.onChanged.addListener(cookieListener)
} else {
console.log('取消监听cookie')
chrome.cookies.onChanged.removeListener(cookieListener)
}
}
})