当前位置: 首页 > news >正文

seo网站推广招聘/谷歌浏览器手机版免费官方下载

seo网站推广招聘,谷歌浏览器手机版免费官方下载,我爱做妈妈网站,评估网站建设方案文章目录 完整代码一、上传资源二、替换 MD 中的引用文件为在线链接参考 完整代码 完整代码由两个文件组成,upload.py 和 main.py,放在同一目录下运行 main.py 就好! # upload.py import requests class UploadPic: def __init__(self, c…

文章目录

    • 完整代码
    • 一、上传资源
    • 二、替换 MD 中的引用文件为在线链接
    • 参考

完整代码

完整代码由两个文件组成,upload.pymain.py,放在同一目录下运行 main.py 就好!

# upload.py
import requests  class UploadPic:  def __init__(self, cookie):  self.cookie = cookie  # 解析  self.file_path = ''  self.img_type = ''  # 两个请求体  self.upload_data = {}  self.csdn_data = {}  self.output_url = ''  def _get_file(self, file_path):  with open(file_path, mode='rb') as f:  binary_data = f.read()  return binary_data  def _upload_request(self):  headers = {  'accept': '*/*',  'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',  'content-type': 'application/json',  'cookie': self.cookie,  'origin': 'https://editor.csdn.net',  'priority': 'u=1, i',  'referer': 'https://editor.csdn.net/',  'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',  'sec-ch-ua-mobile': '?0',  'sec-ch-ua-platform': '"Windows"',  'sec-fetch-dest': 'empty',  'sec-fetch-mode': 'cors',  'sec-fetch-site': 'same-site',  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',  }  params = {  'type': 'blog',  'rtype': 'markdown',  'x-image-template': '',  'x-image-app': 'direct_blog',  'x-image-dir': 'direct',  'x-image-suffix': self.img_type,  }  url = 'https://imgservice.csdn.net/direct/v1.0/image/upload'  response = requests.get(url, params=params, headers=headers)  try:  self.upload_data = response.json()  except Exception as e:  return e  def _csdn_request(self):  headers = {  'Accept': 'application/json, text/javascript, */*; q=0.01',  'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',  'Connection': 'keep-alive',  'Origin': 'https://editor.csdn.net',  'Referer': 'https://editor.csdn.net/',  'Sec-Fetch-Dest': 'empty',  'Sec-Fetch-Mode': 'cors',  'Sec-Fetch-Site': 'cross-site',  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',  'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',  'sec-ch-ua-mobile': '?0',  'sec-ch-ua-platform': '"Windows"',  }  files = {  'key': (None, self.upload_data['data']['filePath']),  'policy': (None, self.upload_data['data']['policy']),  'OSSAccessKeyId': (None, self.upload_data['data']['accessId']),  'success_action_status': (None, '200'),  'signature': (None, self.upload_data['data']['signature']),  'callback': (None, self.upload_data['data']['callbackUrl']),  'file': (f'image.{self.img_type}', self._get_file(self.file_path), f'image/{self.img_type}'),  }  url = 'https://csdn-img-blog.oss-cn-beijing.aliyuncs.com/'  response = requests.post(url, headers=headers, files=files)  try:  self.csdn_data = response.json()  self.output_url = self.csdn_data['data']['imageUrl']  except Exception as e:  return e  def upload_image(self, file_path):  self.file_path = file_path  self.img_type = self.file_path.split('.')[-1]  exception_1 = self._upload_request()  assert exception_1 is None, exception_1  exception_2 = self._csdn_request()  assert exception_2 is None, exception_2  return self.output_url  if __name__ == '__main__':  cookie = '' # 输入你的cookie  upload = UploadPic(cookie)  output_url = upload.upload_image('')  #输入你需要上传的文件位置print(output_url)
# main.py
import os  
import re  
from pathlib import Path  
from rich.progress import track  
from upload import UploadPic  class CSDNTransform:  def __init__(self, upload:UploadPic, file_path, walk_path='C:/Users/Administrator/Documents/Obsidian Vault/'):  self.upload = upload  self.file_path = file_path  self.walk_path = walk_path  self.markdown_text = ''  self.image_lst = []  self.posterior_image_lst = []  self.image_2_url_dic = {}  def _get_markdown_text(self):  with open(self.file_path, mode='r', encoding='utf-8') as f:  markdown_text = f.read()  self.markdown_text = markdown_text  def _process_markdown_text(self):  image_lst = re.findall(r'(!\[\[.*]])', self.markdown_text)  posterior_image_lst = [item[3:-2] for item in image_lst]  self.image_lst = image_lst  self.posterior_image_lst = posterior_image_lst  def _get_target_image_path(self, target_path):  for root, floders, files in os.walk(self.walk_path):  for file in files:  if file == target_path:  return str(Path(root) / file)  def _get_the_url_of_image(self, image_path):  image_url = self.upload.upload_image(image_path)  return image_url  def get_the_urls(self):  self._get_markdown_text()  self._process_markdown_text()  not_exist_image_index = []  for ix, (origin_image, target_path) in track(enumerate(zip(self.image_lst, self.posterior_image_lst))):  image_path = self._get_target_image_path(target_path)  if image_path is not None:  image_url = self._get_the_url_of_image(image_path)  self.image_2_url_dic[origin_image] = image_url  else:  not_exist_image_index.append(ix)  # 清楚掉需要删除的index  num = 0  for ix in not_exist_image_index:  del self.image_lst[ix-num]  del self.posterior_image_lst[ix-num]  num += 1  def _the_transform_data_from(self, image_url):  data_form = f"""\n<div align=center><img src="{image_url}"></div>\n"""  return data_form  def _save_markdown_text(self, output_file='markdown_processed.txt'):  with open(output_file, mode='w', encoding='utf-8') as f:  f.write(self.markdown_text)  def get_transform(self):  self.get_the_urls()  # Judge the length  assert len(self.image_lst) == len(self.image_2_url_dic), f"上传成功{len(self.image_2_url_dic)}张图片,总共有{len(self.image_lst)}张图片"  for origin_image, image_url in self.image_2_url_dic.items():  self.markdown_text = self.markdown_text.replace(origin_image, self._the_transform_data_from(image_url))  self._save_markdown_text()if __name__ == '__main__':  cookie = ''  # 输入你的cookiefile_path = ''  # 输入你要转换的markdown文件地址upload = UploadPic(cookie)  transform = CSDNTransform(upload, file_path)  markdown_text = transform.get_transform()# 修改后的 Markdown 在当前目录的 markdown_processed.txt 文件中

