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로 대체하려고 시도합니다. 게시물 재수정자(post revisor)를 사용하므로 업데이트된 사실과 그 이유를 확인할 수 있으며, 원하면 되돌릴 수도 있습니다. 최대한 안전하도록 만들었지만, 사용은 본인의 책임입니다.

이 스크립트를 실행하는 방법을 모른다면, 직접 실행하지 않는 것이 좋습니다. 작동하도록 도와줄 사람이 필요하고 예산이 있다면 저에게 연락하거나 #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 # 리디렉션이 없으면 원래 값을 반환
  end
rescue
  short_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 # 리디렉션이 없으면 원래 값을 반환
                   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{(?<=^|[\[\]\(\)\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 링크와 해당 URL이 어디로 리디렉션되는지 확인
    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 링크는 계속 작동합니다.

따라서 아마도 계속 작동할 것입니다. 특히 중간 페이지(interstitial)가 표시되지 않는 경우 더욱 그러합니다.

공유할 수 있는 구체적인 링크가 있나요? 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로 처리한 게시물을 다시 재처리(rebake)해야 한다는 것도 방금 알게 되었습니다.

적절한 rake task와 몇 가지 스펙이 필요할 것 같지만, 이미 이 작업에 청구한 시간의 최소 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개의 좋아요