Joplin Typora 粘贴图片 | 当使用Typora作为Joplin编辑器时,如何粘贴图片并上传到Joplin服务器,替换链接

一、背景

当我们使用Joplin时,上传图片时会自动上传到Joplin服务器并替换链接

但是Joplin的编辑器不好用,我更习惯用Typora来编辑,

然而Typora中上传的图片只能在本地,无法上传到Joplin服务器,在其他客户端也看不到图片

本文编写了一个脚本,通过Typora的上传服务器功能,自动上传图片并替换为Joplin链接

二、准备脚本

2.1 第一个脚本,修改token

token可以在网页剪藏器中获取

在这里插入图片描述

import requests
import sys
import json
import subprocess

# 修改为你的token
token = "请修改我"
# WARNING: replace 41184 with your joplin web clipper port
port = 41184
# 修改为你的python路径
python_exe_path = r'C:\Users\realw\AppData\Local\Microsoft\WindowsApps\python.exe'
# 修改为你的第二个脚本路径
second_script_path = r'D:\app\Typora\job\typora-windows-2.py'

# collect args for typora-windows-2.py
args = []
for arg in sys.argv:
    # the first arg is .py file, ignore it
    if(".py" in arg):
        continue
    # the second arg is the current editing file passed by Typora
    if(".md" in arg):
        args.append(arg)
        continue
    # other arg is the local Typora-Image path passed by Typora
    url = "http://127.0.0.1:" + str(port) + "/resources/?token=" + token
    payload = {'props': '{}'}
    files = [
      ('data', ('typora.png', open(arg, 'rb'), 'image/png'))
    ]
    headers = {}
    # upload your images to joplin resources using joplin web clipper API
    response = requests.request("POST", url, headers=headers, data=payload, files=files)
    newFilePath = "http://127.0.0.1:" + str(port) + "/resources/" + json.loads(response.text)["id"] + "/file?token=" + token
    # print newFilePath, so Typora can replace the local-typora-image path with the joplin web clipper url.
    # We cannot directly use "resources/" + json.loads(response.text)["id"] + ".png" since Typora thinks it is an illegal URL,
    # and a warning will show up.
    print(newFilePath)

    args.append(newFilePath)
    args.append("resources/" + json.loads(response.text)["id"] + ".png")

# first arg is .py file, second arg is .md file, then newFilePath and "resources/" + json.loads(response.text)["id"] + ".png" appear in order
# We use subprocess because Typora will wait for the result of the first script and then replace the Typora_local_path with newFilePath.
# If we don't use subprocess, our replacement will be ahead of Typora's, and covered by Typora, which makes newFilePath as the final result link.
# This is not what we want, we want "resources/" + json.loads(response.text)["id"] + ".png" as the result.
subprocess.Popen([python_exe_path, second_script_path] + args, creationflags=subprocess.DETACHED_PROCESS, shell=False)

sys.exit()

2.1 准备第二个脚本,按需修改delay时间

import sys
import time

# We need to wait Typora's replacement happens first
delay_time = 5


# Typora 将 typora-local-image-link 替换为 web-clipper-link 后,
# 而您没有按“ctrl + s”保存,您的内容不会“提交”到当前文件,
# 这使得 python 无法检测到 web-clipper-link 并将其替换为 joplin-resources-link。
# 因此我们至少重试该函数 10 次以等待您的保存。(如果您在 50 秒内没有按“ctrl + s”保存,则替换将失败)
retry_times = 10
time.sleep(delay_time)

for i in range(retry_times):
    try:
        with open(sys.argv[1], 'r+', encoding='utf-8') as file:
            file_content = file.read()
            file_content_copy = file_content
            for index, arg in enumerate(sys.argv):
                if ((".png" in arg) or (".md" in arg) or (".py" in arg)):
                    continue
                # replace newFilePath with "resources/{id}.png"
                file_content = file_content.replace(sys.argv[index], sys.argv[index + 1])
            file.seek(0)
            file.write(file_content)
            file.truncate()
        time.sleep(delay_time)
    except Exception as e:
        print(f"An error occurred: {e}")
        time.sleep(delay_time)
sys.exit()

3. 修改Typora配置

在这里插入图片描述

选择图象,上传服务,命令,确保你的python环境和模块正确

python D:\app\Typora\job\typora-windows.py ${filepath}

点击验证图片上传
在这里插入图片描述

4 在编辑器内测试

用法:

在编辑器内粘贴图片,按下ctrl+s 保存,等待几秒后自动替换为内部连接,大公告成

如果遇到问题,可以手动点击上传图片,检查顶部报错

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/706154.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速理解 Node.js 版本差异:3 分钟指南

Node.js 是一个广泛使用的 JavaScript 运行时环境,允许开发者在服务器端运行 JavaScript 代码。随着技术的发展,Node.js 不断推出新版本,引入新特性和改进。了解不同版本之间的差异对于开发者来说至关重要。以下是一个快速指南,帮…

什么是相对路径?什么是绝对路径?打包时路径怎么搞?

简单点说: 绝对路径:绝对路径是一个完整的路径,从根目录开始一直到目标文件或目录的路径。通常我们直接使用"/ "代表从根目录开始的目录路径。它提供了文件或目录在文件系统中的确切位置,与当前工作目录无关。绝对路径…

华媒舍:15种媒体推广普遍不正确及解决方法

