From cf82997aa26971b833010c6afcc423f540f1c73d Mon Sep 17 00:00:00 2001 From: terwer Date: Sun, 13 Aug 2023 22:00:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=85=BC=E5=AE=B9=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E4=B8=8A=E4=BC=A0-=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E5=9B=BE=E7=89=87=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/adaptors/web/zhihu/zhihuWebAdaptor.ts | 10 +-- src/components/test/CnblogsTest.vue | 11 ++- src/components/test/TypechoTest.vue | 70 ++++++++++++---- src/components/test/WordpressTest.vue | 28 ++++++- src/composables/useProxy.ts | 16 +--- src/pages/ApiTest.vue | 15 +++- src/utils/polyfillUtils.ts | 98 ++++++++++++++++++++--- 7 files changed, 190 insertions(+), 58 deletions(-) diff --git a/src/adaptors/web/zhihu/zhihuWebAdaptor.ts b/src/adaptors/web/zhihu/zhihuWebAdaptor.ts index 334abc75..2c2256f3 100644 --- a/src/adaptors/web/zhihu/zhihuWebAdaptor.ts +++ b/src/adaptors/web/zhihu/zhihuWebAdaptor.ts @@ -29,8 +29,7 @@ import * as cheerio from "cheerio" import { JsonUtil, StrUtil } from "zhi-common" import { usePicgoBridge } from "~/src/composables/usePicgoBridge.ts" import { IPublishCfg } from "~/src/types/IPublishCfg.ts" -import { useProxy } from "~/src/composables/useProxy.ts" -import { blobToBuffer } from "~/src/utils/polyfillUtils.ts" +import { base64ToBuffer, remoteImageToBase64Info } from "~/src/utils/polyfillUtils.ts" /** * 知乎网页授权适配器 @@ -104,7 +103,6 @@ class ZhihuWebAdaptor extends BaseWebApi { const cfg = pubCfg.cfg const { getImageItemsFromMd } = usePicgoBridge() - const { proxyBlob } = useProxy(cfg.middlewareUrl) // 找到所有的图片 const images = await getImageItemsFromMd(id, post.markdown) @@ -117,9 +115,9 @@ class ZhihuWebAdaptor extends BaseWebApi { for (const image of images) { const imageUrl = image.url - const imageBlob = await proxyBlob(imageUrl) - const bits = await blobToBuffer(imageBlob) - const mediaObject = new MediaObject(image.name, imageBlob.type, bits) + const base64Info = await remoteImageToBase64Info(imageUrl) + const bits = base64ToBuffer(base64Info.imageBase64) + const mediaObject = new MediaObject(image.name, base64Info.mimeType, bits) this.logger.debug("before upload, mediaObject =>", mediaObject) const attachResult = await this.newMediaObject(mediaObject) this.logger.debug("attachResult =>", attachResult) diff --git a/src/components/test/CnblogsTest.vue b/src/components/test/CnblogsTest.vue index 07de9f36..449f025c 100644 --- a/src/components/test/CnblogsTest.vue +++ b/src/components/test/CnblogsTest.vue @@ -31,8 +31,7 @@ import { MediaObject, Post } from "zhi-blog-api" import { createAppLogger } from "~/src/utils/appLogger.ts" import Adaptors from "~/src/adaptors" import { useVueI18n } from "~/src/composables/useVueI18n.ts" -import { useProxy } from "~/src/composables/useProxy.ts" -import { blobToBuffer, fileToBuffer, toBuffer } from "~/src/utils/polyfillUtils.ts" +import { base64ToBuffer, remoteImageToBase64 } from "~/src/utils/polyfillUtils.ts" const logger = createAppLogger("cnblogs-test") @@ -327,15 +326,15 @@ const cnblogsHandleApi = async () => { // 设置文件的元数据 const cnblogsApiAdaptor = await Adaptors.getAdaptor(key) - const cfg = await Adaptors.getCfg(key) const cnblogsApi = Utils.blogApi(appInstance, cnblogsApiAdaptor) - const { proxyBlob } = useProxy(cfg.middlewareUrl) logger.info("cnblogsApi=>", cnblogsApi) const imageUrl = "https://static-rs-terwer.oss-cn-beijing.aliyuncs.com/test/image-20230812091531-hibwr1g.png" const imageName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1) - const imageBlob = await proxyBlob(imageUrl) - const bits = await blobToBuffer(imageBlob) + const imageBase64 = await remoteImageToBase64(imageUrl) + logger.debug("imageBase64=>", { imageBase64 }) + + const bits = base64ToBuffer(imageBase64) logger.debug("bits=>", bits) const mediaObject = new MediaObject(imageName, "image/png", bits) logger.info("mediaObject=>", mediaObject) diff --git a/src/components/test/TypechoTest.vue b/src/components/test/TypechoTest.vue index 69275c44..91119ed2 100644 --- a/src/components/test/TypechoTest.vue +++ b/src/components/test/TypechoTest.vue @@ -27,11 +27,10 @@ import { AppInstance } from "~/src/appInstance.ts" import { Utils } from "~/src/utils/utils.ts" import { reactive, ref } from "vue" -import { fileToBuffer } from "~/src/utils/polyfillUtils.ts" -import { SimpleXmlRpcClient } from "simple-xmlrpc" import { MediaObject } from "zhi-blog-api" import { createAppLogger } from "~/src/utils/appLogger.ts" import Adaptors from "~/src/adaptors" +import { base64ToBuffer, remoteImageToBase64 } from "~/src/utils/polyfillUtils.ts" const logger = createAppLogger("typecho-test") @@ -223,23 +222,64 @@ const typechoHandleApi = async () => { break } case METHOD_NEW_MEDIA_OBJECT: { - const file = paramFile.value - const bits = await fileToBuffer(file) - const mediaObject = new MediaObject(file.name, file.type, bits) + const key = "metaweblog_Typecho" + + const typechoApiAdaptor = await Adaptors.getAdaptor(key) + + const imageUrl = "https://static-rs-terwer.oss-cn-beijing.aliyuncs.com/test/image-20230812091531-hibwr1g.png" + const imageName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1) + const imageBase64 = await remoteImageToBase64(imageUrl) + logger.debug("imageBase64=>", { imageBase64 }) + + const bits = base64ToBuffer(imageBase64) + logger.debug("bits=>", bits) + + const mediaObject = new MediaObject(imageName, "image/png", bits) logger.info("mediaObject=>", mediaObject) - // 设置文件的元数据 - const metadata = { - name: mediaObject.name, - type: mediaObject.type, - bits: mediaObject.bits, - overwrite: true, - } - const xmlrpcApiUrl = "http://127.0.0.1:3000/xmlrpc.php" - const client = new SimpleXmlRpcClient(xmlrpcApiUrl, "", {}) - const result = await client.methodCall("metaWeblog.newMediaObject", ["", "terwer", "123456", metadata]) + const typechoApi = Utils.blogApi(appInstance, typechoApiAdaptor) + logger.info("typechoApi=>", typechoApi) + const result = await typechoApi.newMediaObject(mediaObject) logMessage.value = JSON.stringify(result) logger.info("typecho new mediaObject result=>", result) + + // const key = "metaweblog_Typecho" + // + // const file = paramFile.value + // const bits = await fileToBuffer(file) + // const mediaObject = new MediaObject(file.name, file.type, bits) + // logger.info("mediaObject=>", mediaObject) + // + // // 设置文件的元数据 + // const metadata = { + // name: mediaObject.name, + // type: mediaObject.type, + // bits: mediaObject.bits, + // overwrite: true, + // } + // const typechoApiAdaptor = await Adaptors.getAdaptor(key) + // const typechoApi = Utils.blogApi(appInstance, typechoApiAdaptor) + // const result = await typechoApi.newMediaObject(metadata) + // logMessage.value = JSON.stringify(result) + // logger.info("typecho new mediaObject result=>", result) + + // const file = paramFile.value + // const bits = await fileToBuffer(file) + // const mediaObject = new MediaObject(file.name, file.type, bits) + // logger.info("mediaObject=>", mediaObject) + // + // // 设置文件的元数据 + // const metadata = { + // name: mediaObject.name, + // type: mediaObject.type, + // bits: mediaObject.bits, + // overwrite: true, + // } + // const xmlrpcApiUrl = "http://127.0.0.1:3000/xmlrpc.php" + // const client = new SimpleXmlRpcClient(xmlrpcApiUrl, "", {}) + // const result = await client.methodCall("metaWeblog.newMediaObject", ["", "terwer", "123456", metadata]) + // logMessage.value = JSON.stringify(result) + // logger.info("typecho new mediaObject result=>", result) break } default: diff --git a/src/components/test/WordpressTest.vue b/src/components/test/WordpressTest.vue index adb1fd23..f7221cbd 100644 --- a/src/components/test/WordpressTest.vue +++ b/src/components/test/WordpressTest.vue @@ -232,6 +232,8 @@ const wordpressHandleApi = async () => { break } case METHOD_NEW_MEDIA_OBJECT: { + const key = "wordpress_Wordpress" + const file = paramFile.value const bits = await fileToBuffer(file) const mediaObject = new MediaObject(file.name, file.type, bits) @@ -244,11 +246,31 @@ const wordpressHandleApi = async () => { bits: mediaObject.bits, overwrite: true, } - const xmlrpcApiUrl = "http://127.0.0.1:3000/xmlrpc.php" - const client = new SimpleXmlRpcClient(xmlrpcApiUrl, "", {}) - const result = await client.methodCall("metaWeblog.newMediaObject", ["", "terwer", "123456", metadata]) + const wordpressApiAdaptor = await Adaptors.getAdaptor(key) + const wordpressApi = Utils.blogApi(appInstance, wordpressApiAdaptor) + const result = await wordpressApi.newMediaObject(metadata) logMessage.value = JSON.stringify(result) logger.info("wordpress new mediaObject result=>", result) + + // const key = "wordpress_Wordpress" + // + // const file = paramFile.value + // const bits = await fileToBuffer(file) + // const mediaObject = new MediaObject(file.name, file.type, bits) + // logger.info("mediaObject=>", mediaObject) + // + // // 设置文件的元数据 + // const metadata = { + // name: mediaObject.name, + // type: mediaObject.type, + // bits: mediaObject.bits, + // overwrite: true, + // } + // const cfg = await Adaptors.getCfg(key) + // const client = new SimpleXmlRpcClient(appInstance, cfg.apiUrl, {}) + // const result = await client.methodCall("metaWeblog.newMediaObject", ["", cfg.username, cfg.password, metadata]) + // logMessage.value = JSON.stringify(result) + // logger.info("wordpress new mediaObject result=>", result) break } default: diff --git a/src/composables/useProxy.ts b/src/composables/useProxy.ts index 9a727c24..a6c84dcd 100644 --- a/src/composables/useProxy.ts +++ b/src/composables/useProxy.ts @@ -139,21 +139,7 @@ const useProxy = (middlewareUrl?: string) => { return resJson } - /** - * 使用代理请求获取 Blob 数据 - * - * @param url - 请求的 URL - * @returns 返回请求的 Blob 数据 - */ - const proxyBlob = async (url: string): Promise => { - const contentType = "image/png" - const response = await proxyFetch(url, [], {}, "GET", contentType) - const ab = await response.arrayBuffer() - logger.debug("arrayBuffer =>", ab) - return new Blob([ab], { type: contentType }) - } - - return { proxyFetch, proxyXmlrpc, proxyBlob } + return { proxyFetch, proxyXmlrpc } } export { useProxy } diff --git a/src/pages/ApiTest.vue b/src/pages/ApiTest.vue index 7ecc58fd..b5d0fd32 100644 --- a/src/pages/ApiTest.vue +++ b/src/pages/ApiTest.vue @@ -24,20 +24,31 @@ -->