用java撸个Typora图床上传工具

2,338 阅读8分钟

简介

这是一款简易Typora编辑器的图床上传命令行工具,在Typora偏好设置->图像->上传服务->Custom Command中即可设置。当然你也可以使用Typora自带的picgo,这款工具与picgo各有优势,picgo稳定有足够社区支持,这款工具只有我一个人开发维护,代码可能也写得不尽如人意,希望大佬指教。

当然这不是一个单纯的图床程序,说成是类似Postman之类的请求工具更加贴切。最开始我打算把所有请求都写在代码里,然后配置文件只需配置帐号跟密码就行,后来发现图床这么多难道一个个写代码么?图床上传的本质不就是post请求么?我把请求参数都写在配置文件不就行了?这样还更方便拓展,还不用写代码。

使用简单,current指定图床,bed里设置图床的相关请求信息,包括请求方式、请求头、请求参数、文件域等,以集合[]形式储存多个请求信息,请求根据顺序依次执行。例imgchr图床配置中有两个请求,第一个请求获取上传所需的auth_token并别名为token,第二个请求中使用该token上传图片。这是个一连贯的流程,你甚至可以配置N个请求。

与picogo比优势:

  1. 配置即用,无需编写代码
  2. 支持图片压缩再上传
  3. 用sqlite储存图片md5与外链地址,同一图片二次上传直接从数据库取url
  4. gitee大于1M图片自动转Pages地址并自动部署(需开启Pages功能)
  5. 网络任务拓展

基于java的简易图床上传命令行工具。建议jdk8+,如果你是linux并安装多个jdk,建议写jdk中java的全路径。建议使用oracle-jdk,第三方工具包对于某些jdk版本可能会出现不兼容情况。

安装教程

项目地址:gitee.com/cwayteam/Ty…

  1. 打成jar包后即用,jar包放置位置随意,执行命令时用路径即可

    可直接下载已发布程序:gitee.com/cwayteam/Ty…

  2. 默认配置文件中包含路过图床、牛图、蓝空图床、SM.MS、gitee,其他图床可自行拓展配置文件。

使用说明

  1. 新版本首次使用自动在jar包所在目录释放配置文件config.json与数据库文件config.db。

    ~~下载config.txt放置于jar包同目录,~~想用哪个图床current里就填哪个,自带多个图床只需补全所需信息即可。配置可随时拓展添加新图床,理论上知道请求方式、参数即可拓展。

  2. 在Typora中依次选 文件->偏好设置->图像 中,插入照片时的下拉框选上传图片,并选对本地位置的图片应用此规则,其它的可以取消勾选,Linux电脑可能要勾选优先使用相对路径

    image-20201130133214766

  3. 上传服务设定中选 Custom Command,命令里输入:

    java -jar jar包所在路径/upload.jar
    

    插入图片可直接自动上传,粘贴图片需选择上传

    image-20201130133252458

额外功能说明

header转换为json

例如谷歌浏览器打开控制台,选定某一请求,复制headers或其它键值对参数到txt文件

image-20201203104554166

例如复制到a.txt中,输入命令即可输出可直接复制到配置文件的格式

java -jar upload.jar ./a.txt

image-20201203105503701

网络任务

新版本会在jar包路径生成configTask.json文件,在此放置网络任务请求,语法与图床请求配置想同,该配置文件里请求每天只执行一次,执行后会更新lastExec字段。

语法例如(以下只是举例):

{
  "_ua": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Mobile Safari/537.36",
  "task":{"任务1":[
      {
        "url": "https://www.xx.com/xx",
        "type": "post",
        "header": {
          "Accept": "*/*",
          "User-Agent": "$ua"
          	},
        "param": {
          "name": "zhangsan",
          "password": "123456"
        },
        "successFlag": "success"
      }
  ]},
 "write":{
     
 }
}

若配置多个任务不想让某些执行可用"use":false让其无效。

多端发帖

程序默认带的是hu60论坛发帖配置示例,其它可自行配置。

使用命令

java -jar upload.jar abc.md

只要文件是md后缀即可,默认程序会将md转成html发布,若配置中任务名以_md结尾则以原文发布。调用时标题为$title,内容为$content

JSON配置说明

结构预览

