自建免费图床, 免费资源利用 onedriver api 自建图床

免费图床, 都推荐的比较稳定的

推荐看 这里, 已经总结了 免费图床点这里

用别人的不放心, 对接api 不灵活, 自己需求主要也是做站

提供一个思路, 使用onedriver 或 google driver api 自建免费图床

cocook免费图床

  • 要求, 当然要回简单的编码, 是什么语言无所谓
  • 有服务器, 最基础配置就行了
  • 看懂 oneDriver api, 现在老的api授权已经不好用, 推荐直接用最新的 建立
  • 注册clintid 地址 注册点这里
  • api 地址, 主要是 授权(使用auth2 最新版) 上传 下载 api点这里
  • 由于 微软大厂, api太多, 也花费了 两天时间 才对接完成, 建议使用最新的api

下面 介绍一下 具体的 流程

1. 授权 auth2, 授权地址, 中文叫什么 终结点url, 看这个就知道了

注意 scope 权限 , redirect_uri 授权成功跳转地址, 获取code, 所有的 auth2 都是这个流程


    public String getAuthUrl(Map<String, String> params0){
        String url = Constants.get("login_url") +"/authorize";
            url += "?client_id=" + Constants.get("client_id");
            url += "&response_type=code";
            url += "&redirect_uri=" + Constants.get("redirect_uri");
            url += "&scope=offline_access%20Files.ReadWrite.All%20Sites.Read.All%20User.Read";

        return url;
    }

2. 获取code后, 使用code 获取 access_token, 其中需要用到密钥

code是上面获取到的, 注意 redirect_uri 相同 , client_secret 密钥, 在建立clientid的地方
获取到 access_token- 用于api请求的token, expires_in - token过期时间缓存一下, refresh_token-刷新token 用的


    public String getToken(Map<String, String> params0){
        String code = params0.get("code");
        String url = Constants.get("login_url") +"/token";
        HashMap<String, String> params = new HashMap<>();
        params.put("client_id", Constants.get("client_id"));
        params.put("redirect_uri", Constants.get("redirect_uri"));
        params.put("client_secret", Constants.get("client_secret"));
        params.put("code", code);
        params.put("grant_type", "authorization_code");
        Map<String, Object> resp =  OKHttpUtil.post(url, params);;
        LogUtil.info("getToken->" + resp);
        String token = (String) resp.get("access_token");
        int expires_in = (int) resp.get("expires_in") ;
        VcodeUtil.timedCache.put("access_token", token, expires_in* 1000);
        String refresh_token = (String) resp.get("refresh_token");
        VcodeUtil.timedCache.put("refresh_token", refresh_token, expires_in* 1000 * 36);
        return token;
    }

3. 使用 refresh_token 刷新 access_token,建缓存过期时间

缓存 access_token 3600秒, 失效后使用 refresh_token 刷新 access_token , refresh_token的 时效较长, 微软没有指定具体多久,
测试 至少在 天级别以上


    public String getTokenByCache(Map<String, String> params0){
        String token = (String) VcodeUtil.timedCache.getNotUpLastAccess("access_token");
        if (token != null) {
            return token;
        }

        String refresh_token = (String) VcodeUtil.timedCache.getNotUpLastAccess("refresh_token");
        String url = Constants.get("login_url") +"/token";

        HashMap<String, String> params = new HashMap<>();
        params.put("client_id", Constants.get("client_id"));
        params.put("scope", "offline_access Files.ReadWrite.All Sites.Read.All User.Read");
        params.put("refresh_token", refresh_token);
        params.put("redirect_uri", Constants.get("redirect_uri"));
        params.put("client_secret", Constants.get("client_secret"));
        params.put("grant_type", "refresh_token");
        Map<String, Object> resp =  OKHttpUtil.post(url, params);;
        LogUtil.info("getToken->" + resp);
        token = (String) resp.get("access_token");
        int expires_in = (int) resp.get("expires_in") ;
        VcodeUtil.timedCache.put("access_token", token, expires_in* 1000);
        refresh_token = (String) resp.get("refresh_token");
        VcodeUtil.timedCache.put("refresh_token", refresh_token, expires_in* 1000 * 36);
        return token;
    }

4. 使用 access_token 上传文件, 使用简易api, 只支持 4M的文件, 如果是大文件的话, 还是用以前推荐的一些工具吧

