Convertendo URLs curtas de upload em URLs completas

Posso estar batendo na porta errada aqui, então peço desculpas se estiver, mas qualquer orientação é muito bem-vinda!

Existem alguns tópicos em nosso site Discourse que são exibidos parcialmente em nosso site principal. Como a versão renderizada de uma postagem contém todo o HTML para o lightbox, o que não queremos no site principal, estou trabalhando com a versão bruta de uma postagem.

Uma coisa que está me atrapalhando são as URLs de upload de arquivos. Como posso converter uma URL upload:// em uma URL completa? Tentei pesquisar e encontrei SHA1 e Base62, mas, além disso, não importa o que eu tente, não consigo obter a URL completa.

Como disse, posso estar olhando para a coisa errada, ou provavelmente há uma maneira mais fácil de fazer essas coisas, então qualquer conselho é bem-vindo!

Obrigado antecipadamente

Primeiro, decodifique base62 usando o conjunto de caracteres invertido e, em seguida, codifique o resultado em hexadecimal.

No código Python, isso fica assim:

rebase = hex(base62.decode(base, base62.CHARSET_INVERTED))[2:].zfill(40)

Obrigado pela rápida resposta, @michaeld. Vou tentar mais tarde hoje :slight_smile:


Para quem estiver interessado e for fazer isso em PHP, usei uma biblioteca do Composer chamada base62 by tuupola.

Este é o código que usei:

<?php

$base62 = new Tuupola\Base62(["characters" => Tuupola\Base62::INVERTED]);

/** Defina o nome original do arquivo, excluindo qualquer extensão */
$s = "r3AYqESanERjladb4vBB7VsMBm6";

/** Decodifique e converta para hexadecimal */
$decoded = $base62->decode($s);

/** Resultado esperado: bda2c513e1da04f7b4e99230851ea2aafeb8cc4e */
echo bin2hex($decoded);

Interessante. Não consigo reproduzir isso com Javascript. Porque seu último método é uma conversão binária para hexadecimal, mas o resultado da decodificação base62 não é uma representação binária, pelo que entendi.

Do ponto de vista do JS, achei o seguinte útil:
https://www.npmjs.com/package/aybabtu

function fromBase62(s) {
  var digits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  var result = 0;
  for (var i = 0; i < s.length; i++) {
    var p = digits.indexOf(s[i]);
    if (p < 0) {
      return NaN;
    }
    result += p * Math.pow(digits.length, s.length - i - 1);
  }
  return result;
}

Infelizmente, nem os métodos bin2hex nem dec2hex ajudam quando uso suas strings de entrada.

Criei um codesandbox para esse problema, caso alguém esteja interessado em brincar com ele. O valor final é 1 para minha string de entrada, o que está errado ;(

Obrigado

Você deve ser capaz de usar binVal.toString(16) para obter o valor hexadecimal.
No entanto, acho(!) que o resultado intermediário é muito grande para caber em um inteiro normal.

Obrigado pela dica, Richard, mas não estou avançando nem com essa ideia.

Não sei se não seria um bom recurso ter uma configuração do tipo “Habilitar links de upload absolutos em visualizações brutas (rotas)”. Eu usaria isso totalmente no nosso caso - porque, pelo que entendi, o encurtamento de URL de upload é realmente apenas uma otimização do Discourse para reduzir o código, certo? Não está relacionado ao Markdown.

Alguém da equipe do discourse pode fornecer um método JS que restaure o URL absoluto?
Isso seria útil para a comunidade, pensem.

Eu não consigo fazer isso ;(

@RGJ você conhece alguém da equipe do Discourse que possa fornecer essa função auxiliar?

Não…
Sugiro que você poste isso em Marketplace.

Você poderia falar mais sobre seu caso de uso. Talvez esta não seja a melhor solução.

Você pode converter de base62 para hex, mas nunca será capaz de reconstruir totalmente a URL de upload sem algum tipo de interface para o banco de dados do Discourse. O caminho completo para um upload depende do id do upload, que não pode ser determinado a partir da URL curta.

Como o @pfaffman disse, podemos ajudar mais se você descrever seu caso de uso.