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

打印 上一主题 下一主题

主题 928|帖子 928|积分 2784

利用服务器公网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
品评图床引用代码片段:
  1. if (!config.IMAGE_CDN || !config.IMAGE_CDN_TOKEN) {
  2.     throw new Error('未配置图片上传服务')
  3.     }
  4.     // tip: qcloud 图床走前端上传,其他图床走后端上传
  5.     if (config.IMAGE_CDN === '7bu') {
  6.     await fn.uploadImageToLskyPro({ photo, fileName, config, res, imageCdn: 'https://7bu.top' })
  7.     } else if (config.IMAGE_CDN === 'smms') {
  8.     await fn.uploadImageToSmms({ photo, fileName, config, res, imageCdn: 'https://smms.app/api/v2/upload' })
  9.     } else if (isUrl(config.IMAGE_CDN)) {
  10.     await fn.uploadImageToLskyPro({ photo, fileName, config, res, imageCdn: config.IMAGE_CDN })
  11.     } else if (config.IMAGE_CDN === 'lskypro') {
  12.     await fn.uploadImageToLskyPro({ photo, fileName, config, res, imageCdn: config.IMAGE_CDN_URL })
  13.     } else if (config.IMAGE_CDN === 'piclist') {
  14.     await fn.uploadImageToPicList({ photo, fileName, config, res, imageCdn: config.IMAGE_CDN_URL })
  15.     } else {
  16.     throw new Error('不支持的图片上传服务')
  17. }
复制代码
在源代码的第24行,有 if (isUrl(config.IMAGE_CDN)),即支持自定义图片功能的地址,因此只需要在方法中搞清楚哀求头的相干参数即可。
哀求代码如下:
  1. async uploadImageToLskyPro({ photo, fileName, config, res, imageCdn }) {
  2.     // 自定义兰空图床(v2)URL
  3.     const formData = new FormData()
  4.     formData.append('file', fn.base64UrlToReadStream(photo, fileName))
  5.     if (process.env.TWIKOO_LSKY_STRATEGY_ID) {
  6.         formData.append('strategy_id', parseInt(process.env.TWIKOO_LSKY_STRATEGY_ID))
  7.     }
  8.     const url = `${imageCdn}/api/v1/upload`
  9.     let token = config.IMAGE_CDN_TOKEN
  10.     if (!token.startsWith('Bearer')) {
  11.         token = `Bearer ${token}`
  12.     }
  13.     const uploadResult = await axios.post(url, formData, {
  14.         headers: {
  15.             ...formData.getHeaders(),
  16.             Authorization: token
  17.         }
  18.     })
  19.     if (uploadResult.data.status) {
  20.         res.data = uploadResult.data.data
  21.         res.data.url = res.data.links.url
  22.     } else {
  23.         throw new Error(uploadResult.data.message)
  24.     }
  25. },