{
  "current": "niupic",
  "date": "yyyy/MM/dd",
  "zip": 0.5,
  "db": "",
  "_ua": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Mobile Safari/537.36",
  "bed": {
    "niupic": [
      {
        "url": "http://www.niupic.com/index/upload/process",
        "type": "post",
        "fileFiled": "image_field",
        "successFlag": "success",
        "getByPath": "data",
        "out": true,
        "before": "https://"
      }
    ]
  }
}

配置文件为json数据结构,根节点包含current、bed等关键词。bed中包含各图床信息,图床中为json数组形式的请求信息,可以配置多个请求,数组中请求从上至下依次执行。

基本关键词

current:填图床别名,用于选定bed中的图床。

bed:图床配置,可以配置无限个。

db:填写值任意,只要存在该配置即开启数据库模式,上传图片后保存图片md5、url进本地数据库,同一张图片二次上传直接从数据库取地址,避免二次上传带来的资源浪费。

date:填写时间格式,例如yyyy/MM/dd,无该项配置默认为yyyy-MM-dd。可在请求中通过$date调用,例如在gitee中指定图片储存位置在日期文件夹内用到。

zip:开启图片压缩,填写范围大于0小于等于1,数字越小图片质量越差体积也越小,不会缩小图片尺寸,如需传原图请删除zip这行配置。默认的json配置里图片压缩为开,如不需要请删除该行!

_abc:下划线加任意字符,类似于变量赋值,例_ua储存User-Agent值,方便后面通过$ua调用。

use:当"use":false时代表该条请求无效

变量

在程序中定义了一个类似变量的东西,可以通过下划线直接赋值(例:"_name":"zhangsan"),后续通过美元符号调用(例:$name),在url、header、param、out的值中均可调用,若在句子中调用需在外面套曾小括号,例如:"out":"我叫($name)"

默认变量

有几个变量值无需定义,需要时直接调用即可:

$ran:五位数随机数

$timestamp:当前时间戳(13位)

$date:格式化后的日期,虽无需赋值,但可用date设置日期格式(见开头介绍)

cookie:在某个图床中,若第一个请求header中设置了cookie,则第二个请求可直接通过cookie:在某个图床中,若第一个请求header中设置了cookie,则第二个请求可直接通过`cookie`调用

$ua:同cookie,首个设置后可直接调用,但鉴于大家UA都是固定某个,建议用_ua在根节点赋值。

别名赋值

alis:在请求中填写,将请求的响应值的解析结果赋值给某变量,例:"alis":"token"将该请求解析结果赋值给token,后面请求可通过$token调用该值。

至于有人可能会问别名不是alias么?写习惯了将错就错吧,我这里alis就是别名。

请求设置

在一个图床中可包含多个请求,请求参数可通过浏览器控制台的network获取。

以下介绍的关键词全都在请求中使用(即图床[]内的请求中使用)。

条件执行

gt:文件大小大于等于指定值执行该请求,单位Byte

lt:文件大小小于指定值执行该请求

一般不用加这两个,除非是特殊场景,例如gitee。

请求参数

url:请求地址 type:请求方式 post/get(不填默认为get) header:请求头 param:请求参数 fileFiled:文件域(表单中上传文件的name,例如下图中的image_field)

image-20201127175939134

fileBase64:base64文件域,将文件base64编码后放在请求参数里。

结果解析

successFlag:成功标识,对请求后返回的数据判断有无该字符串,有则成功,成功后才能使用getByPath或getByReg进行解析请求的返回值

successFlag1:若successFlag中字符串匹配不到的话,可依次匹配successFlag1至最高successFlag10里的内容,关系为或。

getByPath:通过路径解析json数据。若请求返回是json数据,则使用该配置,值填json的路径,例如data.url,也可以填多条路径,以英文逗号隔开,例如data.url,data.imgage,前面的路径匹配不到依次向后匹配。

getByReg:通过正则解析返回数据。若返回是文本或html数据则使用正则截取,正则写在小括号里,转义符号为\。获取的内容就是小括号里正则的内容。

all:若对返回数据不处理全部使用,例 "all":true(值任意,是不是true无所谓)。

alis:对返回数据进行别名,或者说是赋值,下个请求中可以用“$别名”调用。