做为新闻媒体推广的重要一环,主流媒体推广在这个时代仍然发挥着重要的作用。由于种种原因,大家在主流媒体推广中常常做出各种各样不正确。为了能帮助广大推广工作人员们更好地进行主流媒体推广,本文可能详细介绍15种常见的错误,并…

修改版的VectorDBBench更好用

原版本VectorDBBench的几个问题 在这里就不介绍VectorDBBench是干什么的了,上官网即可。 1.并发数设置的太少 2.测试时长30秒太长 3.连接milvus无用户和密码框,这个是最大的问题 4.修改了一下其它参数 由于很多网友发私信问一些milvus的相关技术问…

史上最全,呕心沥血总结oracle推进SCN方法(八)

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等) 公众号:老苏畅谈运维 欢迎关注本人公众号,更多精彩与您分享。前面介…

查分易老师怎么用?

老师们想知道怎么样创建一个查分易成绩查询系统吗?" 这是许多老师在学期结束时关心的问题。别担心,查分易小程序让查询发布工作变得省事又高效。 首先成绩Excel表格格式要设置正确。第一行必须是表头,包含学生的"姓名"、"…

qt(使用c++建立图形化界面)

建立QQ页面 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {//1:设置窗口标题this->setWindowTitle("QQ");//2:重新设计窗口大小this->resize(540,420);//3:设置窗口小图标 添加QIcon头文件 注意路径中替换/this->setWindowIcon(QIcon(&q…

【类型商店】字符字符串(下)

啊,哈喽,小伙伴们大家好。我是#Y清墨,今天呐,我要介绍的是字符与字符串。 导语 前两期,我们已经懂得了概念,今天来看些函数。 正题 一.增加或连接 (1) 后面增加() string s1,s2; //定义 s…

【动态规划】| 路径问题之最小路径和 力扣64

🎗️ 主页:小夜时雨 🎗️专栏:动态规划 🎗️如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/minimum-path-sum/description/ 这道题目和之前一道…

Pygame常用模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Pygame做游戏开发的优势在于不需要过多考虑与底层开发相关的内容,而可以把工作重心放在游戏逻辑上。例如,Pygame中集成了很多…

认识非线性调频(NLFM)信号和脉冲压缩

目录 1.原理概述2.相位逗留法设计NLFM2.1 原理分析 2.2 Matlab实现 微信公众号获取更多FPGA相关源码: 1.原理概述 非线性调频信号(NLFM)脉冲压缩原理:即采用非线性调频信号的代替线性调频信号,目的是在脉压后获得更…

大厂Java面试题:MyBatis是中如何将结果集映射到Java持久化对象?都有哪些方式?有什么区别?

大家好,我是王有志。今天给大家带来的是一道来自京东的 MyBatis 面试题:MyBatis是中如何将结果集映射到Java持久化对象?都有哪些方式?有什么区别? MyBatis 提供了两种实现结果集到 Java 持久化对象的映射方式&#xf…

【话题】程序员应该有什么职业素养

大家好,我是全栈小5,欢迎阅读小5的系列文章,这是《话题》系列文章 目录 背景职业素养的重要性职业素养的核心1.1 承诺与责任感1.2 沟通与团队合作1.3 学习与持续进步 态度和价值观的作用2.1 诚实和诚信2.2 责任和自我管理2.3 尊重和多样性 职…

席卷的B站《植物大战僵尸杂交版》V2.0.88整合包,PC和手机可用,含通关存档和视频教程!

今天给大家安利一款席卷B站,火爆全网的游戏——《植物大战僵尸杂交版》2.0.88整合包。 这个是网络上现存植物大战僵尸杂交版的最全整合,包含了修改工具,超强通关存档和高清工具。工具包有安装视频教程,支持手机版和pc多端使用&am…

flask实战之模板实现公共导航

基础实现 目标 在Flask中,使用模板继承和块(blocks)可以方便地提取公共导航菜单,使得您可以在多个页面上重用相同的导航结构。以下是一个基本示例,展示如何创建一个包含公共导航菜单的模板: 创建基础模板…

OpenCV学习(4.14) 基于分水岭算法的图像分割

1. 目标 在这一章当中, 我们将学习使用分水岭算法使用基于标记的图像分割我们将看到:cv.watershed() 2.理论 任何灰度图像都可以看作是地形表面,其中高强度表示峰和丘陵,而低强度表示山谷。您开始用不同颜色的水(标…

强化学习入门

简介 强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化…

学习笔记——网络管理与运维——概述(网络管理)

二、概述 1、什么是网络管理? 网络管理是通过对网络中设备的管理,保证设备工作正常,使通信网络正常地运行,以提供高效、可靠和安全的通信服务,是通信网络生命周期中的重要一环。 2、网络管理分类 网络管理(Network …

uni-ui:基于uni-app的全端兼容高性能UI框架

一、引言 在移动应用开发领域,跨平台框架因其能够降低开发成本、提高开发效率而备受开发者青睐。其中,uni-app作为一个使用Vue.js开发所有前端应用的框架,不仅支持编译到iOS、Android、H5、以及各种小程序等多个平台,还因其丰富的…

unDraw —— 免费且可定制的插画库,为您的设计注入灵魂

🎨 unDraw —— 免费且可定制的插画库,为您的设计注入灵魂 在寻找能够完美融入您品牌风格的插画吗?unDraw,一个提供大量免费插画资源的网站,可能是您的理想选择! 🌐 网站特色 免费且开源 unDraw…