goo.glリンクの置き換えについて

goo.gl がシャットダウンします(Google URL Shortener links will no longer be available [updated] - Google Developers Blog を参照)。そのため、フォーラムにある goo.gl リンクを含むリンクは、2025年8月25日以降無効になります。

このスクリプトはクライアントのために開発しました。請求した金額よりもはるかに多くの時間と、認めたくないほどの時間を費やしました。

goo.gl を含むすべての投稿を見つけ、それらが maps.app.goo.gl または maps.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

今日Googleマップが生成しているのはこちらです:https://maps.app.goo.gl/Qz14oፐ14oUZQv9aHCCfg6。それらのドメインは保持することにしたと推測しました。 :person_shrugging:

「いいね!」 2

https://goo.gl/mapshttps://goo.gl/photos/ も表示されており、これらも影響を受けないと思われます。

「いいね!」 2

わかりません。もし警告なしで動作するなら、あなたの言う通りだと思います。

そのスクリプトはそれらを置き換えようとしていると確信しています。

「いいね!」 3

OPでリンクされているページには次のように書かれています。

Googleアプリ(地図の共有など)から生成されたgoo.glリンクは引き続き機能することに注意してください。

したがって、おそらく機能し続けるでしょう。特に、インターロキシャルが表示されない場合はなおさらです。

投稿できる具体的なリンクはありますか?おそらく https://goo.gl/maps/IDhttps://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')

そして、画像のものも追加する必要があるかもしれません。

また、置換されたURLをoneboxした投稿を再ベイクする必要があることも学びました。

仕様を備えた適切なrakeタスクが必要だと思いますが、この仕事には請求した時間の少なくとも3倍の時間を費やしました。

これらが同等かどうか疑問に思っていました。

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

しかし、そうではありませんでした。

すべてが、前者の方が引き続き機能することを示唆しています :+1:

「いいね!」 3

こちらがその一つです
https://goo.gl/photos/NBtTJoYjhrMqRdso9
簡単なテストをしたところ、Googleはサブドメインを使用するようになり、このような短いリンクを作成しなくなったようです。

「いいね!」 1

したがって、スクリプトがそれらを短縮解除しても問題ないでしょう。

「いいね!」 1

bypass_bump: true を見て、これで「最新」ビューが何百もの編集でいっぱいにならないだろうと思ったのですが、確実に「最新」ビューがいっぱいになっています。リンク切れと戦うためにその価格を支払うのは構いませんが、次の人のために注意喚起しておこうと思いました。

「Bump date をリセット」で「最新」ビューから外れることがわかりました。」

「いいね!」 2