before:在解析结果前加文字,例如配置文件中niupic的请求返回的网址不带https://,可以使用这个加上。

after:在解析结果后加文字。

out:值任意,表示该请求输出解析结果。若值中包含变量则直接显示变量值。

图床示例

以下展示几个图床的示例,简述其思路。

牛图

    "niupic": [
      {
        "note": "牛图图床http://www.niupic.com",
        "url": "http://www.niupic.com/index/upload/process",
        "type": "post",
        "fileFiled": "image_field",
        "successFlag": "success",
        "getByPath": "data",
        "out": true,
        "before": "https://"
      }
    ],

访问官网发现它无需登陆,这就方便多了,无需token、cookie,一般只需要传必要参数即可,我截了上传时的图,如图:

image-20201130155355784

上图我们可以看到其参数只有文件域image_field,那只需设置文件域即可,并且它直接返回网址,只是网址不带http协议,这里我们用before手动加上https://即可。

蓝空图床

    "lsky": [
      {
        "note": "蓝空图床https://www.lsky.pro,以下url为官方演示,图片会清理,请使用以蓝空图床程序搭建的网站域名,邮箱,密码替换",
        "url": "https://pic.iqy.ink/api/token",
        "type": "post",
        "param": {
          "email": "aaaaa@qq.com",
          "password": "aaaaa"
        },
        "successFlag": "success",
        "getByPath": "data.token",
        "alis": "tokens"
      },
      {
        "url": "https://pic.iqy.ink/api/upload",
        "type": "post",
        "header": {
          "token": "$tokens"
        },
        "fileFiled": "image",
        "successFlag": "success",
        "getByPath": "data.url",
        "out": true
      }
    ],

Lsky Pro(兰空图床)并不是一个图床网站,而是一款图床程序,官网只提供演示并不提供图床服务,很多人用该程序搭建了图床。以上配置适合所有用蓝空程序搭建的图床。

这里我根据官网演示站点的接口说明写的配置:

pic.iqy.ink/index/api.h…

第一个请求的参数带用户邮箱、密码,对请求返回值用data.token解析获取token值,并别名赋值给了tokens;第二个上传接口就直接用了该$tokens进行上传,上传成功后通过data.url获取链接。

建议接口先用Postman进行可行性测试。

Gitee

Gitee配置较多,就不贴具体配置了。由于Gitee普通链接对超过1M的图片只能在登陆后显示,但md文件分享给别人总不能让别人登陆自己的帐号吧?

Gitee Pages倒是可以解决这个问题,仓库开启Gitee Pages,你上传的图片可通过Pages的链接查看,并且无1M限制。

因此在这里用ltgt对上传图片大小做了判断,超过1M返回Pages的地址,并对Pages进行重新部署。

这里还是推荐大家使用zip参数压缩图片(如果只是做做笔记对图片质量无要求的话),一般稍大的图片都能压缩到1M以下,可自己控制压缩率,压缩越小图片质量越差,可自行测试选择合适的压缩率。

变量说明

由于gitee需要的共用文字较多,因此我把它们抽出来写以下划线开始的变量中,以下介绍各变量填什么:

_giteeName:用户名,登陆gitee点自己头像->个人主页,在头像下@开头的就是你的用户名,此时在网址栏也能看到。

_giteeRepo:仓库名。

_giteeToken:在头像->设置->安全设置->私人令牌里生成令牌。

_giteeBranch:要部署的分支,一般都是master。

_giteeMsg:提交时信息,自定义。

_giteeFolder:图片文件夹,你在仓库新建的什么文件夹来存图片。若仓库页面没找到新建文件夹菜单,可使用WebIDE,点加号+新建目录。

image-20201130165258884

网址如下,请替换需要替换的部分:

https://gitee.com/-/ide/project/用户名/仓库名/edit/master/-/

_giteeCsrf:浏览器登录gitee,查看网页源码,搜索csrf-token,复制content内容即可。

_giteeCookie:登录gitee,浏览器控制台输入document.cookie即可获取cookie。

其它参考

  1. Typora自带picgo-core使用请参考:cway.top/post/814.ht…
  2. Typora使用js图床插件请参考:cway.top/post/713.ht…