一、上传资源

首先我们解析 CSDN 上传请求,这里随便上传一张图片,观察请求;

请求由三部分组成,分别是:1. 获取存储位置和签名验证信息;2. 利用签名等验证信息上传文件;3. 获取文件信息并显示;

仔细观察两个请求,upload 请求是 GET ,csdn 请求是 POST,其结果很明显 csdn 请求是主体,仔细观察 csdn 的参数,可以所有参数都可以利用 upload 的返回结果得到;

那么接下来我们开始构造 upload 请求

import requestsheaders = {'accept': '*/*','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','content-type': 'application/json','cookie': '', # 输入自己的cookies'origin': 'https://editor.csdn.net','priority': 'u=1, i','referer': 'https://editor.csdn.net/','sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-site','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
}params = {'type': 'blog','rtype': 'markdown','x-image-template': '','x-image-app': 'direct_blog','x-image-dir': 'direct','x-image-suffix': 'png',
}url = 'https://imgservice.csdn.net/direct/v1.0/image/upload'
response = requests.get(url, params=params, headers=headers)# 获得数据
upload_data = response.json()

得到 json 内容如下,通过比较该内容下 expire 和 time 库下的 time.time() * 1000,再根据英文名可以推断,expire 表示的是上传文件这一请求的失效时间,即 csdn 请求的最晚成功时间;

