代码实现:微博图片转存AList
侧边栏壁纸
  • 累计撰写 189 篇文章
  • 累计收到 1,234 条评论

代码实现:微博图片转存AList

萧瑟
2024-07-31 / 8 评论 / 89 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年07月31日,已超过47天没有更新,若内容或图片失效,请留言反馈。

最近想把之前我存在微博的图片转入 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文件,将微博图片的后缀存起来,然后把上面代码改造一下就可以实现。

评论 (8)

取消
  1. 头像
    Huo
    河北省邢台市 MacOS · Safari

    之前用各种的图床,各种的时间稍微一长就跑路,干脆自己建图床了,最起码不至于丢失数据了。
    目前看自己图床也是不错的选择,唯一不爽就是多了一部分支出。

    回复
    1. 头像
      萧瑟 作者
      北京市 MacOS · Google Chrome
      @ Huo

      最近就是图床被刷就很烦恼。表情

      回复
  2. 头像
    w4j1e
    重庆市 Windows 10 · Microsoft Edge

    微博的防盗链有点迷,有时候新建无痕窗口也可以直接打开,大多数时候是403。
    还有一点,可惜的是 oslarge 还是压缩过。

    回复
    1. 头像
      萧瑟 作者
      北京市 MacOS · Google Chrome
      @ w4j1e

      确实,不过能看就行。表情

      回复
  3. 头像
    万有引力
    山东省青岛市 Windows 10 · Google Chrome

    不怎么用微博。mark一下。

    回复
    1. 头像
      萧瑟 作者
      北京市 MacOS · Google Chrome
      @ 万有引力

      嘿嘿,微博上好看的比较多。表情

      回复
  4. 头像
    obaby
    山东省青岛市 MacOS · Google Chrome

    防盗链只校验 refer 处理还算方便。

    回复
    1. 头像
      萧瑟 作者
      北京市 MacOS · Google Chrome
      @ obaby

      我只是觉得微博的防盗链很奇怪,有些不需要有些就需要。表情

      回复