sosai 发表于 2022-10-22 06:30

有没有方法定时自动把某个cookie存到电脑里

本帖最后由 sosai 于 2022-10-22 06:33 编辑

为了定期爬取某个需要登入的网站,用的爬取软件使用cookie登入,不过cookie有效期只有一天,
本来打算用油猴脚本获取cookie存到电脑,再让软件读取,
但网站的cookie是httponly的,无法用document.cookie获取,
好在油猴beta版有GM_COOKIE,虽然我毫无编程经验,
用google搜索了一些别人的语句进行套用都失败了
求指导油猴的编写,或者有没有其他可行办法

// ==UserScript==
// @name         GM_cookie
// @namespace
// @version      0.1
// @descriptiontry to take over the world!
// @author       You
// @match      www.abc.com/123
// @grant      GM_cookie
// @grant      GM.cookie
// ==/UserScript==
var saveData = (function () {
    var a = document.createElement("a");
    document.body.appendChild(a);
    a.style = "display: none";
    return function (data, fileName) {
      var blob = new Blob(, {type: "octet/stream"});
      var url = window.URL.createObjectURL(blob);
      a.href = url;
      a.download = "测试.txt";
      a.click();
      window.URL.revokeObjectURL(url);
    };
}());
const cookieName = 'www.abc.com';
const urlToFetch = 'www.abc.com/123/'
var blob = await GM.cookie.list;
saveData(blob);



糊状物 发表于 2022-10-22 12:02

虽然我就没学会js吧, 也没写过油猴, 不过搜索了一下你这api,GM.cookie.list 是个函数啊, 你都没调用这函数怎么会有结果呢
参考: https://github.com/Tampermonkey/tampermonkey/issues/465
拿s1做例子, 修改一下你的代码:

// ==UserScript==
// @Name         GM_cookie
// @namespace
// @version      0.1
// @descriptiontry to take over the world!
// @author       You
// @Match      bbs.saraba1st.com/*
// @grant      GM_cookie
// @grant      GM.cookie
// ==/UserScript==
var saveData = (function () {
    var a = document.createElement("a");
    document.body.appendChild(a);
    a.style = "display: none";
    return function (data, fileName) {
      var blob = new Blob(, {type: "octet/stream"});
      var url = window.URL.createObjectURL(blob);
      a.href = url;
      a.download = "测试.txt";
      a.click();
      window.URL.revokeObjectURL(url);
    };
}());
const cookieName = '***************';
const urlToFetch = 'bbs.saraba1st.com/*'
await GM.cookie.list({name:cookieName}).then((cookie)=>{
    console.log(cookie);
    saveData(JSON.stringify(cookie));
});

sosai 发表于 2022-10-22 18:01

本帖最后由 sosai 于 2022-10-22 18:08 编辑

糊状物 发表于 2022-10-22 12:02
虽然我就没学会js吧, 也没写过油猴, 不过搜索了一下你这api,GM.cookie.list 是个函数啊, 你都没调用这函 ...
原来如此,逐渐了解一切
我对比了一下cookie,发现软件能读取的格式是:
SSOLoginState=xxxx;
_s_tentry=-;
Apache=xxxx;
UOR=,,login.abc.com.cn;
wvr=6;
ABCGLOBAL=xxx;
ALF=xxx;
abcm_unReadCount=xxx;
SCF=xxxx;
ULV=xxx;
PC_TOKEN=xxx;
SUB=xxx;
SUBP=xxx

