sm 图床 Linux shell上传图片脚本

sm 图床 Linux shell上传图片脚本

sm 图床是一个免费图床,在编写 md 文件的过程中,可能需要插入图片,目前 sm 图床支持网页直接上传图片,通过提供的接口,可以使用 curl 在shell上传。

编辑文件

将文章末尾的的内容粘贴到一个文本文件中,然后授予执行权限即可使用

# 编辑一个sh文件
vim smpost.sh

# 将脚本内容粘贴到这个文件中

# 授予这个脚本可执行权限
chmod +x smpost.sh

使用方法:

./smpost.sh xxx.jpg  xxx.png

也可以将这个脚本放到 /usr/bin/ 目录,这样可以全局执行

如果想要管理图片,可以到 sm 图床上,申请一个账号,然后将 token 粘贴到指定位置。这样上传的图片全都位于这个账号下

进阶

默认情况下,脚本文件输出的url信息不够直观。所以可以安装一个 jq 软件,格式化输入信息。

sudo apt-get install jq

如果是 CentOS 系统则换用 yum 安装 jq 即可

效果图:

效果

脚本文件内容

将这里的内容粘贴到文件中即可

#!/usr/bin/env bash

base_url=https://sm.ms/api/v2
post_path=upload
token=

##################################

post_img_path="$base_url/$post_path"

function postimg(){
    if [ "$token"x == ""x ]; then
        curl $post_img_path -F "smfile=@$upload_file" -s
    else
        curl $post_img_path -H "Authorization: $token" \
            -F "smfile=@$upload_file" -s
    fi
}
function echoUrl(){
    if [ "$json_v"x == ""x ]; then
        return
    fi
    imageUrl=`echo "$json_v" |jq -r '.images'`
    if [ "$imageUrl"x == "null"x -o "$imageUrl"x == ""x ]; then
        imageUrl=`echo "$json_v" |jq -r '.data|.url'`
    fi
    if [ "$imageUrl"x != "null"x -a "$imageUrl"x != ""x ]; then
        echo "[$upload_file] remote url: [$imageUrl]"
    else
        echo "post image:[$upload_file] error info: "
        echo "$json_v"
    fi
}

for arg in "$@"; do 
    upload_file=$arg
    if [ ! -f "$upload_file" ]; then
        continue
    fi

    json_v=`postimg`
    # 使用 jq 格式化输出 url
    # 如果未安装 jq 则直接输出整个信息
    which "jq" >/dev/null 2>&1
    if [ ! $? -eq 0 ]; then
        echo "$json_v"
    else
        echoUrl
    fi
done

带备份功能的图床上传脚本

这一章节的脚本文件内容带了一个备份图片到本地某个目录的功能,如果不想使用备份功能,可以使用上面的内容,或者 backup_dir 保持为空
之所以增加一个备份图片到目录的功能,是为了防止某一台 sm.ms 图床突然倒闭,导致图片无法访问(并不是说图床就一定会倒闭,只是防范于未然)
如果不想使用sm图床了,那么只要在 md 文件中修改一下图片域名并部署自己的图床即可

#!/usr/bin/env bash

base_url=https://sm.ms/api/v2
post_path=upload
token=
# 图片本地备份路径,请在后面增加备份目录
backup_dir=
SM_HOSTS="i.loli.net test.sh"

##################################

function postimg(){
    post_img_path="$base_url/$post_path"
    if [ "$token"x == ""x ]; then
        curl --connect-timeout 10 -m 20 -s \
            $post_img_path -F "smfile=@$upload_file"
    else
        curl --connect-timeout 10 -m 20 -s \
            $post_img_path -F "smfile=@$upload_file" \
            -H "Authorization: $token"
    fi
}
function getImgUrl(){
    imageUrl=`echo "$json_v" |jq -r '.images'`
    if [ "$imageUrl"x == "null"x -o "$imageUrl"x == ""x ]; then
        imageUrl=`echo "$json_v" |jq -r '.data|.url'`
    fi
    echo "$imageUrl"
}
function echoUrl(){
    if [ "$json_v"x == ""x ]; then
        return
    fi
    imageUrl=`getImgUrl`
    if [ "$imageUrl"x != "null"x -a "$imageUrl"x != ""x ]; then
        echo "[$upload_file] remote url: [$imageUrl]"
    else
        echo "post image:[$upload_file] error info: "
        echo "$json_v"
    fi
}

function inSmHost(){
    for arg in $SM_HOSTS; do 
        if [ "$arg"x == "$checkHost"x ]; then
            echo "1"
            return
        fi
    done; echo "0"
}

function mkSmBackDirs() {
    if [ "$#"x == "0"x ]; then
        return
    fi
    isPath=false
    curBackDir="$backup_dir"
    maxCount=$#
    curCount=0

    for arg in "$@"; do
        ((curCount++))
        if [ "$isPath"x == "false"x ]; then
            checkHost="$arg"
            if [ `inSmHost`x == "1"x ]; then
                isPath=true
            fi
            continue
        fi
        if [ "$curCount"x == "$maxCount"x ]; then
            if [ "$curBackDir"x == "$backup_dir"x ]; then
                echo "backup file: [$upload_file] faild, cannot get path"
            fi
            curBackupFile="${curBackDir}/${arg}"
            if [ -f "$curBackupFile" ]; then return; fi
            if [ ! -f "$upload_file" ]; then
                echo "backup file: [$upload_file] faild, file not exists"
                return
            fi
            cp -f "$upload_file" "$curBackupFile"
            if [ ! $? -eq 0 ]; then
                echo "backup file: [$upload_file] faild, cp faild"
            else
                echo "backup file: [$upload_file] success"
            fi
        else
            curBackDir="${curBackDir}/${arg}"
            if [ ! -d "$curBackDir" ]; then mkdir "$curBackDir"; fi
            if [ ! $? -eq 0 ]; then
                echo "backup file: [$upload_file] faild, mkdir faild"
                return
            fi
        fi
    done
}

function backUpFile(){
    if [ "$backup_dir"x == ""x ]; then
        return
    fi
    if [ ! -d "$backup_dir" ]; then
        echo "backup file: [$upload_file] faild, backup dir not exists"
        return
    fi
    if [ ! -w "$backup_dir" ]; then
        echo "backup file: [$upload_file] faild, dir can not write"
        return
    fi
    imageUrl=`getImgUrl`
    if [ "$imageUrl"x == "null"x -o "$imageUrl"x == ""x ]; then
        echo "backup file: [$upload_file] faild, image url is null"
        return
    fi
    imageUParam=`echo $imageUrl |sed 's/\// /g'`
    mkSmBackDirs $imageUParam
}

for arg in "$@"; do 
    upload_file=$arg
    if [ ! -f "$upload_file" -o ! -r "$upload_file" ]; then
        continue
    fi

    json_v=`postimg`
    # 使用 jq 格式化输出 url
    # 如果未安装 jq 则直接输出整个信息
    which "jq" >/dev/null 2>&1
    if [ ! $? -eq 0 ]; then
        echo "$json_v"
    else
        echoUrl
        # 必须使用 jq 格式化获取 url后才能成功备份
        backUpFile
    fi
done

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://zwc365.com/2020/10/15/sm-linux-upload-script

Buy me a cup of coffee ☕.