Skip to content
On this page

之前一直是用Typora插入图片的时候,都是先上传图片到服务器,然后再添加链接,今天终于忍不住,还是利用了Typora的图片自动上传功能做了一个脚本。

直接附上代码

Python 客户端

python
import base64
import sys
import requests
import json
import os

token = "这里填写你的小token防止他人恶意提交"


def upload(data):
    url = "你的ApiUrl"
    res = requests.post(url=url, data=data)
    return res.text


def img2base64(imgPath):
    with open(imgPath, "rb") as fb:
        img = fb.read()
        base64_bytes = base64.b64encode(img)
        base64_str = base64_bytes.decode("utf-8")
    return base64_str


if __name__ == "__main__":
    length = len(sys.argv)
    sources = []
    results = []
    for i in range(1,length):
        ext = os.path.splitext(sys.argv[i])[-1]
        ext = (ext.split(".")[-1], "jpeg")[ext == ".jpg"]
        sources.append("data:image/" + ext + ";base64," + img2base64(sys.argv[i]))
    content = {"token": token, "data": json.dumps(sources)}
    print(upload(content))

然后在Typora的偏好设置里面,设置你的命令

image-20220608120211741

PHP 服务端

PHP
<?php
$token = $_POST['token'];
if ($token != '这里是你设置的小token') exit();
$picpath = json_decode($_POST['data']);
$len = count($picpath);
for ($i = 0; $i < $len; $i++) {
    $base64_image = str_replace(' ', '+', $picpath[$i]);
    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image, $result)) {
        //定义图片储存文件目录
        $dir = dirname(__FILE__) . "/images";
        //定义文件名称
        $picname = date("his") . '_' . getName(11);
        //获取图片后缀
        if ($result[2] == 'jpeg') {
            $picdir = $picname . '.jpg';
        } else {
            $picdir = $picname . '.' . $result[2];
        }
        //图片名称
        $image_url = $dir . '/' . $picdir;
        //储存图片
        $img_url = ''; //图片路径
        if (file_put_contents($image_url, base64_decode(str_replace($result[1], '', $base64_image)))) {
            $img_url = $image_url;
        }
    }
    echo "这里设置和Python一模一样的Url末尾是/" . "images/" . $picdir;
    if ($i != $len - 1) echo PHP_EOL;
}
function getName($n)
{
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $n; $i++) {
        $index = rand(0, strlen($characters) - 1);
        $randomString .= $characters[$index];
    }
    return $randomString;
}