//PUT /me/drive/items/{parent-id}:/{filename}:/content , 上传地址很费解, 这里我做了例子
这样好理解一点, 使用 绝对路径上传, body 直接是文件流
/SEARCH_APP/upload/201912/10/Q5pe5A.jpg 这里是文件路劲
https://graph.microsoft.com/v1.0/me/drive/root:/SEARCH_APP/upload/201912/10/Q5pe5A.jpg:/content
上传成功后 会返回 这个 item 的信息, 里面有下载地址, 保存这个 id, 和 路径, 下载的时候提供 itemid 下载方式 和路径方式


    public String upload(String uploadPath, String suffix, ByteArrayOutputStream out) throws Exception{
        byte[] bytes = out.toByteArray();

        long id = MD5.md5_long(bytes);
        Map<String, Object> ins = getIns(id);
        if(!ins.isEmpty()) {
            return (String) ins.get("itemid");
        }

        String date = BaseUtil.getFormatDate().replaceFirst("/", "");
        uploadPath += date;
        String filename = uploadPath + "/" + RandomStringUtils.randomAlphanumeric(6) +"." + suffix;
        //PUT /me/drive/items/{parent-id}:/{filename}:/content
        String url = "https://graph.microsoft.com/v1.0/me/drive/root:" + filename +":/content";
        HttpRequest request = new HttpRequest(url, Method.put);
        request.setContentType("image/jpeg");
        request.addHeader("Authorization", "Bearer " + getTokenByCache(null));
        request.setRequestBody(bytes);
        HttpResponse res =  OKHttpUtil.request(request);
        // 返回的 id 就是 itemid, 可以用此id做一些操作 保存itemid 和 filePath
        String resStr=  res.getResponseString();
        Map<String, Object> resMap =  (Map<String, Object>) OKHttpUtil.deserialize(resStr);
        String itemid = (String) resMap.get("id");

        return itemid;
    }

5. 使用 access_token 下载文件, 使用itemid 或 文件路径都可以

String url = "https://graph.microsoft.com/v1.0/me/drive/items/"+itemid+"/content"; // 下載 按itemid
String url = "https://graph.microsoft.com/v1.0/me/drive/root:" + filepath +":/content"; // 按文件路劲
看代码, 上面 带了注释, 下载地址, 预览地址, 和分享地址, 具体实现 看 oneApi, 我都测试过
成功请求后会出现 302 跳转, 一般 httpclient 都会自己跳, 不想跳的找配置 获取Location 可以查看地址


        public Object downLoad(Map<String, String> params) throws Exception{
        String itemid = params.get("id");
//      String url = "https://graph.microsoft.com/v1.0/me/drive/root:" + filepath +":/content"; // 按文件路劲
//      String url = "https://graph.microsoft.com/v1.0/me/drive/items/01RHKEMNKSNBGOHRSDPBHJI43LRLM62MV7/preview";  // 預覽按itemid
//      String url = "https://graph.microsoft.com/v1.0/me/drive/items/01RHKEMNKSNBGOHRSDPBHJI43LRLM62MV7/createLink"; // 分享按itemid
        String url = "https://graph.microsoft.com/v1.0/me/drive/items/"+itemid+"/content";  // 下載 按itemid
        HttpRequest request = new HttpRequest(url, Method.get);
        request.addHeader("Authorization", "Bearer " + getTokenByCache(null));
        //request.setContentType("application/json");
        //request.setRequestBody("{\"chromeless\":\"true\"}".getBytes());
        HttpResponse resp =  OKHttpUtil.request(request);
//      System.out.println(resp.getResponseString());
//      System.out.println(resp.getHeader("Location"));  // 302 跳转, 自动重新获取图片 URL
        return resp.getRespInputsStream();
    }

6. 到这里就完成了, 由于每次都要下载, 自己做个浏览器缓存, 再加上 cloudflare cdn, 使用起来还行

cocook图床

推廣 影視在線搜索, 有倫理 有美劇, 有動漫 cocook 全網影視搜索
推廣 每日熱點 cncknews

原文地址:https://blog.51cto.com/7844848/2475364

时间: 2024-09-30 01:54:39

自建免费图床, 免费资源利用 onedriver api 自建图床的相关文章

如何利用H5响应式建站系统做响应式网站