{'code': 200,'data': {'accessId': 'LTAI5tK31AXMAqwzaX1wn4hH','callbackUrl': 'eyJjYWxsYmFja0JvZHlUeXBlIjoiYXBwbGljYXRpb24vanNvbiIsImNhbGxiYWNrVXJsIjoiaHR0cHM6Ly9pbWdzZXJ2aWNlLmNzZG4ubmV0L2RpcmVjdC92MS4wL2ltYWdlL2NhbGxiYWNrIiwiY2FsbGJhY2tCb2R5Ijoie1wiZmlsZVBhdGhcIjpcImRpcmVjdC9jN2VlYWNjZjU2ZDM0MzM3OWQ2Yjk4ZmYwNGYyZWFjNS5wbmdcIixcImlzQXVkaXRcIjoxLFwieC1pbWFnZS1hcHBcIjpcImRpcmVjdF9ibG9nXCIsXCJ0eXBlXCI6XCJibG9nXCIsXCJ1cmxNZDVcIjpcImM3ZWVhY2NmNTZkMzQzMzc5ZDZiOThmZjA0ZjJlYWM1XCIsXCJydHlwZVwiOlwibWFya2Rvd25cIixcImhvc3RuYW1lXCI6XCJodHRwczovL2ltZy1ibG9nLmNzZG5pbWcuY24vXCIsXCJzaXplXCI6XCIke3NpemV9XCIsXCJ4LWltYWdlLWRpclwiOlwiZGlyZWN0XCIsXCJ3aWR0aFwiOlwiJHtpbWFnZUluZm8ud2lkdGh9XCIsXCJ4LWltYWdlLXN1ZmZpeFwiOlwicG5nXCIsXCJ1c2VybmFtZVwiOlwibTBfNzI5NDczOTBcIixcImhlaWdodFwiOlwiJHtpbWFnZUluZm8uaGVpZ2h0fVwifSJ9','dir': 'direct','expire': '1718611892700','filePath': 'direct/c7eeaccf56d343379d6b98ff04f2eac5.png','host': 'https://csdn-img-blog.oss-cn-beijing.aliyuncs.com','policy': 'eyJleHBpcmF0aW9uIjoiMjAyNC0wNi0xN1QwODoxMTozMi43MDBaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsMTA0ODU3NjAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsImRpcmVjdC9jN2VlYWNjZjU2ZDM0MzM3OWQ2Yjk4ZmYwNGYyZWFjNS5wbmciXV19','signature': '2hRKp5YO3epBJe5+Qt7Ngi7P/y4='},'message': None,'msg': 'success'}

下面利用 upload 得到的请求来构造 csdn 请求;

import requests
from requests_toolbelt.multipart.encoder import MultipartEncoderdef get_file(file_path):"""获取文件的二进制数据"""with open(file_path, mode='rb') as f:binary_data = f.read()return binary_dataheaders = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Connection': 'keep-alive','Origin': 'https://editor.csdn.net','Referer': 'https://editor.csdn.net/','Sec-Fetch-Dest': 'empty','Sec-Fetch-Mode': 'cors','Sec-Fetch-Site': 'cross-site','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0','sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"',
}success_action_status = '200'# upload 请求中获取到的数据
key = upload_data['data']['filePath']
policy = upload_data['data']['policy']
OSSAccessKeyId = upload_data['data']['accessId']
signature = upload_data['data']['signature']
callback = upload_data['data']['callbackUrl']# 上传的图片位置,
file = get_file('') # 输入需要上传文件的位置files = {'key': (None, key),'policy': (None, policy),'OSSAccessKeyId': (None, OSSAccessKeyId),'success_action_status': (None, '200'),'signature': (None, signature),'callback': (None, callback),'file': ('image.png', file, 'image/png'),
}url = 'https://csdn-img-blog.oss-cn-beijing.aliyuncs.com/'
response = requests.post(url, headers=headers, files=files)print(response.text)

得到 Json 数据如下

{'code': 200,'data': {'hostname': 'https://img-blog.csdnimg.cn/','imageUrl': 'https://img-blog.csdnimg.cn/direct/97c5610606c140afb474800403140ea3.png','width': '1138','targetObjectKey': 'direct/97c5610606c140afb474800403140ea3.png','x-image-suffix': 'png','height': '239'},'msg': 'success'}

在其中 imageUrl 就表示上传的图片地址,同时,图片格式有许多种,面对不同的图片格式,在尝试观察后发现只需要修改 upload 请求中 parms 中的 x-image-suffixcsdn 请求中 files 中的 file

整合得到完整上传类如下:

