gpt4 book ai didi

google-apps-script - 从 Gmail 原始内容解析 inlineImages

转载 作者:行者123 更新时间:2023-12-04 15:00:27 31 4
gpt4 key购买 nike

Gmail 邮件 getAttachments 函数未返回 inlineImages - 请参阅问题 2810 https://code.google.com/p/google-apps-script-issues/issues/detail?id=2810

我需要这样做,所以我编写了下面的代码来从消息原始内容中解析 blob 格式的内联图像,提前知道消息中的图像 cid。

但是,恐怕这种解析在我找到 base64 图像内容中的第一个和最后一个字符的方式中非常脆弱,不是吗?

有没有更好的方法来做到这一点?

问候, 福斯托

var rawc = message.getRawContent();
var b64c1 = rawc.lastIndexOf(cid) + cid.length + 3; // first character in image base64
var b64cn = rawc.substr(b64c1).indexOf("--") - 3; // last character in image base64
var imgb64 = rawc.substring(b64c1, b64c1 + b64cn + 1); // is this fragile or safe enough?
var imgblob = Utilities.newBlob(Utilities.base64Decode(imgb64), "image/jpeg", cid); // decode and blob

最佳答案

我已经多次遇到这个问题,我想我有一个非常通用的案例解决方案。获取非嵌入图像也是一个问题。

我不确定我的解析是否比你的更脆弱。最后,我把multipart的那部分吸出来了通过抓取以 '--' 开头的周围线条.其他一切只是确保我可以在下次需要时使用它而无需过多修改代码。我有一些电子邮件似乎没有遵循 \r\n并引起问题:需要注意的事情。
getInlineImages函数将获取消息的原始内容并返回一个对象数组。每个对象都有 img 标签的 src 和与图像一起使用的 blob。如果您只想要内嵌图像,您可以选择忽略不以“cid”开头的任何内容。
getBlobFromMessage函数将获取消息的原始内容和 img 标签的 src(包括“cid”)并返回关联的 blob。

您可以看到注释的代码 here .

function getInlineImages(rawContent) {
var url = /^https?:\/\//, cid = /^cid:/;
var imgtags = rawContent.match(/<img.*?>(.*?<\/img>)?/gi);
return imgtags ? imgtags.map(function(imgTag) {
var img = {src: Xml.parse(imgTag,true).html.body.img.src};
img.blob = url.test(img.src) ? UrlFetchApp.fetch(img.src).getBlob()
: cid.test(img.src) ? getBlobFromMessage(rawContent,img.src)
: null;
return img;
}) : [];
}

function getBlobFromMessage(rawContent,src) {
var cidIndex = src.search(/cid:/i);
if(cidIndex === -1) throw Utilities.formatString("Did not find cid: prefix for inline refenece: %s", src)

var itemId = src.substr(cidIndex + 4);
var contentIdIndex = rawContent.search("Content-ID:.*?" + itemId);
if(contentIdIndex === -1) throw Utilities.formatString("Item with ID %s not found.",src);

var previousBoundaryIndex = rawContent.lastIndexOf("\r\n--",contentIdIndex);
var nextBoundaryIndex = rawContent.indexOf("\r\n--",previousBoundaryIndex+1);
var part = rawContent.substring(previousBoundaryIndex,nextBoundaryIndex);

var contentTransferEncodingLine = part.match(/Content-Transfer-Encoding:.*?\r\n/i)[0];
var encoding = contentTransferEncodingLine.split(":")[1].trim();
if(encoding != "base64") throw Utilities.formatString("Unhandled encoding type: %s",encoding);

var contentTypeLine = part.match(/Content-Type:.*?\r\n/i)[0];
var contentType = contentTypeLine.split(":")[1].split(";")[0].trim();

var startOfBlob = part.indexOf("\r\n\r\n");
var blobText = part.substring(startOfBlob).replace("\r\n","");
return Utilities.newBlob(Utilities.base64Decode(blobText),contentType,itemId);
}

关于google-apps-script - 从 Gmail 原始内容解析 inlineImages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16797746/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com