替换 goo.gl 链接

goo.gl 即将关闭(请参阅 https://developers.googleblog.com/en/google-url-shortener-links-will-no-longer-be-available/)。因此,您论坛上包含 goo.gl 链接的帖子将在 2025 年 8 月 25 日之后失效。

我为一位客户开发了这个脚本。它花费的时间远远超过了我向他收取的费用,也远远超过了我愿意承认的时间。

它会查找所有包含 goo.gl 的帖子,然后(如果它们不是 maps.app.goo.glmaps.goo.gl)尝试将它们替换为 goo.gl 返回的 URL。它使用帖子修订器,因此您可以查看更新内容和原因,并且可以根据需要进行还原。我已经尽力使其万无一失,但请自行承担风险。

如果您不知道如何运行此脚本,则可能不应自行操作。如果您需要帮助使其正常工作并且有预算,请联系我或在 Marketplace 中提问。

如果您使用它并对如何改进它有什么建议,请回复并/或根据需要进行编辑。

URL_CACHE ||= {}

def resolve_url_simple(short_url)
  uri = URI.parse(short_url)
  response = Net::HTTP.get_response(uri)
  if response.is_a?(Net::HTTPRedirection)
    response['location']
  else
    short_url # 如果没有重定向,则返回原始 URL
  end
rescue
  short_url # 如果发生错误,则返回原始 URL
end

def resolve_url(short_url)
  short_url.gsub!(/http:/,"https:")
  # 检查 URL 是否已在缓存中
  return URL_CACHE[short_url] if URL_CACHE.key?(short_url)

  begin
    uri = URI.parse(short_url + "?si=1")
    response = Net::HTTP.get_response(uri)

    # 如果是重定向,则解析 URL
    resolved_url = if response.is_a?(Net::HTTPRedirection)
                     response['location']
                   else
                     short_url # 如果没有重定向,则返回原始 URL
                   end
    sleep 1
    # 将解析后的 URL 存储在缓存中
    URL_CACHE[short_url] = resolved_url

    resolved_url
  rescue
    # 发生错误时,将原始 URL 存储在缓存中
    URL_CACHE[short_url] = short_url
    short_url
  end
end

def replace_goo_gl_links(text)
  goo_gl_regex = %r{(?<=\A|[\\[\\]\\(\\)\\s])(https?://)?goo\\.gl(/[a-zA-Z0-9]+)+}
  text.gsub(goo_gl_regex) do |match|
    if match.include?('maps.app.goo.gl')
      match
    else
      full_url = match.start_with?('http') ? match : "https://#{match}"
      print "FIXING!!: #{match} -----> "
      fixed = resolve_url(full_url)
      puts fixed
      fixed
    end
  end
end

def replace_all_goo_gl_links
  system_user= User.find(-1)
  goo_go = Post.where("raw LIKE '%goo.gl%'")
  total_posts = goo_go.count
  puts "Found #{total_posts} posts to check"
  count = 0
  goo_go.find_each do |post|
    count += 1
    # puts "Processing #{count}. #{Discourse.base_url}/t/#{post.topic_id}/#{post.post_number}"
    print "."
    # 出于不明原因,尝试更新这些主题中的帖子会导致 rails 崩溃
    # next if [145478,64885,84408].include? post.topic_id
    # 查找 goo.gl 链接并查看它重定向到哪里
    new_raw = replace_goo_gl_links(post.raw)
    if new_raw != post.raw
      revision_options = {
        edit_reason: "Fix goo.gl links",
        bypass_bump: true
      }
      begin
        puts "Revising (#{count}/#{total_posts}) #{Discourse.base_url}/t/#{post.topic_id}/#{post.post_number}"
        if !post.topic # 已删除主题中的帖子没有主题,会导致 PostRevisor 崩溃
           post.topic = Topic.with_deleted.find_by(id: post.topic_id)
           next if !post.topic
        end
        PostRevisor.new(post).revise!(system_user, raw: new_raw, **revision_options)
      rescue => e
        puts "cannot revise (number: #{count} #{Discourse.base_url}/t/#{post.topic_id}/#{post.post_number}): #{e}"
      end
      sleep 15
    end
  end
end

8 个赞

为什么要排除这些?这些链接不会失效吗?

感谢你的脚本。我会在论坛上查找包含这些短链接的帖子,有很多需要修复。 :+1:

1 个赞

这是谷歌地图今天生成的链接:https://maps.app.goo.gl/Qz14oUZQv9aHCCfg6。我决定猜测那些是他们决定保留的域名。 :person_shrugging:

2 个赞

我还看到 https://goo.gl/mapshttps://goo.gl/photos/,预计它们也不会受到影响。

2 个赞

我不知道。如果它们现在可以正常工作而没有警告,那么我认为你是对的。

我很确定脚本会尝试替换它们。

3 个赞

OP 中链接的页面说:

请注意,通过 Google 应用(例如地图分享)生成的 goo.gl 链接将继续正常运行。

所以,假设是的,它们将继续工作。特别是如果没有出现任何中间页面。

您有特定的链接可以发布吗?也许 https://goo.gl/maps/ID 可以替换为 https://maps.app.goo.gl/ID,尽管反过来则不行。

无论如何,替换它们可能也没有坏处?

2 个赞

很难说。可能?

我尽量不在这项本应 2 小时完成的工作上再花 5 小时了,但这里有几个例子

https://goo.gl/maps/bFFQr8eL4F62

https://goo.gl/maps/BPCy1us5GkJQ2zMX8 变成

https://www.google.com/maps/place/SUZUKI%E9%91%AB%E6%BD%A4%E8%BB%8A%E6%A5%AD-%E9%B4%BB%E5%AF%B6%E5%8F%B0%E5%8C%97%E6%97%97%E8%89%A6%E5%BA%97/@25.0488943,121.5803302,16.17z/data=!4m5!3m4!1s0x3442ab9666e0cf09:0x7be03675872f9c63!8m2!3d25.051748!4d121.5809526?shorturl=1

所以,将 if match.include?('maps.app.goo.gl') 修改为类似 if match.include?('maps.app.goo.gl') || match.include?('goo.gl/maps') 可能是安全的

也许还可以添加图片链接。

我还了解到,您还需要重新烘焙(rebake)那些包含已替换 URL 的帖子。

我认为一个带有某些规范的适当的 rake 任务可能是必要的,但我在这项工作上已经花费的时间是计费时间的 3 倍以上了。

我只是想知道它们是否等效:

https://goo.gl/maps/bFFQr8eL4F62
https://maps.app.goo.gl/bFFQr8eL4F62

但事实并非如此。

一切迹象表明,前者无论如何都会继续工作 :+1:

3 个赞

这是其中一个
https://goo.gl/photos/NBtTJoYjhrMqRdso9
快速测试表明,谷歌不再创建这样的短链接,而是使用子域。

1 个赞

所以脚本取消短链接可能不是坏事。

1 个赞

我看到了 bypass_bump: true 并运行了它,以为它不会用数百次编辑填满我的“最新”视图。但它确实填满了“最新”视图。我很乐意支付这笔费用来对抗链接失效,但我想给下一个人提个醒。

事实证明,“重置Bump日期”会将它们移出“最新”视图。

2 个赞