复制代码
确定好哀求头的相干参数,下面即可利用Python的FastAPI包实现图片服务,详细代码如下:
  1. from fastapi import FastAPI, UploadFile, File, Form, HTTPException, Header, Depends
  2. from fastapi.middleware.cors import CORSMiddleware
  3. from fastapi.staticfiles import StaticFiles
  4. from typing import Optional
  5. import os
  6. app = FastAPI()
  7. UPLOAD_Folder = 'Saved_Images'
  8. # 确保有一个目录来保存上传的图片
  9. os.makedirs(UPLOAD_Folder, exist_ok=True)
  10. # 确定图片在网页浏览的基础地址,这里默认/images,即`https://xxxx.com/images/file_name.jpg`
  11. app.mount("/images", StaticFiles(directory=UPLOAD_Folder), name="static")
  12. @app.post("/")
  13. async def image_server():
  14.     return {'message': 'Hello'}
  15. @app.post("/api/v1/upload")
  16. async def upload_image(
  17.     file: UploadFile = File(...),  # 接收文件
  18.     strategy_id: int = Form(None),  # 接收表单字段,设置默认值为None
  19.     authorization: str = Header(...)  # 接收Authorization请求头
  20. ):
  21.     if authorization != 'Bearer xxx':  # 这里可以设置相关鉴权的KEY等 --> 对应 `IMAGE_CDN_TOKEN`
  22.         reponse = {
  23.             'status': False,
  24.             'data': {
  25.                 'links': {
  26.                     'url': '--'
  27.                 }
  28.             },
  29.             'message': 'Toekn Invalid..'
  30.         }
  31.         return reponse
  32.     # 读取上传的文件
  33.     file_content = await file.read()
  34.     # 保存图片到服务器
  35.     cur_folder = authorization.replace('Bearer ', '')
  36.     if cur_folder:
  37.         os.makedirs(f'{UPLOAD_Folder}/{cur_folder}', exist_ok=True)
  38.         file_path = f'{UPLOAD_Folder}/{cur_folder}/{file.filename}'
  39.     else:
  40.         os.makedirs(f'{UPLOAD_Folder}', exist_ok=True)
  41.         file_path = f'{UPLOAD_Folder}/{file.filename}'
  42.     with open(file_path, "wb") as f:
  43.         f.write(file_content)
  44.    
  45.     upload_success = True  # 假设上传总是成功的,你可以根据实际情况修改这个值
  46.     if not os.path.exists(file_path):
  47.         upload_success = False
  48.     message = "File and form data received successfully"
  49.     data = {
  50.         "links": {
  51.             "url": f"https://{域名orIP地址}/images/{cur_folder}/{file.filename}"  # 假设的URL  --> 对应 `IMAGE_CDN`
  52.         }
  53.     }
  54.     # 构造响应
  55.     response = {
  56.         "status": upload_success,
  57.         "data": data if upload_success else None,
  58.         "message": message if upload_success else "Upload failed"
  59.     }
  60.     # 如果上传失败,你可以抛出一个HTTPException
  61.     if not upload_success:
  62.         raise HTTPException(status_code=400, detail=response["message"])
  63.     return response
  64. # 在你的主程序中运行Uvicorn服务器
  65. if __name__ == "__main__":
  66.     import uvicorn
  67.     uvicorn.run(app, host="0.0.0.0", port=8005)
复制代码
至此,基于Pythond FastAPI的图片服务已经实现,附Python代码哀求的脚本:
  1. import requests
  2. from fastapi import HTTPException
  3. from typing import Optional
  4. # 假设的服务器地址和端点
  5. url = "http://127.0.0.1:8005/api/v1/upload"
  6. # 要上传的文件路径
  7. file_path = "star.png"
  8. # 表单数据
  9. form_data = {
  10.     "strategy_id": 123  # 假设的表单字段值
  11. }
  12. # 请求头
  13. headers = {
  14.     "Authorization": "Bearer xxx"  # 替换为实际的鉴权令牌
  15. }
  16. # 打开文件
  17. with open(file_path, "rb") as file:
  18.     files = {"file": (file_path, file, "multipart/form-data")}
  19.     # 发送请求
  20.     try:
  21.         response = requests.post(url, files=files, data=form_data, headers=headers)
  22.         response.raise_for_status()  # 如果请求返回了失败的状态码,将抛出HTTPError异常
  23.         print(response.json())  # 打印服务器响应
  24.     except requests.exceptions.HTTPError as http_err:
  25.         print(f"HTTP error occurred: {http_err}")  # 打印HTTP错误
  26.     except Exception as err:
  27.         print(f"An error occurred: {err}")  # 打印其他错误
复制代码
Twikoo管理页面配置

需配置的地方: IMAGE_CDN, IMAGE_CDN_TOKEN

配置完成,即可实现Twikoo品评带图片啦~
Note: 为确保能正常显示在公网,建议利用https域名进行配置,单纯IP可能不一定正常显示,未测试。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表