import requests  class UploadPic:  def __init__(self, cookie):  self.cookie = cookie  # 解析  self.file_path = ''  self.img_type = ''  # 两个请求体  self.upload_data = {}  self.csdn_data = {}  self.output_url = ''  def _get_file(self, file_path):  with open(file_path, mode='rb') as f:  binary_data = f.read()  return binary_data  def _upload_request(self):  headers = {  'accept': '*/*',  'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',  'content-type': 'application/json',  'cookie': self.cookie,  'origin': 'https://editor.csdn.net',  'priority': 'u=1, i',  'referer': 'https://editor.csdn.net/',  'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',  'sec-ch-ua-mobile': '?0',  'sec-ch-ua-platform': '"Windows"',  'sec-fetch-dest': 'empty',  'sec-fetch-mode': 'cors',  'sec-fetch-site': 'same-site',  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',  }  params = {  'type': 'blog',  'rtype': 'markdown',  'x-image-template': '',  'x-image-app': 'direct_blog',  'x-image-dir': 'direct',  'x-image-suffix': self.img_type,  }  url = 'https://imgservice.csdn.net/direct/v1.0/image/upload'  response = requests.get(url, params=params, headers=headers)  try:  self.upload_data = response.json()  except Exception as e:  return e  def _csdn_request(self):  headers = {  'Accept': 'application/json, text/javascript, */*; q=0.01',  'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',  'Connection': 'keep-alive',  'Origin': 'https://editor.csdn.net',  'Referer': 'https://editor.csdn.net/',  'Sec-Fetch-Dest': 'empty',  'Sec-Fetch-Mode': 'cors',  'Sec-Fetch-Site': 'cross-site',  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',  'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',  'sec-ch-ua-mobile': '?0',  'sec-ch-ua-platform': '"Windows"',  }  files = {  'key': (None, self.upload_data['data']['filePath']),  'policy': (None, self.upload_data['data']['policy']),  'OSSAccessKeyId': (None, self.upload_data['data']['accessId']),  'success_action_status': (None, '200'),  'signature': (None, self.upload_data['data']['signature']),  'callback': (None, self.upload_data['data']['callbackUrl']),  'file': (f'image.{self.img_type}', self._get_file(self.file_path), f'image/{self.img_type}'),  }  url = 'https://csdn-img-blog.oss-cn-beijing.aliyuncs.com/'  response = requests.post(url, headers=headers, files=files)  try:  self.csdn_data = response.json()  self.output_url = self.csdn_data['data']['imageUrl']  except Exception as e:  return e  def upload_image(self, file_path):  self.file_path = file_path  self.img_type = self.file_path.split('.')[-1]  exception_1 = self._upload_request()  assert exception_1 is None, exception_1  exception_2 = self._csdn_request()  assert exception_2 is None, exception_2  return self.output_url  if __name__ == '__main__':  cookie = '' # 输入你的cookie  upload = UploadPic(cookie)  output_url = upload.upload_image('')  #输入你需要上传的文件位置print(output_url)

二、替换 MD 中的引用文件为在线链接

首先,肯定是整体替换而不是单个替换,因此我们的流程为:1. 上传所有文件,直到所有的文件都上传成功;2. 替换所有文件;

首先提取出 Markdown 中所有的图片信息,一般来说图片信息都在两个中括号之间 ![[ img_pic ]],使用 re 正则提取,代码如下;

import refile_path = 'C:/Users/Administrator/Documents/Obsidian Vault/UE开发/My FirstGame Tutorial.md'with open(file_path, mode='r', encoding='utf-8') as f:markdown_text = f.read()image_lst = re.findall(r'(!\[\[.*\]\])', markdown_text)
posterior_image_lst = [item[3:-2] for item in image_lst]

提取出所有的 img_pic 后,我们需要在根目录下寻找文件,一般来说在 Markdown 中文件名是不重复的;

import os
from pathlib import Pathdef get_target_image_path(target_path):walk_path = 'C:/Users/Administrator/Documents/Obsidian Vault/'for root, floders, files in os.walk(walk_path):for file in files:if file == target_path:return Path(root) / fileget_target_image_path(posterior_image_lst[0])

获取到了绝对位置后,我们可以将图片上传,在检查图片全部都上传完毕后,我们就可以替换 ![[ img_pic ]]

