Python代码实现Twikoo评论中的图片显示

news/2025/3/12 12:36:12/文章来源:https://www.cnblogs.com/ache/p/18758844

利用服务器公网IP和域名,通过简单的Python代码实现Twikoo评论中的图片功能。

由于没有购买和注册图床服务,且没有绑定腾讯云服务,所以只能自行想办法实现Twikoo的评论带图片功能。

想起来之前工作中有利用FastAPI实现过在Streamlit大模型RAG检索对话中的图片显示功能,因此考虑在此复用。

查看Twikoo代码中的请求方式

Twikoo官方GitHub地址: twikoo

代码路径: src/server/function/twikoo/utils/image.js
代码地址: https://github.com/twikoojs/twikoo/blob/main/src/server/function/twikoo/utils/image.js
评论图床引用代码片段:

if (!config.IMAGE_CDN || !config.IMAGE_CDN_TOKEN) {throw new Error('未配置图片上传服务')}// tip: qcloud 图床走前端上传,其他图床走后端上传if (config.IMAGE_CDN === '7bu') {await fn.uploadImageToLskyPro({ photo, fileName, config, res, imageCdn: 'https://7bu.top' })} else if (config.IMAGE_CDN === 'smms') {await fn.uploadImageToSmms({ photo, fileName, config, res, imageCdn: 'https://smms.app/api/v2/upload' })} else if (isUrl(config.IMAGE_CDN)) {await fn.uploadImageToLskyPro({ photo, fileName, config, res, imageCdn: config.IMAGE_CDN })} else if (config.IMAGE_CDN === 'lskypro') {await fn.uploadImageToLskyPro({ photo, fileName, config, res, imageCdn: config.IMAGE_CDN_URL })} else if (config.IMAGE_CDN === 'piclist') {await fn.uploadImageToPicList({ photo, fileName, config, res, imageCdn: config.IMAGE_CDN_URL })} else {throw new Error('不支持的图片上传服务')
}

在源代码的第24行,有 if (isUrl(config.IMAGE_CDN)),即支持自定义图片功能的地址,因此只需要在方法中搞清楚请求头的相关参数即可。
请求代码如下:

async uploadImageToLskyPro({ photo, fileName, config, res, imageCdn }) {// 自定义兰空图床(v2)URLconst formData = new FormData()formData.append('file', fn.base64UrlToReadStream(photo, fileName))if (process.env.TWIKOO_LSKY_STRATEGY_ID) {formData.append('strategy_id', parseInt(process.env.TWIKOO_LSKY_STRATEGY_ID))}const url = `${imageCdn}/api/v1/upload`let token = config.IMAGE_CDN_TOKENif (!token.startsWith('Bearer')) {token = `Bearer ${token}`}const uploadResult = await axios.post(url, formData, {headers: {...formData.getHeaders(),Authorization: token}})if (uploadResult.data.status) {res.data = uploadResult.data.datares.data.url = res.data.links.url} else {throw new Error(uploadResult.data.message)}
},

确定好请求头的相关参数,下面即可利用Python的FastAPI包实现图片服务,具体代码如下:

from fastapi import FastAPI, UploadFile, File, Form, HTTPException, Header, Depends
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from typing import Optional
import osapp = FastAPI()UPLOAD_Folder = 'Saved_Images'# 确保有一个目录来保存上传的图片
os.makedirs(UPLOAD_Folder, exist_ok=True)# 确定图片在网页浏览的基础地址,这里默认/images,即`https://xxxx.com/images/file_name.jpg`
app.mount("/images", StaticFiles(directory=UPLOAD_Folder), name="static")@app.post("/")
async def image_server():return {'message': 'Hello'}@app.post("/api/v1/upload")
async def upload_image(file: UploadFile = File(...),  # 接收文件strategy_id: int = Form(None),  # 接收表单字段,设置默认值为Noneauthorization: str = Header(...)  # 接收Authorization请求头
):if authorization != 'Bearer xxx':  # 这里可以设置相关鉴权的KEY等 --> 对应 `IMAGE_CDN_TOKEN`reponse = {'status': False,'data': {'links': {'url': '--'}},'message': 'Toekn Invalid..'}return reponse# 读取上传的文件file_content = await file.read()# 保存图片到服务器cur_folder = authorization.replace('Bearer ', '')if cur_folder:os.makedirs(f'{UPLOAD_Folder}/{cur_folder}', exist_ok=True)file_path = f'{UPLOAD_Folder}/{cur_folder}/{file.filename}'else:os.makedirs(f'{UPLOAD_Folder}', exist_ok=True)file_path = f'{UPLOAD_Folder}/{file.filename}'with open(file_path, "wb") as f:f.write(file_content)upload_success = True  # 假设上传总是成功的,你可以根据实际情况修改这个值if not os.path.exists(file_path):upload_success = Falsemessage = "File and form data received successfully"data = {"links": {"url": f"https://{域名orIP地址}/images/{cur_folder}/{file.filename}"  # 假设的URL  --> 对应 `IMAGE_CDN`}}# 构造响应response = {"status": upload_success,"data": data if upload_success else None,"message": message if upload_success else "Upload failed"}# 如果上传失败,你可以抛出一个HTTPExceptionif not upload_success:raise HTTPException(status_code=400, detail=response["message"])return response# 在你的主程序中运行Uvicorn服务器
if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8005)

