打开这个地址: api.likepoems.com/img/bing/
它会自动跳转到一个图片的地址,然后可以看到浏览器 url 变化了。
我想在代码中先 axios 请求这个地址,获取到真实的图片地址以及 base64 ,但是它报跨域了。这个地址是网上公共的,所以走允许跨域是走不通。
在代码中直接用 window.open(" api.likepoems.com/img/bing/") 这个方式是可以成功打开这个地址且显示图片的。
我也想过用浏览器父子窗口通信的方式来获取上述需要的信息,但是也没解决。

developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy

阿这阿这

前端没法处理,postMessage 也是需要源网站配合才可以

源站不是你的不配合的话,无解。考虑非前端的方式吧,比如提前在后台把 重定向的地址跑出来然后返回给前端

其实这个图片可以显示出来,那是不是意味着 html 里面就加载了,那是不是 base64 是能拿到的呢。至少说这个图片数据

你用的人家的 API 不是已经提供了一个获取图片信息的接口了么,里面有 url

api.likepoems.com/img/pixiv/?type=JSON

#5 你最终目的是什么呢?如果说只是想要在你的页面里嵌入人家的这张图片,iframe 就可以实现正如你所说的可以正常显示。但是你想拿到图片的 base64 啥的在我了解的范围内前端是没法实现的,只能后台实现

#8 除非对方接触跨域的限制或者提供不限制跨域的接口

图片显示是渲染引擎 WebKit 的工作,不存在跨域;操作 base64 是 js 引擎 V8 的工作,有跨域限制。

做个反代吧

大佬你咋这么强啊

#12 😰可能你没看 API 主的网站吧,这接口应该还允许跨域,我没试

如果只是显示图片,img 标签不需要跨域

#5 对浏览器来说确实是获得到了,但是浏览器会限制非同域的脚本,不允许你获得图片的任何信息

大佬,确实可以得到真实的图片地址。{ "code": 200, "url": " jihulab.com/weblog/gallery02/-/raw/master/BingImage/2021-06-16/OHR.GBRTurtle_ZH-CN6069093254_UHD.jpg", "width": 5164, "height": 2905, "size": "2386539", "mime": "image/jpeg"}但是有个问题,怎么获取这个图片的 base64 呀

#16 4 楼给你解释过了,虽然 img 可以渲染但是你要请求图片还是会碰到跨域问题,所以后端

#16 你试下这个, stackoverflow.com/questions/46609800/canvas-crossorigin-anonymous-cors-chrile-mac-osx ,说是吧 img 绘制成 canvas 然后再转

跨域图片(如果没加允许跨域的那些 headers ),没做防盗链的话,你可以用 img 加载展示,但你无法获取具体的数据( ajax 、fetch )你想把这个 img 画到 canvas 上都是做不到的之前甚至有人研究旁路攻击去偷跨域图片内容的操作( www.secrss.com/articles/3102 ,能偷的不止有图片)

#19 又回忆了一下,「画到 canvas 上都是做不到的」说的有问题,不是做不到,而是如果把跨域 img 画到 canvas 上,就没法再对这个 canvas 执行 toBlob 、toDataUrl 这种拿到 canvas 画的内容的操作了

#18 这个操作应该也是不行的,接口虽然允许跨域,但是这个图片地址的请求没返回 Access-Control-Allow-Origin ,还是不允许跨域的。不允许跨域的图片只能用 img 渲染出来,canvas 也会有跨域问题,我的知识范围内也是不可行的。

#21 canvas 能画出来但是跨域的不能调用 toDataUrl 我记得

#12 综上所述,自己后台整个 反代解千愁

实在不行就用 deno.dev/ 代理下解决

我突然间有个疑问,浏览器的同源策略本身是为了防 A 网站非法调用 B 网站的接口,例如 A 网站是个冒牌的银行网站,然后调用 真银行的接口获取用户名密码一类的。但是反代可以绕过同源策略,A 网站只需要在自己的后台搭一套反向代理去请求 B 网站,一样可以骚操作模拟别的网站哈,感觉 浏览器这个同源策略也是 防君子不防小人哈哈,没啥卵用?

恕我直言,在座的各位都是~大佬

用 nodejs 就行了

#25 同源策略是为了防止你在 A 站使用 B 站的 cookie,localstorage 这些信息。如果没有同源策略,那么假如用户在 A 站登录了,登录信息在 A 站的 cookie 里,那么你的 B 站就可以直接调 A 站的接口有了之后,你就算搭了一套反代,B 站想用 A 站的接口,也得让用户在 B 站里,用 A 站的账户密码登录一次,这玩意叫钓鱼网站

是可以的,所以要提防在陌生网站输入账号密码

这个极狐 GitLab 仓库 jihulab.com/weblog/gallery02 不能跨域可以换一个,原始仓库是 github.com/myseil/BingWallpaper , 直接移花接木到 github gist.github.com/sunfkny/9855f30e0e9eaaef7b81d67e0c860150

#25 如果你在浏览器同源策略规则外访问到了跨域数据,那证明这个浏览器有安全漏洞你说的反向代理问题,浏览器在请求不同域时,cookie 等信息都是完全隔离的。在浏览器这里,站点 A 的请求,只会带上 A 这个域的信息,所以你服务端的代理没任何作用同源策略本身是定义于浏览器的,HTTP 协议上的 cors 也只是它的延伸,最终服务于浏览器

“同源策略” 的本质是不同应用之间的数据隔离。你把每个网站都看成一个 APP ,各 APP 都只能访问自己的数据,不就显得很天经地义了吗?所谓 “防 A 网站非法调用 B 网站的接口”,不过是应用数据隔离的附带效果罢了。

#25 你说的是「钓鱼网站」,用户本身是需要在「钓鱼网站」输入账号密码的.浏览器的同源策略是隔离不同 domain 下的 cookie 等信息的,防止另一个网站直接拿你的信息去做请求

除了前面几楼所说的防止 A 使用 B 域的浏览器存储,还有一种情形是 A 可能访问不到 B 。例如 B 是一个没有鉴权的内网服务,如果没有同源策略,在公网的 A 就可以利用用户浏览器作跳板访问到 B 的资源。

如果只是拿到 bing 壁纸的话, 还有一大堆类似的. 我自己也做了一个(不做存储) api.kazusa.cc/bing至于解决办法, 还是反代最简单.

nginx 代理吧。最简单。

你的目的只是想将图片转 base64 ?

juejin.cn/post/6844903961141444615 用 canvas 就可以了,canvas 设置跨域就能转。我之前的项目转过

跨域的图片转出来是白色的,你最好确认一下你以前的代码哦

request({ method: 'get', url: ' api.likepoems.com/img/bing/', responseType:'arraybuffer', success: (res) => { //图片流转 blob let imageType = res.header['content-type']; const blob = new Blob([res.data], { type: imageType }) //blob 转 base64 let oFileReader = new FileReader() oFileReader.onloadend = function (e) { //base64 字符串 const base64 = e.target.result } oFileReader.readAsDataURL(blob) }})