找回密码
 立即注册
搜索
查看: 1982|回复: 10

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

[复制链接]
     
发表于 2022-10-22 06:30 | 显示全部楼层 |阅读模式
本帖最后由 sosai 于 2022-10-22 06:33 编辑

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

  1. // ==UserScript==
  2. // @name         GM_cookie
  3. // @namespace
  4. // @version      0.1
  5. // @description  try to take over the world!
  6. // @author       You
  7. // @match        www.abc.com/123
  8. // @grant        GM_cookie
  9. // @grant        GM.cookie
  10. // ==/UserScript==
  11. var saveData = (function () {
  12.     var a = document.createElement("a");
  13.     document.body.appendChild(a);
  14.     a.style = "display: none";
  15.     return function (data, fileName) {
  16.         var blob = new Blob([data], {type: "octet/stream"});
  17.         var url = window.URL.createObjectURL(blob);
  18.         a.href = url;
  19.         a.download = "测试.txt";
  20.         a.click();
  21.         window.URL.revokeObjectURL(url);
  22.     };
  23. }());
  24. const cookieName = 'www.abc.com';
  25. const urlToFetch = 'www.abc.com/123/'
  26. var blob = await GM.cookie.list;
  27. 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
// @description  try 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([data], {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));
});

评分

参与人数 1战斗力 +2 收起 理由
sosai + 2

查看全部评分

回复

使用道具 举报

     
 楼主| 发表于 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这样的格式呢
回复

使用道具 举报

     
发表于 2022-10-22 18:33 | 显示全部楼层
sosai 发表于 2022-10-22 18:01
原来如此,逐渐了解一切
我对比了一下cookie,发现软件能读取的格式是:
SSOLoginState=xxxx;
  1. var cookies = {
  2.     "domain": "ABC.com", "httpOnly": false, "secure": true, "name": "XSRF-TOKEN", "path": "/", "sameSite": "unspecified", "value": "xxxxx", "session": true, "hostOnly": true
  3. }
  4. var str1= new String();
  5. for (obj in cookies) {
  6.     str1 += obj + "=" + cookies[obj] + ";" + "\n";
  7. }

  8. console.log(str1);
复制代码

评分

参与人数 1战斗力 +2 收起 理由
sosai + 2

查看全部评分

回复

使用道具 举报

     
 楼主| 发表于 2022-10-22 23:23 | 显示全部楼层
本帖最后由 sosai 于 2022-10-22 23:54 编辑

直接复制进油猴显示代码错误,我稍微改了一下,但输出是
""

改后的代码是
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[obj] + ";" ;
}
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

猜了下你的代码,应该是历遍数组,提取后重组的意思?
不知哪里执行错误,出不来想要的结果


回复

使用道具 举报

     
发表于 2022-10-22 23:46 | 显示全部楼层
1,别用浏览器,用python就没什么httponly的问题了。
2,为什么不直接修改cookie的有效期?
3,用await的时候就不要用then了。
let cookies = await GM.cookie.list({domain:cookiedomain});
console.log(cookies);
就可以了。

评分

参与人数 1战斗力 +2 收起 理由
sosai + 2

查看全部评分

回复

使用道具 举报

     
 楼主| 发表于 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[obj] + ";" ;
}
console.log(str1);
saveData(JSON.stringify(str1));
但输出是
"0=[object Object];1=[object Object];2=[object Object];3=[object Object];4=[object Object];5=[object Object];6=[object Object];7=[object Object];8=[object Object];9=[object Object];10=[object Object];11=[object Object];12=[object Object];13=[object Object];14=[object Object];15=[object Object];16=[object Object];17=[object Object];"
总觉得搞不明白


回复

使用道具 举报

     
发表于 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[k], ';');
  }
}

评分

参与人数 1战斗力 +2 收起 理由
sosai + 2

查看全部评分

回复

使用道具 举报

     
发表于 2022-10-23 00:47 | 显示全部楼层
哦,又看了眼你要求的格式,应该这样写

  1. for(let ck of cookies) {
  2.   console.log(ck.name + '=' + ck.value + ';');
  3. }
复制代码


评分

参与人数 1战斗力 +2 收起 理由
sosai + 2

查看全部评分

回复

使用道具 举报

     
 楼主| 发表于 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);

这样就成功搞定了,接下来用批处理做个计划任务应该就能大功告成,感谢大家的帮助


回复

使用道具 举报

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

改后的代码是

我是在vscode里写、用node跑的,可能浏览器那边确实不太一样吧,好久没写浏览器的js了
不过弄好了就行了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-9-22 05:35 , Processed in 0.147734 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表