至此,基于Pythond FastAPI的图片服务已经实现,附Python代码请求的脚本:

import requests
from fastapi import HTTPException
from typing import Optional# 假设的服务器地址和端点
url = "http://127.0.0.1:8005/api/v1/upload"# 要上传的文件路径
file_path = "star.png"# 表单数据
form_data = {"strategy_id": 123  # 假设的表单字段值
}# 请求头
headers = {"Authorization": "Bearer xxx"  # 替换为实际的鉴权令牌
}# 打开文件
with open(file_path, "rb") as file:files = {"file": (file_path, file, "multipart/form-data")}# 发送请求try:response = requests.post(url, files=files, data=form_data, headers=headers)response.raise_for_status()  # 如果请求返回了失败的状态码,将抛出HTTPError异常print(response.json())  # 打印服务器响应except requests.exceptions.HTTPError as http_err:print(f"HTTP error occurred: {http_err}")  # 打印HTTP错误except Exception as err:print(f"An error occurred: {err}")  # 打印其他错误

Twikoo管理页面配置

需配置的地方: IMAGE_CDN, IMAGE_CDN_TOKEN
Twikoo管理页面

配置完成,即可实现Twikoo评论带图片啦~

Note: 为确保能正常显示在公网,建议使用https域名进行配置,单纯IP可能不一定正常显示,未测试。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#/.NET/.NET Core优秀项目和框架2025年2月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的详细介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附…

DELLR730安装显卡后声音过大

把风扇降到30% ipmitool -I lanplus -H 192.168.2.100 -U root -P "123456" raw 0x30 0x30 0x02 0xFF 0x1E检测温度: ipmitool -I lanplus -H 192.168.2.100 -U root -P "123456" sdr type temperature

FastAPI 表单参数与文件上传完全指南:从基础到高级实战

title: FastAPI 表单参数与文件上传完全指南:从基础到高级实战 🚀 date: 2025/3/8 updated: 2025/3/8 author: cmdragon excerpt: 本教程深入探讨 FastAPI 表单参数与文件上传的核心机制,涵盖从基础表单处理到文件上传的高级用法。通过详细的代码示例、课后测验和常见错误…

事倍功半是蠢蛋 07 cursor一直generating代码

卸载最新版,回退0.45即可 别装最新版本

centos7+k8s集群环境下部署.net8

k8s集群部署.Net8 前言网上关于k8s部署.net的资料比较少,年代久远,且部署方式也只适用于教学,不适用实际生产环境,基本上没有多台服务器在k8s集群下部署.net8的资料,很多都是伪集群,要么1台机器上部署一个实例,要么1台机器上部署多个实例。 自己也是k8s刚入门的新人,部…

基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真

1.程序功能描述基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真. 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 (完整程序运行后无水印) 3.核心程序% 平均化迭代结果 for i=1:Cols+1Rcell2{i}=Rcell2{i}./MIters; end% 对RE中的数据进行排序 for i=1:ColsRcell1…

软工作业2

作业介绍这个作业属于哪个课程 软件工程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13324这个作业的目标 文本查重并测试,性能分析github https:…

三、MyBatis核心配置文件详解

三、MyBatis核心配置文件详解@目录三、MyBatis核心配置文件详解本人其他相关文章链接 三、MyBatis核心配置文件详解核心配置文件中的标签必须按照固定的顺序:properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?…

谷歌浏览器下载报错 was redirected through an insecure connection. This file should be served over HTTPS

前情: A网站是用户端 B网站是api, 用户在A网站下载B网站的一个资源, 其他浏览器是可以的, 但是谷歌浏览器就没反应 原因一: 谷歌浏览器认为http 的请求不安全, 需要设置nginx, 把http的请求重定向到https 原因二: 跨域, 谷歌认为A网站下载B网站的资源, 跨域了, 不安全…

基于PI控制算法的pwm直流电机控制系统Simulink建模与仿真

1.课题概述基于PI控制算法的pwm直流电机控制系统Simulink建模与仿真,对比基于PI控制器的直流电机控制系统。仿真结果得到基于PI控制算法的pwm直流电机控制系统,其控制性能优于基于PI控制器的直流电机控制系统。2.系统仿真结果 (完整程序运行后无水印)3.核心程序与模型 版本…

2024数证杯决赛团体赛wp

2024数证杯决赛团体赛wp 容器密码:mW7@B!tRp*Xz46Y9#KFUV^J2&NqoHqTpLCE%8rvGW(AX#1k@YL3$M5!bWY*9HLFq7UZR6^T!XoVmPK28J&CY9%6(Arz#tbU4oXYKLp7Wq^FV9H 团体赛复现比较困难,目前只找到这个师傅的wp2024数证杯决赛团体 - WXjzc - 博客园,容器密码都找了半天,才找到…

苍穹外卖开发记录 -day1

今天开始正是学习黑马的苍穹外卖了,也是认识到了幼儿级的企业项目,确实比我想象的要复杂很多,今天一天干了一些准备工作。首先要做的事搭建环境,然后彻底捣鼓了一下自己的git bash 把之前没弄完的东西都弄好了。此外github的仓库也绑定好了只是因为网络不稳定的原因暂时传不…