实用工具|Markdown文件一键上传Freebuf
1.背景
本文主要解决本地编写的markdown文件上传freebuf的问题,核心痛点是本地编辑完markdown文件后,图片保存在本地,需要一张一张上传freebuf,并且逐个替换图片链接。在参考了大佬的相关文档后,感觉实现方式较为复杂,于是打算采用个新的思路实现freebuf文章的上传。于是造了个轮子,核心代码不超过50行,并且增加了一个功能:图片未被引用的情况下自动检测,可以进一步扩展例如自动删除无用图片等功能。
2.原理
1.读取文件路径,获取图片文件夹下的所有图片文件 。[图片文件夹下自然都是图片文件]。
2.在markdown文件中按照图片文件名逐个进行二进制查找,如果找不到说明该图片文件名,则说明该图片未被引用,剔除。
3.逐个替换markdown文件中的图片链接,保存为freebuf_xxxxx.md。
3.使用
3.1Typora设置
首先,打开typora,文件
→偏好设置
→图像
,进行如下设置
3.2获取上传TOKEN
手动上传一张图片,获取上传图片需要的的Bearer token,【备注:也可使用抓包方式获取】
将文章的编写模式改为markdown模式。按F12
键 ( 或者 CTRL+SHIF+I
)打开浏览器的开发者模式。
点击图片,选择图片文件上传。
在网络选项卡中可以看到对应url地址,以及token,从 Bearer 开始复制 到结束。注意红框中的内容,token较长,进行了自动换行。
3.3安装
需要用到requests库,使用 pip install requests
安装requests
。
将文章末尾的代码保存为 freebuf.py,通过python运行, python freebuf.py
,提示输入token后,粘贴3.2节获取到的token,然后输入文件路径,如下图所示:
脚本对未引用的图片资源进行检测后,逐个上传图片文件,并且将原始文件保存为freebuf_xxxxx.md。上传完成后,直接打开md文件,粘贴到freebuf即可。
将以下文件保存为,例如保存为:freebuf.py
import json
import os
import sys
from pathlib import Path
import requests
def upload_image(token, image_data):
r"""
:param token: http头部字段 "Authorization": token, 以Bearer开头的JWT字符串
:param image_data: 图片文件的二进制数据
:return: 上传后的图片url地址
"""
session = requests.session()
url = "https://www.freebuf.com:443/fapi/frontend/upload/image"
headers = {"Connection": "close", "Accept": "application/json, text/plain, */*",
"Authorization": token,
"X-Client-Type": "web",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
"Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryeByfZpAtj8FqfYwc",
"Origin": "https://www.freebuf.com", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors",
"Sec-Fetch-Dest": "empty", "Referer": "https://www.freebuf.com/write",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"}
data = "------WebKitFormBoundaryeByfZpAtj8FqfYwc\r\nContent-Disposition: form-data; name=\"file\"; filename=\"image.png\"\r\nContent-Type: image/png\r\n\r\n__CONTENT__\r\n------WebKitFormBoundaryeByfZpAtj8FqfYwc\r\nContent-Disposition: form-data; name=\"is_base64\"\r\n\r\n0\r\n------WebKitFormBoundaryeByfZpAtj8FqfYwc--\r\n"
result = session.post(url, headers=headers, data=data.encode().replace('__CONTENT__'.encode(), image_data))
if result.status_code == 200:
json_data = json.loads(result.text)
if json_data['code'] != 200:
print("[-]上传图片失败,token错误,请重新获取token后重新尝试,错误信息:{}".format(json_data['msg']))
sys.exit(1)
else:
return json_data['data']['url']
print("[-]服务器链接失败 ", result)
sys.exit(1)
def init_check(image_files, file_content):
r"""检查图片文件是否在Markdown中被引用过,输出检查结果,移除未被引用到的图片。
:param image_files:
:param file_content:
:return:
"""
for image_file in image_files:
if image_file.encode() not in file_content:
print("[-]发现未被引用的文件 {}".format(image_file))
image_files.remove(image_file) # 移除未被引用到的图片
# 可以做一些额外操作,比如删减无用的图片等。
print("[+]检测到图片文件{}个".format(len(image_files)))
if __name__ == '__main__':
TOKEN = "" # 如果需要上传多个文件,请给token赋值,可以减少输入次数。
file_path = ""
if TOKEN == "":
TOKEN = input("请输入Freebuf的token 示例token: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6Ikp....\n>>>")
if file_path == "":
file_path = input("请输入Mark文件路径 例如D:\\data\\python入门.md\n>>>")
while (not Path(file_path).exists()) or (file_path == ""):
file_path = input("文件路径{}不存在,请重新输入\n>>>".format(file_path))
image_dir = Path(file_path).parent / (Path(file_path).stem + ".assets") # 图片为同一目录下.assets文件夹
print(image_dir)
image_files = os.listdir(image_dir)
# 新文件路径
new_file_name = "freebuf_" + Path(file_path).name
new_file_path = Path(file_path).parent / new_file_name
# 获取文件内容
with open(file_path, 'rb') as file:
file_content = file.read()
# 初始检测
init_check(image_files, file_content)
# 开始上传
# 逐个上传文件,并且替换原始文件内容
count = 0
for image_file in image_files:
if image_file.encode() in file_content:
count += 1
# 获取图片文件二进制内容
with open(Path(image_dir) / image_file, 'rb') as file:
image_file_content = file.read()
server_url = upload_image(TOKEN, image_file_content)
# 本地markdown图片引用前边带着文件夹名称,需要一同替换掉: ![image](文章标题.assets/image-20240706154926605.png)
file_content = file_content.replace(
(Path(image_dir).name + '/' + image_file).encode(),
server_url.encode()
)
print("[+]上传成功第{}个:{}".format(count, image_file))
print("[+]上传图片文件成功{}个".format(count))
with open(new_file_path, 'wb+') as file:
file.write(file_content)
print("[+]文件保存成功 {}".format(new_file_path.absolute()))
4.后记
如果需要上传多个markdown文件,不想每次输入token,请在代码第58行 给token赋值.。TOKEN = "" #
位置。
如有其他疑问,或者更好的建议,欢迎私信。
参考文章:
https://www.freebuf.com/sectool/327474.html【相关内容已失效】
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)