借用你的代码,cookieName改成XSRF-TOKEN,输出是这样的
[{"domain":"ABC.com","httpOnly":false,"secure":true,"name":"XSRF-TOKEN","path":"/","sameSite":"unspecified","value":"xxxxx","session":true,"hostOnly":true},

再试着把GM.cookie.list({name:cookieName}).这里,改成GM.cookie.list({}),
输出就是上面需要的SSOLoginState,_s_tentry,Apache…………这些了,
不过每一条格式仍然是[{"domain":"ABC.com","httpOnly":false,"secure":true,"name":"XSRF-TOKEN","path":"/","sameSite":"unspecified","value":"xxxxx","session":true,"hostOnly":true},

如何才能只输出name=value这样的格式呢

ls2021 发表于 2022-10-22 18:33

sosai 发表于 2022-10-22 18:01
原来如此,逐渐了解一切
我对比了一下cookie,发现软件能读取的格式是:
SSOLoginState=xxxx;


var cookies = {
    "domain": "ABC.com", "httpOnly": false, "secure": true, "name": "XSRF-TOKEN", "path": "/", "sameSite": "unspecified", "value": "xxxxx", "session": true, "hostOnly": true
}
var str1= new String();
for (obj in cookies) {
    str1 += obj + "=" + cookies + ";" + "\n";
}

console.log(str1);

sosai 发表于 2022-10-22 23:23

本帖最后由 sosai 于 2022-10-22 23:54 编辑

ls2021 发表于 2022-10-22 18:33

直接复制进油猴显示代码错误,我稍微改了一下,但输出是
""
改后的代码是
const cookiedomain = 'saraba1st.com';
var cookies = await GM.cookie.list({domain:cookiedomain}).then((cookies)=>{
    console.log(cookies);
});
var str1= new String();
for (let obj in cookies) {
    str1 += obj + "=" + cookies + ";" ;
}
console.log(str1);
saveData(JSON.stringify(str1));
使用2楼的代码输出的是
[{"domain":"saraba1st.com","httpOnly":false,"secure":true,"name":"XSRF-TOKEN","path":"/","sameSite":"unspecified","value":"111","session":true,"hostOnly":true},
{"domain":".saraba1st.com","httpOnly":false,"secure":false,"name":"login_sid_t","path":"/","sameSite":"unspecified","value":"222","session":true,"hostOnly":false},
{"domain":".saraba1st.com","httpOnly":false,"secure":false,"name":"cross_origin_proto","path":"/","sameSite":"unspecified","value":"SSL","session":true,"hostOnly":false},
{"expirationDate":*************,"domain":".saraba1st.com","httpOnly":true,"secure":true,"name":"SCF","path":"/","sameSite":"no_restriction","value":"333","session":false,"hostOnly":false},
{"domain":".saraba1st.com","httpOnly":true,"secure":true,"name":"SUB","path":"/","sameSite":"no_restriction","value":"444","session":true,"hostOnly":false},
{"expirationDate":*************,"domain":".saraba1st.com","httpOnly":true,"secure":true,"name":"PC_TOKEN","path":"/","sameSite":"unspecified","value":"555","session":false,"hostOnly":false},
我需要的是
XSRF-TOKEN=111;login_sid_t=222;cross_origin_proto=SSL;SCF=333;SUB=444;PC_TOKEN=555
猜了下你的代码,应该是历遍数组,提取后重组的意思?
不知哪里执行错误,出不来想要的结果


Tring 发表于 2022-10-22 23:46

1,别用浏览器,用python就没什么httponly的问题了。
2,为什么不直接修改cookie的有效期?
3,用await的时候就不要用then了。
let cookies = await GM.cookie.list({domain:cookiedomain});
console.log(cookies);
就可以了。

sosai 发表于 2022-10-23 00:23

Tring 发表于 2022-10-22 23:46
1,别用浏览器,用python就没什么httponly的问题了。
2,为什么不直接修改cookie的有效期?
3,用await的时 ...

1、就是因为不会python呀,这里是完全没接触过编程的门外汉
2、微博的cookie有效期感觉是服务端判断的?
3、
修改后代码是
const cookiedomain = 'weibo.com';
let cookies = await GM.cookie.list({domain:cookiedomain});
console.log(cookies);
var str1= new String();
for (let obj in cookies) {
    str1 += obj + "=" + cookies + ";" ;
}
console.log(str1);
saveData(JSON.stringify(str1));
但输出是
"0=;1=;2=;3=;4=;5=;6=;7=;8=;9=;10=;11=;12=;13=;14=;15=;16=;17=;"总觉得搞不明白


Tring 发表于 2022-10-23 00:34

本帖最后由 Tring 于 2022-10-23 00:39 编辑

sosai 发表于 2022-10-23 00:23
1、就是因为不会python呀,这里是完全没接触过编程的门外汉
2、微博的cookie有效期感觉是服务端判 ...
js里对数组遍历由于历史遗留原因,并不是用关键字in,而是用关键字of。
for(let ck of cookies) {
for(let k in ck) {
    console.log(k, '=', ck, ';');
}
}

Tring 发表于 2022-10-23 00:47

哦,又看了眼你要求的格式,应该这样写

for(let ck of cookies) {
console.log(ck.name + '=' + ck.value + ';');
}

sosai 发表于 2022-10-23 02:23

本帖最后由 sosai 于 2022-10-23 03:48 编辑

Tring 发表于 2022-10-23 00:47
哦,又看了眼你要求的格式,应该这样写
感谢,确实很接近了,用JS在线工具输出是
> "XSRF-TOKEN=111;"
> "login_sid_t=222;"
> "cross_origin_proto=SSL;"
> "SCF=333;"
> "SUB=444;"
> "PC_TOKEN=555;"
只要试试把"替换掉就能得到最终结果。

不过这个句式把saveData(JSON.stringify(cookie))失效了,而上面的下载cookie到本地正是用saveData的方法,
试了很久能不能用 saveData ( for ( let ck of cookies )…………,
或者是var XXXX = for ( let ck of cookies )…………,
或者是for ( let ck of cookies ) { console.log(………) => console.log(xxx),
结果都是报错,不知有没有什么语句能把结果导出成txt呢

-----------------------------------------------------------------------------------------------
我用4楼的代码改了一下
var str1= new String();
for(let ck of cookies) {
   console.log(str1 += ck.name + '=' + ck.value + ';') ;
    }
saveData(str1);
这样就成功搞定了,接下来用批处理做个计划任务应该就能大功告成,感谢大家的帮助


ls2021 发表于 2022-10-23 10:52

sosai 发表于 2022-10-22 23:23
直接复制进油猴显示代码错误,我稍微改了一下,但输出是

改后的代码是


我是在vscode里写、用node跑的,可能浏览器那边确实不太一样吧,好久没写浏览器的js了
不过弄好了就行了
页: [1]
查看完整版本: 有没有方法定时自动把某个cookie存到电脑里