import os  
import re  
import requests  
from pathlib import Path  
from rich.progress import track  class UploadPic:  def __init__(self, cookie):  self.cookie = cookie  # 解析  self.file_path = ''  self.img_type = ''  # 两个请求体  self.upload_data = {}  self.csdn_data = {}  self.output_url = ''  def _get_file(self, file_path):  with open(file_path, mode='rb') as f:  binary_data = f.read()  return binary_data  def _upload_request(self):  headers = {  'accept': '*/*',  'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',  'content-type': 'application/json',  'cookie': self.cookie,  'origin': 'https://editor.csdn.net',  'priority': 'u=1, i',  'referer': 'https://editor.csdn.net/',  'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',  'sec-ch-ua-mobile': '?0',  'sec-ch-ua-platform': '"Windows"',  'sec-fetch-dest': 'empty',  'sec-fetch-mode': 'cors',  'sec-fetch-site': 'same-site',  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',  }  params = {  'type': 'blog',  'rtype': 'markdown',  'x-image-template': '',  'x-image-app': 'direct_blog',  'x-image-dir': 'direct',  'x-image-suffix': self.img_type,  }  url = 'https://imgservice.csdn.net/direct/v1.0/image/upload'  response = requests.get(url, params=params, headers=headers)  try:  self.upload_data = response.json()  except Exception as e:  return e  def _csdn_request(self):  headers = {  'Accept': 'application/json, text/javascript, */*; q=0.01',  'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',  'Connection': 'keep-alive',  'Origin': 'https://editor.csdn.net',  'Referer': 'https://editor.csdn.net/',  'Sec-Fetch-Dest': 'empty',  'Sec-Fetch-Mode': 'cors',  'Sec-Fetch-Site': 'cross-site',  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',  'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',  'sec-ch-ua-mobile': '?0',  'sec-ch-ua-platform': '"Windows"',  }  files = {  'key': (None, self.upload_data['data']['filePath']),  'policy': (None, self.upload_data['data']['policy']),  'OSSAccessKeyId': (None, self.upload_data['data']['accessId']),  'success_action_status': (None, '200'),  'signature': (None, self.upload_data['data']['signature']),  'callback': (None, self.upload_data['data']['callbackUrl']),  'file': (f'image.{self.img_type}', self._get_file(self.file_path), f'image/{self.img_type}'),  }  url = 'https://csdn-img-blog.oss-cn-beijing.aliyuncs.com/'  response = requests.post(url, headers=headers, files=files)  try:  self.csdn_data = response.json()  self.output_url = self.csdn_data['data']['imageUrl']  except Exception as e:  return e  def upload_image(self, file_path):  self.file_path = file_path  self.img_type = self.file_path.split('.')[-1]  exception_1 = self._upload_request()  assert exception_1 is None, exception_1  exception_2 = self._csdn_request()  assert exception_2 is None, exception_2  return self.output_url  class CSDNTransform:  def __init__(self, upload:UploadPic, file_path, walk_path='C:/Users/Administrator/Documents/Obsidian Vault/'):  self.upload = upload  self.file_path = file_path  self.walk_path = walk_path  self.markdown_text = ''  self.image_lst = []  self.posterior_image_lst = []  self.image_2_url_dic = {}  def _get_markdown_text(self):  with open(self.file_path, mode='r', encoding='utf-8') as f:  markdown_text = f.read()  self.markdown_text = markdown_text  def _process_markdown_text(self):  image_lst = re.findall(r'(!\[\[.*]])', self.markdown_text)  posterior_image_lst = [item[3:-2] for item in image_lst]  self.image_lst = image_lst  self.posterior_image_lst = posterior_image_lst  def _get_target_image_path(self, target_path):  for root, floders, files in os.walk(self.walk_path):  for file in files:  if file == target_path:  return str(Path(root) / file)  def _get_the_url_of_image(self, image_path):  image_url = self.upload.upload_image(image_path)  return image_url  def get_the_urls(self):  self._get_markdown_text()  self._process_markdown_text()  not_exist_image_index = []  for ix, (origin_image, target_path) in track(enumerate(zip(self.image_lst, self.posterior_image_lst))):  image_path = self._get_target_image_path(target_path)  if image_path is not None:  image_url = self._get_the_url_of_image(image_path)  self.image_2_url_dic[origin_image] = image_url  else:  not_exist_image_index.append(ix)  # 清楚掉需要删除的index  num = 0  for ix in not_exist_image_index:  del self.image_lst[ix-num]  del self.posterior_image_lst[ix-num]  num += 1  def _the_transform_data_from(self, image_url):  data_form = f"""\n<div align=center><img src="{image_url}"></div>\n"""  return data_form  def _save_markdown_text(self, output_file='markdown_processed.txt'):  with open(output_file, mode='w', encoding='utf-8') as f:  f.write(self.markdown_text)  def get_transform(self):  self.get_the_urls()  # Judge the length  assert len(self.image_lst) == len(self.image_2_url_dic), f"上传成功{len(self.image_2_url_dic)}张图片,总共有{len(self.image_lst)}张图片"  for origin_image, image_url in self.image_2_url_dic.items():  self.markdown_text = self.markdown_text.replace(origin_image, self._the_transform_data_from(image_url))  self._save_markdown_text()if __name__ == '__main__':  cookie = ''  # 输入你的cookiefile_path = ''  # 输入你要转换的markdown文件地址upload = UploadPic(cookie)  transform = CSDNTransform(upload, file_path)  markdown_text = transform.get_transform()# 修改后的 Markdown 在当前目录的 markdown_processed.txt 文件中

