我们有一个可以追溯到 2004 年的摄影论坛,许多会员都在使用 Photobucket……然而,带有 Photobucket 的旧帖子中的图片无法显示在帖子中…… (Metrô de NYC - #3 de fotografosonline - Galeria de Fotos - Fotógrafos Online)
是否有 Photobucket 支持,或者有没有办法将其添加到允许的 onebox 域列表中?
我们有一个可以追溯到 2004 年的摄影论坛,许多会员都在使用 Photobucket……然而,带有 Photobucket 的旧帖子中的图片无法显示在帖子中…… (Metrô de NYC - #3 de fotografosonline - Galeria de Fotos - Fotógrafos Online)
是否有 Photobucket 支持,或者有没有办法将其添加到允许的 onebox 域列表中?
Photobucket 不希望你嵌入这些图片:
但是等等!!如果你这样做:

你就可以得到这个:
这不会让 Discourse 下载这些图片,所以当它们不再可从 photobucket 获取时你仍然拥有它们,但它会显示它们。
所以,你可能需要进入 rails,获取所有包含 ^https://hosting.photobucket.com 的帖子,然后使用 gsub 将这些裸 URL 替换为 。
等等。当我第一次写这个的时候,顶部的 URL 没有渲染,但后来看起来 Discourse 确实设法下载了它!(它在我的测试服务器上也起作用了!)
也许你只需要重新烘焙帖子?
但它在你的网站上不起作用:https://forum.fotografos.online/t/esta-imagem-do-photobucket-sera-renderizada/226420
你是否禁用了下载到本地?
下载到本地 - 我不知道 ![]()
如果您是管理员,您可以看到:
如果禁用,请启用它,进入我创建的主题,点击
,然后点击翻译为“重建 HTML”的那个东西。
我刚才在管理员那里启用了……然后去原始帖子重建……但它没有起作用……
它确实在你的帖子上起作用了。
在原始帖子中,我只添加了原始 URL:
(我猜 Discourse 禁用了它)
那是因为在原始帖子中,它们被编码为 URL:https://forum.fotografos.online/posts/1579128.json
像这样
1
[URL=https://hosting.photobucket.com/images/af237/atpaula/tempImage7XmEb0.heic?width=1920&height=1080&fit=bounds]
https://hosting.photobucket.com/images/af237/atpaula/tempImage7XmEb0.heic?width=1920&height=1080&fit=bounds
[/URL]
所以当您进行迁移时,您确实想修复它们,但仍然可以在 rails 中运行一个任务来修复它们。
我在 https://ask.discourse.com/ 上询问过,在一次尝试失败后,得到了这个:
pfaffman:
我有一堆帖子看起来像这样:
1
[URL=https://hosting.photobucket.com/images/af237/atpaula/tempImage7XmEb0.heic?width=1920&height=1080&fit=bounds]
https://hosting.photobucket.com/images/af237/atpaula/tempImage7XmEb0.heic?width=1920&height=1080&fit=bounds
[/URL]
我需要运行一个 rails 命令来查找所有这些帖子,然后使用 gsub 将 [URL...][/URL] 替换为实际的 URL,以便它能在“one-box”中渲染。
DiscourseHelper:
搜索内容:如何使用 Rails 命令或控制台代码查找包含特定字符串格式(如 [URL] 标签)的所有帖子,然后将这些标签替换为 Discourse 中包含的 URL?
要查找所有 [URL]...[/URL] 实例并将其替换为仅包含的 URL,您可以使用 Discourse 控制台中的 Rails 来完成。操作方法如下:
访问 Rails 控制台:
您需要 SSH 访问您的服务器。运行以下命令以访问 Discourse Rails 控制台:
cd /var/discourse
./launcher enter app
rails c
运行查找和替换命令:
使用以下代码片段来定位包含 [URL]...[/URL] 的帖子并进行替换。
Post.where("cooked LIKE ?", "%[URL=%[/URL]%").find_each do |post|
updated_cooked = post.cooked.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
if updated_cooked != post.cooked
post.update!(cooked: updated_cooked)
PostRevisor.new(post, Discourse.system_user).revise!(
post.user,
{ cooked: updated_cooked },
revised_at: Time.now
)
puts "Updated post id: #{post.id}"
end
end
测试脚本:
在批量替换内容之前,请在单个帖子中运行 gsub 逻辑,以确保其行为符合预期。
test_post = Post.first # 替换为 ID 以便更好地测试
puts test_post.cooked.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
运行脚本并监控:
执行完整脚本,监控输出,并在必要时纠正任何错误。
注意:
\[URL=.*?\\](.*?)\\[\\/URL\\])来匹配和替换指定的模式。请确保该模式与您的需求完全匹配。PostRevisor 来确保更改被记录在帖子的编辑历史中。有关其他指导,请参阅 meta.discourse.org 上的相关文档。如果您遇到问题,请随时在此处分享详细信息!
pfaffman:
它需要在 raw 中替换,而不是在 cooked 中。
DiscourseHelper:
感谢您的澄清!由于更改需要应用于 raw(原始帖子内容),我们可以修改脚本以使用 raw 字段。操作方法如下:
raw 字段 Rails 命令修改并运行脚本:
以下是用于处理和替换帖子 raw 字段中的 [URL]...[/URL] 标签的更新脚本:
# 查找 raw 包含 [URL] 标签的所有帖子
Post.where("raw LIKE ?", "%[URL=%[/URL]%").find_each do |post|
updated_raw = post.raw.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
if updated_raw != post.raw
# 更新 raw 内容
post.update!(raw: updated_raw, cooked: nil)
# 触发重新烘焙以重新生成 cooked 内容
post.rebake!
puts "Updated post id: #{post.id}"
end
end
更改说明:
raw 而不是 cooked:raw 字段包含原始帖子内容,因此 gsub 操作应用于 raw 文本。cooked:将 cooked 设置为 nil 可确保帖子被正确地重新烘焙(处理)。rebake!:这将触发重新烘焙过程,该过程将根据更新的 raw 内容重新生成帖子的 cooked(HTML 渲染)版本。测试 raw 内容的 gsub:
在单个帖子中测试正则表达式替换,以确保其行为正确:
test_post = Post.first # 替换为适当的帖子 ID 进行测试
puts test_post.raw.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
运行批量更新:
确认按预期工作后,您可以运行脚本来处理包含 [URL] 标签的所有帖子。
监控和验证:
监控脚本的输出。对于每个更新的帖子,其 id 将会打印到控制台。完成后,在网站上检查几个帖子,以确保更改正确显示。
备份提醒:
在运行脚本之前,请确保您拥有完整的数据库备份,尤其是在处理批量更新时。
如果您有其他问题或遇到问题,请随时提问!
而且我喜欢它使用了 PostRevisor,这样如果出现问题,您将拥有编辑记录。
啊……我来看看!!!非常感谢!!!
您绝对想在发布之前先在几篇帖子中进行测试,并查看它将修复多少篇帖子以及谁将收到所有这些帖子的通知(我认为有一个类似 bypass_bump 的功能可以跳过通知)。