最近想把之前我存在微博的图片转入 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 处理还算方便。
我只是觉得微博的防盗链很奇怪,有些不需要有些就需要。