参考

requests库post请求参数data、json和files的使用_requests post data-CSDN博客
HTTP协议之multipart/form-data请求分析_http form-data请求-CSDN博客

相关文章:

CSDN 自动上传图片并优化Markdown的图片显示

文章目录 完整代码一、上传资源二、替换 MD 中的引用文件为在线链接参考 完整代码 完整代码由两个文件组成&#xff0c;upload.py 和 main.py&#xff0c;放在同一目录下运行 main.py 就好&#xff01; # upload.py import requests class UploadPic: def __init__(self, c…...

常见日志库NLog、log4net、Serilog和Microsoft.Extensions.Logging介绍和区别

在C#中&#xff0c;日志库的选择主要取决于项目的具体需求&#xff0c;包括性能、易用性、可扩展性等因素。以下是关于NLog、log4net、Serilog和Microsoft.Extensions.Logging的基本介绍和使用示例。 包含如何配置输出日志到当前目录下的log.txt文件及控制台的示例&#xff0c;…...

【PX4-AutoPilot教程-TIPS】离线安装Flight Review PX4日志分析工具

离线安装Flight Review PX4日志分析工具 安装方法 安装方法 使用Flight Review在线分析日志&#xff0c;有时会因为网络原因无法使用。 使用离线安装的方式使用Flight Review&#xff0c;可以在无需网络的情况下使用Flight Review网页。 安装环境依赖。 sudo apt-get insta…...

探究Spring Boot自动配置的底层原理

在当今的软件开发领域&#xff0c;Spring Boot已经成为了构建Java应用程序的首选框架之一。它以其简单易用的特性和强大的功能而闻名&#xff0c;其中最引人注目的特性之一就是自动配置&#xff08;Auto-Configuration&#xff09;。Spring Boot的自动配置能够极大地简化开发人…...

Fedora40的#!bash #!/bin/bash #!/bin/env bash #!/usr/bin/bash #!/usr/bin/env bash

bash脚本开头可写成 #!/bin/bash , #!/bin/env bash , #!/usr/bin/bash , #!/usr/bin/env bash #!/bin/bash , #!/usr/bin/bash#!/bin/env bash , #!/usr/bin/env bash Fedora40Workstation版的 /bin 是 /usr/bin 的软链接, /sbin 是 /usr/sbin 的软链接, rootfedora:~# ll …...

重生之 SpringBoot3 入门保姆级学习(19、场景整合 CentOS7 Docker 的安装)

重生之 SpringBoot3 入门保姆级学习&#xff08;19、场景整合 CentOS7 Docker 的安装&#xff09; 6、场景整合6.1 Docker 6、场景整合 6.1 Docker 官网 https://docs.docker.com/查看自己的 CentOS配置 cat /etc/os-releaseStep 1: 安装必要的一些系统工具 sudo yum insta…...

cve_2014_3120-Elasticsearch-rce-vulfocus靶场

1.背景 来源&#xff1a;ElasticSearch&#xff08;CVE-2014-3120&#xff09;命令执行漏洞复现_mvel 漏洞-CSDN博客 参考&#xff1a;https://www.cnblogs.com/huangxiaosan/p/14398307.html 老版本ElasticSearch支持传入动态脚本&#xff08;MVEL&#xff09;来执行一些复…...

吴恩达2022机器学习专项课程C2W3:2.26 机器学习发展历程