响应式网站成为了企业建站的首选目标,是什么因素导致的呢?我想更多是因为响应式网站的强大展示方式,多元素.多样化.多功能的形态,让网站"活了"起来,还有能够一个网站便能适应所有屏幕设备,不再需要为每一个不一样的设备制定一个特定版本的网站,省去了建站,优化.管理的麻烦.让你更好的统筹管理一个网站,便能在不同设备平台上得到相同的效果. 说起响应式网站,很多人会疑惑.那么好的类型网站,建设起来费用是不是要很高?建设时间是不是很长?错!错!错!其实如果在较早直接做一个响应式网站是要花费高额的开发

2013年十大免费云空间排行榜-给开发者建站用的免费云主机

云空间也可以叫做云平台,是以云计算技术而开发的网络服务平台,云计算平台可以划分为3类:以数据存储为主的存储型云平台,以数据处理为主的计算型云平台以及计算和数据存储处理兼顾的综合云计算平台. 云空间与传统的虚拟主机相比有非常大的不同,主要表现在空间管理方法.代码运行方式和应用开发等方面有非常大的不同,很多人在使用云空间过程会出现这样或那样的问题,多数是因为云空间对程序的要求不同而导致的. 严格的来说,就现有的云计算空间环境和条件,云空间还不适合用于专门的建站用途.当前使用云空间建站遇到的一个最大的

45本免费的JavaScript书籍资源收集

JavaScript目前变得越来越流行,已经变成了Web开发必备的语言,加之其跨平台的特性,使得在一切皆为JavaScript的移动互联网时代大有作为. 同时,我们看到,在过去的这一年的软件开发中,JavaScript也是独领风骚. 可以说,现在就是学习JavaScript开发的最佳时机.本文为大家整理了45本学习JavaScript的免费书籍资源,既有适合初学者的入门书籍,也有适合熟练JavaScript开发者的中级和高级书籍,希望对大家有用. 基础教程 Dynamisez Vos Sites

利用d3.js绘制雷达图

利用d3,js将数据可视化,可以做到数据与代码的分离,方便以后修改数据. 这次利用d3.js绘制了一个五维的雷达图,即将多个对象的五种属性在一张图上对比. 数据写入data.csv.数据类型写入type.csv文件. 效果如下图所示 源码连接:http://download.csdn.net/detail/svap1/7358123 使用是只需调用 radar()函数即可,如下是测试页面代码. <!DOCTYPE html> <html> <head> <meta

CSS Sprites技术(将背景图整合到一张图中,再利用CSS背景图片定位到要显示的位置)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

hdu 4289 利用最大流思想求图的最小割

http://acm.hdu.edu.cn/showproblem.php?pid=4289 Problem Description You, the head of Department of Security, recently received a top-secret information that a group of terrorists is planning to transport some WMD 1 from one city (the source) to anothe

【Linux】利用Xvfb关闭chrome的图形化输出

利用Xvfb关闭chrome的图形化输出 #!/bin/bash . /home/fzuir/.profile # JAVA export JAVA_HOME=/usr/local/jdk1.7.0_75 export JRE_HOME=$JAVA_HOME/jre export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar # 利用Xvfb关闭chrome的图形化输出 X

免费虚拟服务器 免费云服务器

三丰云 免费虚拟主机 免费云服务器~ 各位我最近发现了一个好东西,三丰云.也许大家对这个名字很陌生有得呢也很熟悉.我想告诉大家得是三丰云可以给大家提免费得云服务器,虚拟主机.都是免费得而且长期免费.三丰云提供的虚拟主机,云服务器都是很优秀的,而且速度非常快,面板设计也非常优秀!下面我给大家发放三丰云得地址,希望大家去看看.[三丰云,免费云服务器,免费虚拟主机!]https://www.sanfengyun.com 原文地址:https://blog.51cto.com/14298437/2381

捷配铝基板免费打样!免费打样!免费打样!

**捷配铝基板免费打样!免费打样!免费打样!申请企业认证可享铝基板特价产品免费打样! 限时不限次数!** 特价产品1 尺寸:10cm*10cm 数量:5pcs 常规工艺一口价:50元!(包邮) 出货时间:48小时 特价产品2 尺寸:10cm*10cm 数量:10pcs 常规工艺一口价:80元!(包邮) 出货时间:48小时 常规工艺说明如下(48小时出货): 1.阻焊颜色:白色(普通) 2.字符颜色:黑色 3.线宽线距:≥6mil 4.表面处理:OSP或无铅喷锡 5.板材:国纪铝基板 6.板厚:1