Links are almost always base64 encoded now and the online url decoders always produce garbage. I was wondering if there is a project out there that would allow me to self-host this type of tool?

I’d probably network this container through gluetun because, yanno, privacy.

Edit to add: Doesn’t have to be specifically base64 focused. Any link decoder that I can use in a privacy respecting way, would be welcome.

Edit 2: See if your solution will decode this link (the one in the image): https://link.sfchronicle.com/external/41488169.38548/aHR0cHM6Ly93d3cuaG90ZG9nYmlsbHMuY29tL2hhbWJ1cmdlci1tb2xkcy9idXJnZXItZG9nLW1vbGQ_c2lkPTY4MTNkMTljYzM0ZWJjZTE4NDA1ZGVjYSZzcz1QJnN0X3JpZD1udWxsJnV0bV9zb3VyY2U9bmV3c2xldHRlciZ1dG1fbWVkaXVtPWVtYWlsJnV0bV90ZXJtPWJyaWVmaW5nJnV0bV9jYW1wYWlnbj1zZmNfYml0ZWN1cmlvdXM/6813d19cc34ebce18405decaB7ef84e41 (it should decode to this page: https://www.hotdogbills.com/hamburger-molds)

  • liliumstar@lemmy.dbzer0.com
    link
    fedilink
    English
    arrow-up
    4
    ·
    edit-2
    4 hours ago

    I wrote this little webapp thing some time ago. It’s not exactly what you asked for but is a good example.

    All it does is base64 encode a link and adds the server url in front of it. When someone visits that link it will redirect them to the destination. The intent is to bypass simple link tracking / blocking in discord and other platforms.

    There are also checks for known bad domains and an attempt to remove known tracking query parameters.

    https://git.tsps-express.xyz/liliumstar/redir

    Edit: I forgot to add it also blocks known crawlers (at least at time of writing) so that they can’t just follow the 302 and figure out where it goes.

  • irotsoma@lemmy.blahaj.zone
    link
    fedilink
    English
    arrow-up
    8
    ·
    6 hours ago

    Don’t include the non-encoded part of the data or it will corrupt the decryption. The decoder can’t tell the difference between data that’s not encoded and data that is encoded since it’s all text.

  • masterofn001@lemmy.ca
    link
    fedilink
    English
    arrow-up
    4
    ·
    5 hours ago

    I have nothing to add except the appreciation for everyone who helped and amazement at the vastly differing ways people produced working results.

  • FreedomAdvocate
    link
    fedilink
    English
    arrow-up
    15
    arrow-down
    1
    ·
    edit-2
    7 hours ago

    That url isn’t base64 encoded. You can tell by the fact that it’s still a URL, and doesn’t decode……

    • ReedReads@lemmy.zipOP
      link
      fedilink
      English
      arrow-up
      8
      arrow-down
      4
      ·
      10 hours ago

      base64 -d

      Right but the / in the url trips it up and I’d like to just copy/paste the full url and have it spit out the proper, decoded link.

      • ExFed@programming.dev
        link
        fedilink
        English
        arrow-up
        21
        ·
        edit-2
        9 hours ago

        The / character isn’t a part of the base64 encoding. In fact, only one part of the URL looks like base64. No plain base64 tool (whether via CLI, self-hosted, or otherwise) will be able to decode an entire URL like that. You’ll first need to parse the URL to isolate the base64 part. This is literally solved with a single line of bash:

        echo "https://link.sfchronicle.com/external/41488169.38548/aHR0cHM6Ly93d3cuaG90ZG9nYmlsbHMuY29tL2hhbWJ1cmdlci1tb2xkcy9idXJnZXItZG9nLW1vbGQ_c2lkPTY4MTNkMTljYzM0ZWJjZTE4NDA1ZGVjYSZzcz1QJnN0X3JpZD1udWxsJnV0bV9zb3VyY2U9bmV3c2xldHRlciZ1dG1fbWVkaXVtPWVtYWlsJnV0bV90ZXJtPWJyaWVmaW5nJnV0bV9jYW1wYWlnbj1zZmNfYml0ZWN1cmlvdXM/6813d19cc34ebce18405decaB7ef84e41" | cut -d/ -f6 | base64 -d
        

        See TIO for example.

        edit: add TIO link

        • ReedReads@lemmy.zipOP
          link
          fedilink
          English
          arrow-up
          8
          ·
          9 hours ago
          1. Thank you for this
          2. You know more than I do re: bash. Where can I learn what | cut -d/ -f6 | means? I assume the cut is the parsing? But maybe that is wrong? Would love to learn how to learn this.
          • ccryx [he/him]@discuss.tchncs.de
            link
            fedilink
            English
            arrow-up
            1
            ·
            edit-2
            4 hours ago

            You can use man <command> (in this case man cut) to read a program’s manual page. Appending --help (without any other arguments will often produce at least a short description of the program and list the available options.

          • Lucy :3@feddit.org
            link
            fedilink
            English
            arrow-up
            4
            ·
            6 hours ago

            cut --help and man cut can teach you more than anyone here.

            But: “|” takes the output of the former command, and uses it as input for the latter. So it’s like copying the output of “echo […]”, executing “cut -d ‘/’ -f 6”, and pasting it into that. Then copy the output of “cut”, execute “base64 -d” and paste it there. Except the pipe (“|”) automates that on one line.

            And yes, cut takes a string (so a list of characters, for example the url), split’s it at what -d specifies (eg. cut -d ‘/’ splits at “/”), so it now internally has a list of strings, “https:”, “”, “link.sfchronicle.com”, “external”, 41488169.38548", “aHR0cHM6Ly93d3cuaG90ZG9nYmlsbHMuY29tL2hhbWJ1cmdlci1tb2xkcy9idXJnZXItZG9nLW1vbGQ_c2lkPTY4MTNkMTljYzM0ZWJjZTE4NDA1ZGVjYSZzcz1QJnN0X3JpZD1udWxsJnV0bV9zb3VyY2U9bmV3c2xldHRlciZ1dG1fbWVkaXVtPWVtYWlsJnV0bV90ZXJtPWJyaWVmaW5nJnV0bV9jYW1wYWlnbj1zZmNfYml0ZWN1cmlvdXM” and “6813d19cc34ebce18405decaB7ef84e41”, and from that list outputs whatever is specified by -f (so eg. -f 6 means the 6th of those strings. And -f 2-3 means the 2nd to 3rd string. And -5 means everything up to and including the fifth, and 3- means everything after and including the third).

            But all of that is explained better in the manpage (man cut). And the best way to learn is to just fuck around. So echo "t es t str i n g, 1" | cut ... and try various arguments.

          • feedorimid@lemmynsfw.com
            link
            fedilink
            English
            arrow-up
            5
            ·
            edit-2
            9 hours ago

            Cut into fields based on the delimiter (// in this case). The “-f6” selects which field you want.

      • hendrik@palaver.p3x.de
        link
        fedilink
        English
        arrow-up
        6
        arrow-down
        1
        ·
        edit-2
        9 hours ago

        Well, the URL is a bit weird.

        echo "aHR0cHM6Ly93d3cuaG90ZG9nYmlsbHMuY29tL2hhbWJ1cmdlci1tb2xkcy9idXJnZXItZG9nLW1vbGQ" | base64 -d

        gives me “https://www.hotdogbills.com/hamburger-molds/burger-dog-mold”. (Without the ‘s’.) And then there are about 176 characters left. I suppose the underscore is some delimiter. The rest is:

        echo "c2lkPTY4MTNkMTljYzM0ZWJjZTE4NDA1ZGVjYSZzcz1QJnN0X3JpZD1udWxsJnV0bV9zb3VyY2U9bmV3c2xldHRlciZ1dG1fbWVkaXVtPWVtYWlsJnV0bV90ZXJtPWJyaWVmaW5nJnV0bV9jYW1wYWlnbj1zZmNfYml0ZWN1cmlvdXM" | base64 -d

        “sid=6813d19cc34ebce18405deca&ss=P&st_rid=null&utm_source=newsletter&utm_medium=email&utm_term=briefing&utm_campaign=sfc_bitecurious”

        And I suppose the stuff after the last slash is there for some other reason, tracking or some hash or whatever. But the things before that are the URL and the parameters.

        But the question remains whether we have some kind of tool to do this automatically and make it a bit easier…

        • ReedReads@lemmy.zipOP
          link
          fedilink
          English
          arrow-up
          3
          ·
          9 hours ago

          I really appreciate all of the time and effort you spent on this url. You’re right, the url is weird, which is why I thought it was a good example.

          But the question remains whether we have some kind of tool to do this automatically and make it a bit easier…

          But you nailed it with this last sentence. Especially when one is on mobile.

          Thanks for replying again.

          • hendrik@palaver.p3x.de
            link
            fedilink
            English
            arrow-up
            2
            ·
            edit-2
            8 hours ago

            I know. Guess I mainly wanted to say your given solution isn’t the entire story and the potential tool should decode the parameters as well, they might or might not be important. I’m often at the computer and I regularly do one-off tasks this way… But I’m aware it might not be an one-off task to you and you might not have a Linux terminal open 24/7 either 😉 Hope some of the other people have what you need. And btw… since I clicked on a few of the suggestions: I think the thing called URL encoding is a something different, that’s with all the percent signs and not base64 like here.

      • Snot Flickerman@lemmy.blahaj.zone
        link
        fedilink
        English
        arrow-up
        4
        arrow-down
        16
        ·
        edit-2
        10 hours ago

        This is the internet, maybe build it yourself instead of demanding others do the work for you?

        You could also just as easily only paste in the encoded part and put the decoded bit back into the link yourself.

        • ReedReads@lemmy.zipOP
          link
          fedilink
          English
          arrow-up
          6
          arrow-down
          1
          ·
          10 hours ago

          No one is demanding anything. I’m simply stating my preferred solution, which would work on both mobile and desktop, and asking if anyone knows if that solution or something similar already exists.

          Nothing suggested so far will properly decode the link that I’ve included above.

          But there is no reason to build something duplicative if a solution is already out there. Hence, the post.

          • GreenKnight23@lemmy.world
            link
            fedilink
            English
            arrow-up
            1
            ·
            8 hours ago

            you strike me as a competent developer but you lack the experience with Linux.

            install xclip, then copy your URL and use the following command.

            base64 -d "$(xclip -o)"
            

            there’s probably a better way but I’m just remembering off the top of my head.

            could probably pipe it into something that would spit it out with each param on new lines but you’ll need to google that.

  • e0qdk@reddthat.com
    link
    fedilink
    English
    arrow-up
    10
    ·
    8 hours ago

    There’s something else going on there besides base64 encoding of the URL – possibly they have some binary tracking data or other crap that only makes sense to the creator of the link.

    It’s not hard to write a small Python script that gets what you want out of a URL like that though. Here’s one that works with your sample link:

    #!/usr/bin/env python3
    
    import base64
    import binascii
    import itertools
    import string
    import sys
    
    input_url = sys.argv[1]
    parts = input_url.split("/")
      
    for chunk in itertools.accumulate(reversed(parts), lambda b,a: "/".join([a,b])):
      try:
        text = base64.b64decode(chunk).decode("ascii", errors="ignore")
        clean = "".join(itertools.takewhile(lambda x: x in string.printable, text))
        print(clean)
      except binascii.Error:
        continue
    

    Save that to a file like decode.py and then you can you run it on the command line like python3 ./decode.py 'YOUR-LINK-HERE'

    e.g.

    $ python3 ./decode.py 'https://link.sfchronicle.com/external/41488169.38548/aHR0cHM6Ly93d3cuaG90ZG9nYmlsbHMuY29tL2hhbWJ1cmdlci1tb2xkcy9idXJnZXItZG9nLW1vbGQ_c2lkPTY4MTNkMTljYzM0ZWJjZTE4NDA1ZGVjYSZzcz1QJnN0X3JpZD1udWxsJnV0bV9zb3VyY2U9bmV3c2xldHRlciZ1dG1fbWVkaXVtPWVtYWlsJnV0bV90ZXJtPWJyaWVmaW5nJnV0bV9jYW1wYWlnbj1zZmNfYml0ZWN1cmlvdXM/6813d19cc34ebce18405decaB7ef84e41'
    https://www.hotdogbills.com/hamburger-molds/burger-dog-mold
    

    This script works by spitting the URL at ‘/’ characters and then recombining the parts (right-to-left) and checking if that chunk of text can be base64 decoded successfully. If it does, it then takes any printable ASCII characters at the start of the string and outputs it (to clean up the garbage characters at the end). If there’s more than one possible valid interpretation as base64 it will print them all as it finds them.