目录 开发机器学习系统的过程开发机器学习案例1.问题描述2.创建监督学习算法3.解决问题4.小结 误差分析1.概述2.误差分析解决之前的问题3.小结 增加数据1.简述2.增加数据案例一3.增加数据案例二4.添加数据的技巧5.空白创建数据6.小结 迁移学习1.简述2.为什么迁移学习有作用3.小…...

当OpenHarmony遇上OpenEuler

1、 安装openEuler 虚拟机、物理机器当然都可以安装。虚拟机又可以使用WSL、或者VMWare、VirtualBox虚拟机软件&#xff0c;如果需要安装最新版本&#xff0c;建议使用后者。当前WSL只支持OpenEuler 20.03。 1.1 WSL openEuler WSL的安装都是程序员的必备技能了&#xff0c;…...

Apple - Framework Programming Guide

本文翻译自&#xff1a;Framework Programming Guide&#xff08;更新日期&#xff1a;2013-09-17 https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html#//apple_ref/doc/uid/10000183i 文章目录 一、框架编程指南简介…...

R可视化:ggpubr包学习

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者 Xiao hong书&#xff1a;生信学习者 知hu&#xff1a;生信学习者 CDSN&#xff1a;生信学习者2 介绍 ggpubr是我经常会用到的R包&#xff0c;它傻瓜式的画图方式对很多初次接触R绘图的人来…...

优化Spring Boot项目启动时间:详解与实践

目录 引言了解Spring Boot框架启动机制常见启动瓶颈分析优化策略 禁用不必要的自动配置使用Profile进行开发和生产环境区分精简依赖延迟加载Bean并行初始化Bean缓存数据源连接优化Spring Data JPA使用Spring Boot DevTools 通过性能测试工具分析和优化实战示例&#xff1a;一个…...

Android如何简单快速实现RecycleView的拖动重排序功能

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 要实现这个拖动重排序功能&#xff0c;主要是用到了RecycleView的ItemTouchHelper类 首先是定义一个接口 interface ItemTouchHelperAdapter …...

LabVIEW利用旋转编码器脉冲触发数据采集

利用旋转编码器发出的脉冲控制数据采集&#xff0c;可以采用硬件触发方式&#xff0c;以确保每个脉冲都能触发一次数据采集。本文提供了详细的解决方案&#xff0c;包括硬件连接、LabVIEW编程和触发设置&#xff0c;确保数据采集的准确性和实时性。 一、硬件连接 1. 旋转编码…...

Dubbo3 服务原生支持 http 访问,兼具高性能与易用性

作者&#xff1a;刘军 作为一款 rpc 框架&#xff0c;Dubbo 的优势是后端服务的高性能的通信、面向接口的易用性&#xff0c;而它带来的弊端则是 rpc 接口的测试与前端流量接入成本较高&#xff0c;我们需要专门的工具或协议转换才能实现后端服务调用。这个现状在 Dubbo3 中得…...

我在高职教STM32——GPIO入门之蜂鸣器

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…...

STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建

STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建 文章目录 STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建功能与作用典型工作流程 1. 硬件原理图介绍2. STM32 CubeMX工程搭建2.1 创建工程2.2 系统配置2.3 USART串口配…...

如果搜索一定超时,如何用dp来以空间换时间

E - Alphabet Tiles (atcoder.jp) 题目大意&#xff1a;1到k长度的字符串时&#xff0c;在A-Z给定数量下&#xff0c;搭配出多少种不同的字符串 思路 排列组合&#xff0c;会死人的 暴搜&#xff1a;可以解决&#xff0c;但是时间太长 dp&#xff1a;考虑前 i 个字母&…...

MySQL常见的命令

MySQL常见的命令 查看数据库&#xff08;注意添加分号&#xff09; show databases;进入到某个库 use 库; 例如&#xff1a;进入test use test;显示表格 show tables;直接展示某个库里面的表 show tables from 库&#xff1b; 例如&#xff1a;展示mysql中的表格 show tabl…...

11 类型泛化

11 类型泛化 1、函数模版1.1 前言1.2 函数模版1.3 隐式推断类型实参1.4 函数模板重载1.5 函数模板类型形参的默认类型&#xff08;C11标准&#xff09; 2、类模版2.1 类模板的成员函数延迟实例化2.2 类模板的静态成员2.3 类模板的递归实例化2.4 类模板类型形参缺省值 3、类模板…...

UE4_后期_ben_模糊和锐化滤镜

