编写
编写时为了方便实时查看显示,一般会使用pycharm等编辑器进行。
其中大概率会插入不少的图片,如果在发布前一张一张上传到论坛图床,再一个一个替换原来的文本,这会对发布产生非常大的工作量。
所以我就在想有什么办法可以在本地正常编写,又可以一键发布到论坛上呢?我就想编写一个脚本来进行批量上传
为了方便匹配文章中出图片的位置,一般使用一个标准的命名,我使用的是 ![001.jpg](001.jpg)
001.jpg (16.92 KB, 下载次数: 0)
下载附件
2024-11-7 17:36 上传
同时真实的图片也放到同目录内
002.jpg (17.16 KB, 下载次数: 0)
下载附件
2024-11-7 17:36 上传
此时编写就可以实时查看内容,非常方便插入图片等系列编写
上传
当编写完成后,需要将图片一次性上传到论坛图床
因为我使用的是360极速浏览器发布,所以代码也是基于360极速浏览器的,其他浏览器是类似的
首先进入论坛板块,查看板块的fid
003.jpg (31.17 KB, 下载次数: 0)
下载附件
2024-11-7 17:36 上传
例如【web逆向】板块的fid就是5
然后直接关闭浏览器
import re
import os
import json
import time
import base64
import psutil
import sqlite3
import win32crypt
import requests_html
from Crypto.Cipher import AES
from requests_toolbelt.multipart.encoder import MultipartEncoder
def main():
chrome_name = '360ChromeX'
requests = requests_html.HTMLSession()
for process in psutil.process_iter():
if chrome_name in process.name():
process.kill()
file_path = os.path.join(os.getenv("LOCALAPPDATA"), chrome_name, 'Chrome', 'User Data', 'Local State')
state = json.load(open(file_path, 'r', encoding='utf-8'))['os_crypt']
if state['audit_enabled']:
key = win32crypt.CryptUnprotectData(base64.b64decode(state['encrypted_key'].encode())[5:])[1]
else:
key = b''
file_path = os.path.join(os.getenv("LOCALAPPDATA"), chrome_name, 'Chrome', 'User Data', 'Default', 'Network', 'Cookies')
conn = sqlite3.connect(file_path)
for name, encrypted_value, host_key, path in conn.execute('select name, encrypted_value, host_key, path from cookies'):
if not encrypted_value:
continue
if encrypted_value[:3] == b'v10':
nonce, encrypted_value = encrypted_value[3:15], encrypted_value[15:]
crypto = AES.new(key=key, mode=AES.MODE_GCM, nonce=nonce)
value = crypto.decrypt(encrypted_value)[:-16].decode()
else:
value = win32crypt.CryptUnprotectData(encrypted_value)[1].decode()
requests.cookies.set(name, value, domain=host_key, path=path)
conn.close()
fid = '5' # 根据自己发布在什么板块修改fid
response = requests.get('https://www.52pojie.cn/forum.php?mod=post&action=newthread&fid=' + fid)
uid = response.html.find('#imgattachform > [name="uid"]', first=True).attrs['value']
hash = response.html.find('#imgattachform > [name="hash"]', first=True).attrs['value']
formhash = response.html.find('#formhash', first=True).attrs['value']
file_name = os.path.join(os.getcwd(), 'readme.md')
with open(file_name, 'r', encoding='utf-8') as f:
md = f.read()
for img_name, img_path in re.findall('\n\!\[(.+?\.jpg)\]\((.+?)\)', md):
print(img_name)
img_full_path = os.path.join(os.getcwd(), img_path)
fields = {
"Filedata": (img_name, open(img_full_path, 'rb'), 'image/jpeg'),
"Filename": file_name,
"filetype": '.' + file_name.split('.')[-1],
"formhash": formhash,
"uid": uid,
"hash": hash,
"type": "image"
}
multipart = MultipartEncoder(
fields=fields,
boundary='----WebKitFormBoundaryLmfEqyU3MTt1Bgy0'
)
headers = {
"Content-Type": multipart.content_type,
}
data = multipart.to_string()
aid = requests.post('https://www.52pojie.cn/misc.php?mod=swfupload&action=swfupload&operation=upload&fid=' + fid, headers=headers, data=data).content.decode()
print(aid)
time.sleep(4)
md = md.replace('\n![' + img_name + '](' + img_path + ')', '\n[attachimg]' + aid + '[/attachimg]')
with open(file_name.replace('.md', '_img.md'), 'w', encoding='utf-8') as f:
f.write(md)
if __name__ == '__main__':
main()
将python代码保存到与md文件同目录,根据fid修改上面python代码的fid值,最后运行代码
此时就会自动上传md文件中所有引用到的图片到板块
当脚本完成后,会生成一个带有【_img.md】的文件,里面的链接已经被替换为可以直接发布到论坛的格式
打开浏览器进入到需要发布的页面
004.jpg (44.66 KB, 下载次数: 0)
下载附件
2024-11-7 17:36 上传
此时发帖就会发现提示有多张图片未使用,直接点击使用按钮,然后点击发布md内容,将带有【_img.md】的的文件里面所有的内容复制进去,就可以完美发帖了