Замена ссылок goo.gl

goo.gl закрывается (см. Google URL Shortener links will no longer be available [updated] - Google Developers Blog). Поэтому ссылки на вашем форуме, содержащие goo.gl, перестанут работать после 25 августа 2025 года.

Я разработал этот скрипт для клиента. Это заняло намного, намного больше времени, чем я ему выставил в счете, и больше, чем я готов признать.

Скрипт находит все сообщения, содержащие goo.gl, и (если это не maps.app.goo.gl или maps.goo.gl) пытается заменить их на URL, который возвращает goo.gl. Он использует пост-редактор, поэтому вы увидите, что сообщение было обновлено, и поймёте причину; при желании вы сможете отменить изменения. Я постарался сделать его максимально надёжным, но используйте на свой страх и риск.

Если вы не знаете, как запустить этот скрипт, вероятно, вам не стоит делать это самостоятельно. Если вам нужна помощь в его настройке и у вас есть бюджет, свяжитесь со мной или задайте вопрос в канале 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{(?<=^|[\[\]\(\)\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 "ИСПРАВЛЕНИЕ!!: #{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 "Найдено #{total_posts} сообщений для проверки"
  count = 0
  goo_go.find_each do |post|
    count += 1
    # puts "Обработка #{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: "Исправление ссылок goo.gl",
        bypass_bump: true
      }
      begin
        puts "Редактирование (#{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 "Не удалось отредактировать (номер: #{count} #{Discourse.base_url}/t/#{post.topic_id}/#{post.post_number}): #{e}"
      end
      sleep 15
    end
  end
end
8 лайков

Почему их исключают? Эти ссылки не сломаются?

И спасибо за этот скрипт. Я нашёл на своих форумах посты, содержащие эти сокращённые ссылки, и их нужно будет исправить. :+1:

1 лайк

Вот что генерирует Google Maps сегодня: https://maps.app.goo.gl/Qz14oUZQv9aHCCfg6. Я решил предположить, что они решили оставить эти домены. :person_shrugging:

2 лайка

Я также вижу https://goo.gl/maps и https://goo.gl/photos/, и ожидаю, что они тоже не будут затронуты.

2 лайка

Не знаю. Если они теперь работают без предупреждения, то, думаю, вы правы.

Я почти уверен, что скрипт пытается их заменить.

3 лайка

На странице, на которую есть ссылка в первом посте, сказано:

Обратите внимание, что ссылки goo.gl, сгенерированные через приложения Google (например, при обмене картами), продолжат работать.

следовательно, скорее всего, да, они продолжат работать. Особенно если не появляются промежуточные страницы.

Есть ли у вас конкретные примеры, которые можно опубликовать? Возможно, https://goo.gl/maps/ID можно заменить на https://maps.app.goo.gl/ID, хотя обратная замена не работает.

В любом случае, вероятно, нет никакого вреда в их замене?

2 лайка

Трудно сказать. Наверное?

Я стараюсь не тратить ещё 5 часов на работу, рассчитанную на 2 часа, но вот несколько примеров:

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 с некоторыми тестами, но я уже потратил на эту работу как минимум в три раза больше времени, чем было оплачено.

Я просто хотел узнать, эквивалентны ли эти ссылки:

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

но это не так.

Все указывает на то, что первая ссылка продолжит работать в любом случае :+1:

3 лайка

Вот один:
https://goo.gl/photos/NBtTJoYjhrMqRdso9
Быстрое тестирование показывает, что Google больше не создаёт короткие ссылки такого типа, используя вместо этого поддомены.

1 лайк

Так что, скорее всего, не стоит беспокоиться, что скрипт раскрывает их.

1 лайк

Я увидел параметр bypass_bump: true и подумал, что это предотвратит заполнение моего раздела «Последние» сотнями правок. Однако он всё же заполняет раздел «Последние». Я готов платить эту цену ради борьбы с угасанием ссылок, но решил предупредить следующего пользователя.

Оказывается, функция «Сбросить дату поднятия» удаляет их из раздела «Последние».

2 лайка