思源如何发送带 Cookie 的请求?

本贴最后更新于 360 天前,其中的信息可能已经沧海桑田

关联 issues:提供类似 Obsidian requestUrl 的方法 · Issue #8702 · siyuan-note/siyuan (github.com)

本人非计算机专业,只零散的学习过 JavaScript 的基础语法,基础比较差,希望大佬们回答的时候可以附上链接,我去学习一下 🙏

使用场景:希望实现微信读书 Cookie 续期。需要在请求头携带带旧 Cookie,通过获取返回标头的 Set-Cookie 部分。

image.png

Obsidian 的插件 使用 requestUrl | Obsidian 插件开发文档 方法实现这个功能。

类似 fetch() 方法,使用 HTTP/HTTPS 请求 URL, 没有任何跨域限制。

export function requestUrl(request: RequestUrlParam | string): RequestUrlResponsePromise;

思源目前似乎没有类似的方法,我想知道怎么做才能实现我需要的效果。

做过以下尝试:

  1. 直接在 axios 的 header 设置 Cookie
import axios from "axios";

axios.get('https://weread.qq.com', {
    headers: {
        cookie: 'some cookie'
    }, 
    withCredentials: true, 
})

结果:报错 Refused to set unsafe header "cookie"

  1. 在 fetch 请求设置 header
fetch('https://weread.qq.com', {
        method: 'GET',
        headers: {'Cookie': 'some cookie'}, 
        redirect: 'follow', 
        credentials: 'include'
});

结果:Cookie 被过滤

image

  1. 使用 axios-cookiejar-support
import axios from 'axios';
import { wrapper } from 'axios-cookiejar-support';
import { CookieJar } from 'tough-cookie';

const jar = new CookieJar(my_cookie);
const client = wrapper(axios.create({ jar }));

await client.get('https://example.com');

结果:Cookie 被过滤

image

  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    713 引用 • 1174 回帖 • 121 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    19802 引用 • 75780 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6883 引用 • 31032 回帖 • 232 关注

相关帖子

被采纳的回答

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 在客户端,可以利用 node 环境实现带有 cookie 的请求发送,但是在网页端,因为跨域安全策略的限制,是无法完成这个操作的。

    你可能需要使用 node 环境的类似请求模块而不是使用前端的请求方式发送请求

  • cookie 本身可以使用 electron 的接口获取:session | Electron (electronjs.org)

  • 参考上面的实现可以在思源中封装出类似 obsidian requestUrl 方法的效果

  • 额 其实我之前实现过 不过那个都是去年还是前年的代码了,所以不好找到只能给一下参考

    总的来说就是思源的窗口进程有后端的部分(node 环境)也有前端的部分(浏览器的接口),只要使用后端的接口来发送请求就可以避免被浏览器引擎的安全策略过滤了。

  • leolee 1 1 评论

    如果需要具体实现可能需要晚上我有时间才能封装一个。。。。

    或者更晚才行,最近家务事比较多
    leolee
  • 对了 从 session.cookies 里获取到的 cookies 类的文档在这里:类:Cookies | Electron (electronjs.org)

  • 如果要在网页端也能使用的话,可能办法就只有自己起一个服务转发请求(需要 electron 环境),或者要求核心给一个接口来转发了

    1 回复
  • 首先非常感谢您的回复,由于我对前端涉及的环境所知甚少,请允许我再解释一下我的需求,希望您能给出一些建议,谢谢!

    目前微信读书插件客户端的 cookie 我就是通过您说的这种方式获取的,发送请求通过请求头设置 accessToken 绕过不会发送带 cookie 的请求的限制。

    因为希望可以适配 docker、伺服还有手机端(我不清楚这几个应该算是什么环境,只知道不能用 require 引用 Electron 的 API)。

    Ob 微信读书插件是用 http-proxy-middleware 转发请求 对应提交。但是这个和您提到的 VSCode-Zhihu 用到的模块(前者是 express、后者是 request-promise)在使用社区 vite 插件模板打包时会报错。原因是使用 Node.js 模块,但 Vite 不会自动填充 Node.js 模块

    我完全不会用 vite,所以想试试能不能用浏览器或者没有打包问题的库(比如 axios)的功能实现我的需求,然后就碰到了帖子里的问题。

    2 回复
  • 浏览器环境应该是做不到,这个我记得 z(插件系统的作者)有 issue 要求过核心来提供这个转发功能,你可以去找一下那个 issue,我最近比较忙没有注意它有没有实现,还有有没有允许转发跨域的带 cookie 请求,如果实在不行的话你可能就只能配置一下插件的适配环境,避免 docker 用户安装了……

  • 使用哪个模块问题不大,如果打包一直不成功的话,通过绝对路径可以 require 载入,不用打包进去。

    vite 对后端模块打包可能是有些问题,你可以尝试用官方的那个 webpack 模板,不行的话如果你用 qq 可以去折腾群跟大家讨论下这种情况怎么弄,发布插件的作者之前也对付过打包后端模块的问题

  • 88250 2

    浏览器环境下估计无法做到跨域,只能通过一个后端服务器转发请求,并且自己管理 Cookie。

    近期内核会提供一个正向代理接口 Issue #8724 · siyuan-note/siyuan 应该能满足这个需求。

请输入回帖内容 ...

推荐标签 标签

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 45 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    713 引用 • 1174 回帖 • 121 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • danl
    90 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 649 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    165 引用 • 407 回帖 • 514 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 147 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 350 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    109 引用 • 54 回帖 • 1 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 612 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 82 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 610 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 400 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 732 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 256 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 52 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 23 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    131 引用 • 1114 回帖 • 139 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 2 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 383 关注
  • 创业

    你比 99% 的人都优秀么?

    83 引用 • 1398 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 313 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    51 引用 • 190 回帖 • 1 关注