V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
aimerforreimu
V2EX  ›  分享创造

还在为新浪图床限制外链苦恼?试试这个开源图床!

  •  6
     
  •   aimerforreimu ·
    0xDkd · 2019-05-04 13:06:24 +08:00 · 11827 次点击
    这是一个创建于 2030 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    最近看到不少博客的图片挂掉了,各博主也用各种方法替换掉了图片。如果从开始使用外链的时候就可以让外链可以按照图片的状况自动进行替换,是不是就没有这些麻烦了。

    于是就有了下面的想法:

    流程图

    按照这样的话,如果图片挂掉了,我们只需要从根节点将图片取出来,根据 hash 值重新上传到一个新的权重较高的图床,然后更新一下跳转链接就解决问题了, 这样链接的控制权就到我们手里了,完成了控制反转(大雾。如果图片一直挂,只能说明一个问题,你的图片有问题(黄色或者暴力)抱歉我不打算为这种图片和这样的上传者进行服务。

    图片链接类似于下面的样子,可以点击一下试试

    https://test.demo-1s.com/dispatch/b7a36157422a51122998a1b04603eca0

    动手

    于是就动手写了一个图床,集合了几个常见的图床来做一个跳转,目前大概支持 19 个图床,包括国外的一部分图床。另外支持异地根节点,包括 github,gitee,imgur,同时还支持使用代理链接去代理一些具有防盗链的图片,鉴黄和 OOS 对接正在开发中。

    感谢为我提建议的 github 的朋友,想法很不错。

    可以看一下目前的样子,另外项目地址是 https://github.com/aimerforreimu/auxpi

    支持拖拽对首页的菜单进行排序和开关控制 拖拽

    支持分发图片,返回的链接是 http://你的网站 /dispatch/{hash} 的形式,会自动跳转到权重较高的图床,并且分发是后台异步分发(感谢 Golang 的协程,用起来太爽了) 分发

    首页有几个可视化的图标,方便分析(装 x) 首页

    另外附上可以站点设置 设置 设置

    个人感悟

    楼主是一个学机械的大学生,目前大三,准备考软件或者计算机的研究生,这个东西算是对自己学习 Golang 的一个总结吧。前端用的 Vue+Element-ui ,后端用的是 Golang 进行的开发,感谢 vue-element-admin 这个后台框架,真的非常棒。一个人写所有的东西真的很累,但是收获也很多。以后开发的速度可能会比较慢了,因为要复习考研了,有空的话我会改一下 bug。希望能考上一个自己心仪的学校。

    最后是项目地址,欢迎安装使用:

    Github: https://github.com/aimerforreimu/auxpi

    第 1 条附言  ·  2019-05-04 17:09:28 +08:00
    关于是怎么完成的,我详细解释一下:

    假设现在有 A,B,C,D 个可以储存的图床,将他们按照权重进行排名,排名结果是:B,A,D,C

    首次上传我会上传到根节点(根节点可以选择:github,gitee,本地),并且会异步上传到 B 图床,因为 B 的权重排名是最高的。同时系统会自动检测图片在 B 图床的状态,如果检测到 B 图床上面的图片有了防盗链或者失效了,系统会从根节点中取出这张图片,上传到 A 图床,一次类推,直到回源为止
    61 条回复    2019-11-03 22:07:47 +08:00
    2010
        1
    2010  
       2019-05-04 13:58:35 +08:00
    演示可有?
    2010
        2
    2010  
       2019-05-04 14:01:50 +08:00
    @2010 看到了
    ksyson
        3
    ksyson  
       2019-05-04 14:29:58 +08:00 via iPhone
    战略 Star,感谢分享
    lunatic5
        4
    lunatic5  
       2019-05-04 14:51:32 +08:00
    看起来不错啊,已 Star
    aimerforreimu
        5
    aimerforreimu  
    OP
       2019-05-04 15:51:51 +08:00
    @lunatic5
    @ksyson 感谢支持
    Tink
        6
    Tink  
       2019-05-04 16:08:12 +08:00 via iPhone
    权重是自己配置还是怎么个情况?
    aimerforreimu
        7
    aimerforreimu  
    OP
       2019-05-04 16:13:55 +08:00
    @Tink 现在是默认用我配置的,后期会允许用户自己配置,如果想要改权重的话也是可以的,不过需要自己改代码,在 server/index.go 中可以修改

    https://image.prntscr.com/image/VLxqtBSEQh_Cl24851m4tw.png
    aimerforreimu
        8
    aimerforreimu  
    OP
       2019-05-04 16:15:01 +08:00
    Tink
        9
    Tink  
       2019-05-04 16:46:36 +08:00
    @aimerforreimu #7 我没太明白这个过程。比如现在阿里 oss 权重最高,然后阿里 oss 挂了,我是需要修改一下权重就自动切换到另外一个图床了,还是说需要做什么操作?

    但是你这边说修改权重需要改代码,我就不太懂了
    aimerforreimu
        10
    aimerforreimu  
    OP
       2019-05-04 17:08:16 +08:00
    @Tink 是这样的:

    我现在有 A,B,C,D 个可以储存的图床,我给他按照权重进行排名,排名结果是:B,A,D,C

    首次上传我会上传到根节点(根节点可以选择:github,gitee,本地),并且会异步上传到 B 图床,因为 B 的权重排名是最高的。同时系统会自动检测图片在 B 图床的状态,如果检测到 B 图床上面的图片有了防盗链或者失效了,系统会从根节点中取出这张图片,上传到 A 图床,一次类推,直到回源为止
    hakono
        11
    hakono  
       2019-05-04 17:13:29 +08:00
    @aimerforreimu
    顶楼和项目似乎楼主都没有把一点说清楚……
    这个图床的是上传图片的时候,会将图片按照权重列表,上传到所有支持的图床获取获取一堆图片链接,然后按照权重重定向。如果高权重的图片挂了,就自动切换到下一个权重的图床链接?
    aimerforreimu
        12
    aimerforreimu  
    OP
       2019-05-04 17:17:34 +08:00
    @hakono 上传一次其实会返回三个链接,分别是:

    分发链接: http://你的域名 /dispatch/{hash}

    根节点链接: http://xxxxxxxxxxxx

    跳转图床链接:xxxxxxx

    但是你能看到的只有分发链接,访问这个分发链接,就会自动跳转到当前的图床上面去。根节点链接是用来取出图片,重新上传用的。
    aimerforreimu
        13
    aimerforreimu  
    OP
       2019-05-04 17:18:38 +08:00
    @hakono 是的如果图片挂了后台会自动检测并且切换到下个权重高的图床
    hakono
        14
    hakono  
       2019-05-04 17:25:17 +08:00
    @aimerforreimu 啊,回复了才发现楼主已经回答了。其实我个人建议还是,上传的时候按照权重列表一次性传到所有支持的图床里。然后检测图片有没有挂,自动切换图床

    原因主要还在于楼主这个项目的一个很重要的概念:根节点。这东西不是一般人能简单确保而且长期维护的。
    首先 github 这类地方不是拿来做个人图片备份,网盘的地方。而且 github 的 repo 体积超过 1G 就会被邮件警告要求你购买文件系统服务。对于一个图床根节点来说,1G 空间非常小。
    如果放置在服务器或者 vps 本地的话,本地硬盘空间就是个很要命的问题。毕竟如果自己的 vps 服务器硬盘够大的话,一般都是考虑自己建图床了。
    aimerforreimu
        15
    aimerforreimu  
    OP
       2019-05-04 17:28:43 +08:00
    @hakono 如果非常多的话根节点可以考虑使用 Flickr 或者 imgur,Flickr 交完保护费以后是无限空间,imgur 一般不会删图片,并且是免费的。

    感谢你的提醒,回头把这两个加到根节点中
    agdhole
        16
    agdhole  
       2019-05-04 17:29:14 +08:00
    这个反推 hash 的点子不错
    前端 drawer 建议默认展开 "mdui-drawer-open",按按钮展开再切换体验真的很差
    aimerforreimu
        17
    aimerforreimu  
    OP
       2019-05-04 17:33:07 +08:00
    @agdhole 收到,感谢反馈
    FakeLeung
        18
    FakeLeung  
       2019-05-04 17:40:53 +08:00 via Android
    战略性 Mark。
    再问下,这个是开源的然后自行部署至自己的服务器吗?
    1etterSong
        19
    1etterSong  
       2019-05-04 18:07:36 +08:00
    缺开源程序?
    缺的是国内国外分布式服务端

    感谢开源
    lzxgh621
        20
    lzxgh621  
       2019-05-04 18:41:31 +08:00 via Android
    看着好熟悉,前段时间是不是发过一次。
    HuasLeung
        21
    HuasLeung  
       2019-05-04 18:49:58 +08:00 via Android
    nice
    AslanFong
        22
    AslanFong  
       2019-05-04 19:22:30 +08:00
    支持
    hugee
        23
    hugee  
       2019-05-04 19:22:47 +08:00 via Android
    聚合图床要流失大批付费用户了 23333
    mritd
        24
    mritd  
       2019-05-04 19:30:29 +08:00
    终于看到一个 go 写的了...哈哈哈哈
    aimerforreimu
        25
    aimerforreimu  
    OP
       2019-05-04 20:22:40 +08:00 via iPhone
    @mritd 个人很喜欢 go
    strugglexiang
        26
    strugglexiang  
       2019-05-04 21:02:29 +08:00 via Android
    战略收藏,以后可能用到
    ScotGu
        27
    ScotGu  
       2019-05-04 21:09:34 +08:00
    终于等到你。
    聚合图床(类似)的思路,开源的代码。
    这就去 star
    imningfeng
        28
    imningfeng  
       2019-05-04 21:36:13 +08:00
    小白可以用吗?需要先安装 go 环境?
    aimerforreimu
        29
    aimerforreimu  
    OP
       2019-05-04 22:03:34 +08:00
    @imningfeng 不需要哟,这个东西就类似于 exe,直接./auxpi 就可以运行了
    aimerforreimu
        30
    aimerforreimu  
    OP
       2019-05-04 22:04:12 +08:00
    @ScotGu 感谢~
    chroming
        31
    chroming  
       2019-05-04 22:42:06 +08:00
    学生写代码都比我厉害系列
    miaomiao888
        32
    miaomiao888  
       2019-05-05 02:05:36 +08:00
    这个类似想法前段时间看到有人发过,但不只是针对图床,而是利用一些的免费空间和图床建立低成本的网站,所谓的网站 CDN 去中心化

    https://github.com/EtherDream/decent-cdn
    chinesestudio
        33
    chinesestudio  
       2019-05-05 04:33:27 +08:00 via Android
    需要区分 https 和 http 图床 方便调用
    chinesestudio
        34
    chinesestudio  
       2019-05-05 05:08:38 +08:00 via Android
    顺便 可以利用国内外免费网盘授权存储调用图片 基本就完美了。再加一个多用户系统,就可以对外免费提供服务了。
    楼主可以参考 duplicati 加密上传到多个网盘 就样源删除图片也解决了。
    orqzsf1
        35
    orqzsf1  
       2019-05-05 09:53:29 +08:00
    战略性收藏,我是来学 go 的 /滑稽
    alexmy
        36
    alexmy  
       2019-05-05 10:45:05 +08:00
    看起来很不错哦,机械能有心来写代码,太少见了,一般都是画图画图再画图。
    python30
        37
    python30  
       2019-05-05 10:50:49 +08:00
    支持一下吧
    aimerforreimu
        38
    aimerforreimu  
    OP
       2019-05-05 11:22:31 +08:00 via iPhone
    @alexmy 确实天天画图,画的头疼,哈哈
    Panway
        39
    Panway  
       2019-05-05 13:11:51 +08:00
    想点个 Star,发现已经点过了😂
    Littmean
        40
    Littmean  
       2019-05-05 13:13:04 +08:00
    好像跟聚合图床差不多( https://www.superbed.cn/),LZ 以后会不会商业化啊?
    ccino
        41
    ccino  
       2019-05-05 13:22:34 +08:00
    @Littmean #40 不错,还有这么有趣的图床?
    aimerforreimu
        42
    aimerforreimu  
    OP
       2019-05-05 13:44:24 +08:00 via iPhone
    @Littmean 我是个学生,暂时没考虑商业化,这个算我学习 Go 过程中交的一个作业
    aimerforreimu
        43
    aimerforreimu  
    OP
       2019-05-05 13:45:11 +08:00 via iPhone
    @Panway 哈哈,感谢
    aimerforreimu
        44
    aimerforreimu  
    OP
       2019-05-05 14:31:59 +08:00 via iPhone
    @chinesestudio 好主意,有机会加上 onedrive 和 gdrive 的定时备份,其实一直是多用户的
    X-Force
        45
    X-Force  
       2019-05-05 18:10:13 +08:00
    非常棒的项目!其实除了公共图床,变化一下还能有更多的用处,比如对私有搭建的多台 VPS,一旦某台触及流量用完的阈值,就分发到下台 VPS 去。或者根据用户地理位置,分发到不同地区的 VPS ……
    Acirno
        46
    Acirno  
       2019-05-05 18:12:07 +08:00
    希望能支持截图或者复制图片后直接 CTRL+V 粘贴上传
    aimerforreimu
        47
    aimerforreimu  
    OP
       2019-05-05 18:14:26 +08:00
    @Acirno 收到,已经加入 TODO 列表中
    CononYc
        48
    CononYc  
       2019-05-06 16:39:01 +08:00
    支持,已 Star
    feiandxs
        49
    feiandxs  
       2019-05-06 17:09:24 +08:00
    这个根节点的概念其实还是等于我有个主控空间,其他的那些图床可以当 CDN 来处理了。

    这个概念挺好的,但本质上,我如果在 A 图床的图片失效了,即便后续在 B 节点更新了,但如果我其他地方有引用这张图的话……

    哦,抱歉我没看上面流程图,其实访问还是从自己这边先预先走的。
    aimerforreimu
        50
    aimerforreimu  
    OP
       2019-05-06 17:15:34 +08:00
    @feiandxs 相当于控制反转了,现在控制权在自己手里,如果想要手动改也是可以的,后面会有相应的 crud 操作
    feiandxs
        51
    feiandxs  
       2019-05-06 17:42:50 +08:00
    @aimerforreimu 我想到了一个基于 nginx+redis 的方案,其实原理应该差不多。但控制权放在自己手里是这套的精华。

    但我最想说的,好像七牛他们也不贵= =###
    aimerforreimu
        52
    aimerforreimu  
    OP
       2019-05-06 18:12:52 +08:00
    @feiandxs 流量大了就贵了,一个月几百的 CDN 费用有时候还是蛮高的,另外后面可以考虑加入 OOS 进行图片回源
    feiandxs
        53
    feiandxs  
       2019-05-07 15:41:15 +08:00
    @aimerforreimu

    其实几百的 CDN 费用也不算贵,而且这个量级对个人来说已经大到可怕了,对公司来说,反而这点钱又不是事。
    而且不论个人还是公司,有这个级别流量几百块怎么也收得回来了哈哈哈。

    但这个东西对个人确实还是有意义,蚊子肉也是肉,能不花钱就不花钱也是。。
    Musir
        54
    Musir  
       2019-05-07 20:52:05 +08:00 via Android
    这个下载才慢哦
    Musir
        55
    Musir  
       2019-05-07 22:48:07 +08:00
    以安装失败而告退
    uc2664360
        56
    uc2664360  
       2019-06-17 19:48:21 +08:00
    我不知道我理解错没,在这个图床上传的图片,拿到一个地址比如 http://abc.com/dispatch/hash
    然后每次访问这个资源都会先走图床服务器,然后由服务器进行判断是否防盗链,被墙了就按照权重使用下一个图床
    这么做的话,所有的请求都要先到图床服务器拿真实的资源链接,也就是图床服务器必须不能挂。
    如果访问量低还好,访问量上去了是不是对图床服务器的并发能力有要求了呀。
    aimerforreimu
        57
    aimerforreimu  
    OP
       2019-06-18 20:02:25 +08:00 via Android
    有缓存的,防盗链当然不可能每次都检查呀
    chinesestudio
        58
    chinesestudio  
       2019-09-07 20:48:42 +08:00 via Android
    大佬 还更新不 很多小问题 不更新的话可否付费私人定制
    zkdfbb
        59
    zkdfbb  
       2019-09-09 11:14:20 +08:00
    chinesestudio
        60
    chinesestudio  
       2019-09-09 11:53:12 +08:00 via Android
    @zkdfbb 我是用来给论坛做图床服务 不是用别人的 谢谢啦 这个和 superbed 功能差不多 改改就成
    nnuuij1
        61
    nnuuij1  
       2019-11-03 22:07:47 +08:00
    大佬,能不能做个 picgo 插件呀?你这个跟聚合图床有点像
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1953 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 00:47 · PVG 08:47 · LAX 16:47 · JFK 19:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.