最近想把之前我存在微博的图片转入 AList
中,发现有点问题,原因是微博开启防盗链,无法直接在浏览器中打开或直接拿到文件流,这就造成 AList
无法通过离线下载。
原因分析
微博图床开启防盗链,所以需要在请求头中携带 Referer
,这样才能获取到流数据。
AList
也提供了三方接口,可以自己调用上传文件。详见:AList API文档
代码实现
上面的常量配置自己的 Alist
信息就可以了,主要是 域名、账号、密码以及上传路径
package com.yanqingshan.blog;
import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import java.util.HashMap;
import java.util.Map;
/**
* 微博上传Alist简单测试
*
* @author yanqs
* @since 2024-07-31
*/
public class WeiBoImgDemo {
/**
* USER_AGENT
*/
private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36";
/**
* Alist 域名
*/
private static final String BASE_URL = "";
/**
* Alist 账号
*/
private static final String USER_NAME = "";
/**
* Alist 密码
*/
private static final String PASSWORD = "";
/**
* Alist 上传路径
*/
private static final String UPLOAD_Path = "";
public static void main(String[] args) {
String url = "https://tvax3.sinaimg.cn/large/a5286dc9ly1hs78a2y4scj22xs4eonpf.jpg";
int lastSlashIndex = url.lastIndexOf('/');
// 如果找到了斜杠,就从斜杠后面截取字符串
String fileName = url.substring(lastSlashIndex + 1);
System.out.println("File Name: " + fileName);
HttpRequest request = HttpRequest.get(url)
.header(Header.REFERER, "https://weibo.com/")//头信息,多个头信息多次调用此方法即可
.header(Header.USER_AGENT, USER_AGENT)
.timeout(20000);
HttpResponse httpResponse = request.executeAsync();
// 获取到文件流 上传到Alist
byte[] bytes = httpResponse.bodyBytes();
String result = HttpRequest.put(BASE_URL + "/api/fs/put")
.header(Header.AUTHORIZATION, getToken())
.header(Header.CONTENT_TYPE, ContentType.MULTIPART.getValue())
.header("File-Path", UPLOAD_Path + fileName)
.body(bytes)
.execute().body();
System.out.println(result);
}
/**
* 获取Alist Token
*
* @return
*/
public static String getToken() {
Map<String, String> params = new HashMap<>();
params.put("username", USER_NAME);
params.put("password", PASSWORD);
String body = HttpRequest.post(BASE_URL + "/api/auth/login")
.header(Header.CONTENT_TYPE, ContentType.JSON.getValue())
.body(JSONUtil.toJsonStr(params))
.execute().body();
return JSONUtil.parseObj(body).getJSONObject("data").getStr("token");
}
}
注:其中微博图片的链接有多种可选
large -> 原始图片
oslarge ->无水印
mw690 -> 最大 690 像素宽度裁剪
thumbnail -> 缩略图
small -> 小图
square -> 80 像素正方形裁剪
thumb150 -> 150 像素正方形裁剪
thumb180 -> 180 像素正方形裁剪
thumb300 -> 300 像素正方形裁剪
orj180 -> 180 像素宽度原比例缩放
orj360 -> 360 像素宽度原比例缩放
运行结果
运行效果如下
后续可以自己建一个txt文件,将微博图片的后缀存起来,然后把上面代码改造一下就可以实现。
之前用各种的图床,各种的时间稍微一长就跑路,干脆自己建图床了,最起码不至于丢失数据了。
目前看自己图床也是不错的选择,唯一不爽就是多了一部分支出。
最近就是图床被刷就很烦恼。
微博的防盗链有点迷,有时候新建无痕窗口也可以直接打开,大多数时候是403。
还有一点,可惜的是 oslarge 还是压缩过。
确实,不过能看就行。
不怎么用微博。mark一下。
嘿嘿,微博上好看的比较多。
防盗链只校验 refer 处理还算方便。
我只是觉得微博的防盗链很奇怪,有些不需要有些就需要。