实用工具|Markdown文件一键上传Freebuf

2024-07-18 195 0

实用工具|Markdown文件一键上传Freebuf

1.背景

本文主要解决本地编写的markdown文件上传freebuf的问题,核心痛点是本地编辑完markdown文件后,图片保存在本地,需要一张一张上传freebuf,并且逐个替换图片链接。在参考了大佬的相关文档后,感觉实现方式较为复杂,于是打算采用个新的思路实现freebuf文章的上传。于是造了个轮子,核心代码不超过50行,并且增加了一个功能:图片未被引用的情况下自动检测,可以进一步扩展例如自动删除无用图片等功能。

2.原理

1.读取文件路径,获取图片文件夹下的所有图片文件 。[图片文件夹下自然都是图片文件]。

2.在markdown文件中按照图片文件名逐个进行二进制查找,如果找不到说明该图片文件名,则说明该图片未被引用,剔除。

3.逐个替换markdown文件中的图片链接,保存为freebuf_xxxxx.md。

3.使用

3.1Typora设置

首先,打开typora,文件偏好设置图像,进行如下设置

实用工具|Markdown文件一键上传Freebuf插图

3.2获取上传TOKEN

手动上传一张图片,获取上传图片需要的的Bearer token,【备注:也可使用抓包方式获取】

将文章的编写模式改为markdown模式。按F12键 ( 或者 CTRL+SHIF+I)打开浏览器的开发者模式。

实用工具|Markdown文件一键上传Freebuf插图1

点击图片,选择图片文件上传。

实用工具|Markdown文件一键上传Freebuf插图2

在网络选项卡中可以看到对应url地址,以及token,从 Bearer 开始复制 到结束。注意红框中的内容,token较长,进行了自动换行。

实用工具|Markdown文件一键上传Freebuf插图3

3.3安装

需要用到requests库,使用 pip install requests安装requests

实用工具|Markdown文件一键上传Freebuf插图4

将文章末尾的代码保存为 freebuf.py,通过python运行, python freebuf.py,提示输入token后,粘贴3.2节获取到的token,然后输入文件路径,如下图所示:

实用工具|Markdown文件一键上传Freebuf插图5

实用工具|Markdown文件一键上传Freebuf插图6

脚本对未引用的图片资源进行检测后,逐个上传图片文件,并且将原始文件保存为freebuf_xxxxx.md。上传完成后,直接打开md文件,粘贴到freebuf即可。

实用工具|Markdown文件一键上传Freebuf插图7

将以下文件保存为,例如保存为: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(#换成@)

相关文章

苹果试图保护你的隐私,OpenAI可能做不到
Shuffle:一款完全自动化的安全栈增强平台
如何使用CODASM编码Payload并降低熵值
SessionExec:一款针对会话安全的安全命令测试工具
Arkime:一款大规模数据包捕获和索引数据库系统
从蓝队流量角度分析Shiro-550反序列化漏洞

发布评论