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