学习笔记&#xff0c;不喜勿喷&#xff0c;侵权立删&#xff0c;祝愿生活越来越好&#xff01; 本篇教程主要介绍后期处理的简单模糊和锐化滤镜效果&#xff0c;学习之前首先要回顾下上节课介绍的屏幕扭曲效果&#xff1a; 这是全屏效果&#xff0c;然后又介绍了几种蒙版&#…...

Spring Boot中Excel的导入导出的实现之Apache POI框架使用教程

文章目录 前言一、Apache POI 是什么&#xff1f;二、使用 Apache POI 实现 Excel 的导入和导出① 导入 Excel1. 添加依赖2. 编写导入逻辑3. 在 Controller 中处理上传请求 ② 导出 Excel1. 添加依赖2. 编写导出逻辑3. 在 Controller 中处理导出请求 总结 前言 在 Spring Boot …...

CentOS搭建kubernetes集群详细过程(yum安装方式)

kubernetes集群搭建详细过程&#xff08;yum安装方式&#xff09; Kubernetes&#xff0c;也被称为K8s&#xff0c;是一个多功能的容器管理工具&#xff0c;它不仅能够协调和调度容器的部署&#xff0c;而且还能监控容器的健康状况并自动修复常见问题。这个平台是在谷歌十多年…...

Java 面试题:Java 的 Exception 和 Error 有什么区别?

在Java编程中&#xff0c;异常处理是确保程序稳健性和可靠性的重要机制。Java提供了一套完善的异常处理框架&#xff0c;通过捕获和处理异常&#xff0c;开发者可以有效地应对程序运行时可能出现的各种问题。在这一框架中&#xff0c;Exception和Error是两个核心概念&#xff0…...

在Vue 3中,el-select循环el-option的常见踩坑点,value值绑定对象类型?选中效果不准确?

在Vue 3中&#xff0c;el-select 组件是来自 Element Plus UI 库的一部分。 如果你想要设置默认选中的选项&#xff0c;你可以使用 v-model 来绑定选中的值。如果你想要在某个时刻让某个选项显示为已选中&#xff0c;可以设置对应的值到 v-model 绑定的数据。 <template>…...

Qt实现单例模式:Q_GLOBAL_STATIC和Q_GLOBAL_STATIC_WITH_ARGS

目录 1.引言 2.了解Q_GLOBAL_STATIC 3.了解Q_GLOBAL_STATIC_WITH_ARGS 4.实现原理 4.1.对象的创建 4.2.QGlobalStatic 4.3.宏定义实现 4.4.注意事项 5.总结 1.引言 设计模式之单例模式-CSDN博客 所谓的全局静态对象&#xff0c;大多是在单例类中所见&#xff0c;在之前…...

通过nginx转发后应用偶发502bad gateway

序言 学习了一些东西&#xff0c;如何才是真正自己能用的呢&#xff1f;好像就是看自己的潜意识的反应&#xff0c;例如解决了一个问题&#xff0c;那么下次再碰到类似的问题&#xff0c;能直接下意识的去找到对应的信息&#xff0c;从而解决&#xff0c;而不是和第一次碰到一样…...

linux中如何进行yum源的挂载

linux中如何进行yum源的挂载 ​ 1.首先创建目录[rootserver /]# mkdir /rhel92.使用mount命令进行、dev/cdrom/的镜像文件进行挂载[rootserver /]# mount /dev/cdrom /rhel9/ ​ 注意&#xff1a;此时设立的是临时命令。重启后则失效&#xff0c;若想在下次开启后仍然挂载&a…...

ffmpeg的部署踩坑及简单使用方式

ffmpeg的使用方式有以下几种: 使用原生安装包 直接在ffmpeg官网上下载安装该软件,加入到环境变量中就可以使用了 优点:简单,灵活,代码中也不用添加其他第三方的包 缺点:需要手动安装ffmpeg,这点比较麻烦 部署-windows 在windows环境下,有时就算加入到了环境变量,…...

misc刷题记录2[陇剑杯 2021]

[陇剑杯 2021]webshell (1)单位网站被黑客挂马&#xff0c;请您从流量中分析出webshell&#xff0c;进行回答&#xff1a; 黑客登录系统使用的密码是_____________。得到的flag请使用NSSCTF{}格式提交。 这里我的思路是&#xff0c;既然要选择的时间段是黑客登录网站以后&…...