02 august 2024
Decoding Apple Maps Guide URLs
Revisiting the noted release of beta dot maps dot apple dot com just now, I found my way back to back to a "mystery" I deserted some years ago[^1] when "Guides" were first added to Apple Maps. You can see the result inputted into the ChatGPT conversation pasted below of using the share sheet on my personal "Columbia Area Essentials" Guide (see above.)
You'll note that said URL is very different from the officially published (and entirely useless to any real person as far as I can tell) Guides (ex: "The best things to do in Paris" - https://guides.apple.com/?lsp=9902&pg=10753559041452954389
) in that at least some of the data is encoded directly into the URL.
I should have recognized it as base64 immediately but... I didn't.
You:
Can you tell me what type of encoding the following URL is using?
https://guides.apple.com/?ug=ChhDb2x1bWJpYSBBcmVhIEVzc2VudGlhbHMSDgiuTRCOlIuKnObzvcYBEg4Irk0QuZTq18HKsu3jARINCK5NEObEq77r9OSRfBINCK5NEI7Eq4Oy2M7pIBINCK5NEKuu8s%2FmyrKIbxINCK5NELqP87HO%2BMuvFxIOCK5NEJ79oLGW0NvzzAESDgiuTRCb76zk3OnngYwBEmIaNDY5MDAgRSBPJ1JlYXIgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDIsIFVuaXRlZCBTdGF0ZXMiEglj0t9L4YVDQBGP4bGfxQ5XwCoWV2lsZCBIYXZlbiBOYXR1cmUgQXJlYRIOCK5NENWijbSzrKiUsQESDQiuTRC6wa7Ymbzj%2FRASVxo2MjI0OSBSVC0xNjEsIE1vbnRnb21lcnkgQ2l0eSwgTU8gIDYzMzYxLCBVbml0ZWQgU3RhdGVzIhIJCbWVTW90Q0AR%2FSSIBJ3iVsAqCVJlZCdzIEdhcxJkGjM1NDk1IFBlYWJvZHkgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDIsIFVuaXRlZCBTdGF0ZXMiEglOnUfF%2F4FDQBFd%2BpekMhBXwCoZQmlvcmVhY3RvciBMYW5kZmlsbCBTY2FsZRINCK5NENr875OEgrjaRhIOCK5NEJvi0MzqrNvPkAESDgiuTRCekraew5bK%2BYEBEigiEglIaww6IXZDQBHvOEVHchhXwCoSVGltbXkncyBQb29sIFBhcnR5Eg4Irk0QvOT4n5v89b3YARJjGjQxODE4IFcgV29ybGV5IFN0LCBDb2x1bWJpYSwgTU8gIDY1MjAzLCBVbml0ZWQgU3RhdGVzIhIJgfQDDex6Q0AR9nQaDnAXV8AqF0NvbHVtYmlhIFB1YmxpYyBTY2hvb2xzEg0Irk0QhYfHuNKupMRyEg0Irk0Ql4qYqMH2z4NaEg0Irk0QxeSu%2B%2BH8qdYpEmQaMVcgQnVyciBPYWsgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDMsIFVuaXRlZCBTdGF0ZXMiEgl4qLKi0HJDQBGS0fK%2Fyx1XwCobQmlnIEJ1cnIgU3RhcnJ5IFNreSBQYXJraW5nElUaNDEwOSBFIFN0ZXdhcnQgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDMsIFVuaXRlZCBTdGF0ZXMiEgmZ45AAKnlDQBFutYxDfRVXwCoJR2F5IEhvdXNlEioiEgllGNT9aHdDQBF19ro0gBlXwCoUQ2hlcnJ5IEhpbGwgR2Fkd2VlYm8SDQiuTRDa5dLMx9iizjwSKCISCST3KwAaakNAEYoHfXZHD1fAKhJDYXJ0d3JpZ2h0IENpcmN1aXQSDgiuTRCZr9mgssangeMBEg0Irk0Q%2B9uh18izx8pDEg0Irk0Q9afRyfG15J1VEg0Irk0QzcPM%2BKjp5blvEg0Irk0QiK%2Fhu7XP3acIEg4Irk0QjZS24KKtt%2FaIAQ%3D%3D
ChatGPT:
The URL you provided appears to be using percent encoding (also known as URL encoding).
In percent encoding, special characters are replaced with a percent sign (%
) followed by two hexadecimal digits that represent the ASCII code of the character. For example:
The space character (
`) is represented as
%20`.The slash character (
/
) is represented as%2F
.
In the URL you provided, you can see encoded characters such as %2F
, %2C
, and %3D
. This encoding is commonly used in URLs to ensure that all characters conform to the standard URL format and can be safely transmitted over the internet.
You:
Are you able to decode it?
ChatGPT:
Sure, I can help you decode the URL. Here's the decoded version of the URL you provided:
https://guides.apple.com/?ug=ChhDb2x1bWJpYSBBcmVhIEVzc2VudGlhbHMSDgiuTRCOlIuKnObzvcYBEg4Irk0QuZTq18HKsu3jARINCK5NEObEq77r9OSRfBINCK5NEI7Eq4Oy2M7pIBINCK5NEKuu8s/myrKIbxINCK5NELqP87HO+MuvFxIOCK5NEJ79oLGW0NvzzAESDgiuTRCb76zk3OnngYwBEmIaNDY5MDAgRSBPJ1JlYXIgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDIsIFVuaXRlZCBTdGF0ZXMiEglj0t9L4YVDQBGP4bGfxQ5XwCoWV2lsZCBIYXZlbiBOYXR1cmUgQXJlYRIOCK5NENWijbSzrKiUsQESDQiuTRC6wa7Ymbzj/RASVxo2MjI0OSBSVC0xNjEsIE1vbnRnb21lcnkgQ2l0eSwgTU8gIDYzMzYxLCBVbml0ZWQgU3RhdGVzIhIJCbWVTW90Q0AR/SSIBJ3iVsAqCVJlZCdzIEdhcxJkGjM1NDk1IFBlYWJvZHkgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDIsIFVuaXRlZCBTdGF0ZXMiEglOnUfF/4FDQBFd+pekMhBXwCoZQmlvcmVhY3RvciBMYW5kZmlsbCBTY2FsZRINCK5NENr875OEgrjaRhIOCK5NEJvi0MzqrNvPkAESDgiuTRCekraew5bK+YEBEigiEglIaww6IXZDQBHvOEVHchhXwCoSVGltbXkncyBQb29sIFBhcnR5Eg4Irk0QvOT4n5v89b3YARJjGjQxODE4IFcgV29ybGV5IFN0LCBDb2x1bWJpYSwgTU8gIDY1MjAzLCBVbml0ZWQgU3RhdGVzIhIJgfQDDex6Q0AR9nQaDnAXV8AqF0NvbHVtYmlhIFB1YmxpYyBTY2hvb2xzEg0Irk0QhYfHuNKupMRyEg0Irk0Ql4qYqMH2z4NaEg0Irk0QxeSu++H8qdYpEmQaMVcgQnVyciBPYWsgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDMsIFVuaXRlZCBTdGF0ZXMiEgl4qLKi0HJDQBGS0fK/yx1XwCobQmlnIEJ1cnIgU3RhcnJ5IFNreSBQYXJraW5nElUaNDEwOSBFIFN0ZXdhcnQgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDMsIFVuaXRlZCBTdGF0ZXMiEgmZ45AAKnlDQBFutYxDfRVXwCoJR2F5IEhvdXNlEioiEgllGNT9aHdDQBF19ro0gBlXwCoUQ2hlcnJ5IEhpbGwgR2Fkd2VlYm8SDQiuTRDa5dLMx9iizjwSKCISCST3KwAaakNAEYoHfXZHD1fAKhJDYXJ0d3JpZ2h0IENpcmN1aXQSDgiuTRCZr9mgssangeMBEg0Irk0Q+9uh18izx8pDEg0Irk0Q9afRyfG15J1VEg0Irk0QzcPM+Kjp5blvEg0Irk0QiK/hu7XP3acIEg4Irk0QjZS24KKtt/faIAQ==
In this decoded URL, spaces and other special characters that were percent-encoded are now displayed in their original form. The string following ug=
is still encoded and appears to be in base64 format. If you need further decoding of that part, it would require additional processing to decode the base64 string.
Would you like me to proceed with decoding the base64 portion of the URL as well?
You:
Yes please.
ChatGPT:
Sure, I'll decode the base64 portion of the URL for you. The base64 encoded string is:
ChhDb2x1bWJpYSBBcmVhIEVzc2VudGlhbHMSDgiuTRCOlIuKnObzvcYBEg4Irk0QuZTq18HKsu3jARINCK5NEObEq77r9OSRfBINCK5NEI7Eq4Oy2M7pIBINCK5NEKuu8s/myrKIbxINCK5NELqP87HO+MuvFxIOCK5NEJ79oLGW0NvzzAESDgiuTRCb76zk3OnngYwBEmIaNDY5MDAgRSBPJ1JlYXIgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDIsIFVuaXRlZCBTdGF0ZXMiEglj0t9L4YVDQBGP4bGfxQ5XwCoWV2lsZCBIYXZlbiBOYXR1cmUgQXJlYRIOCK5NENWijbSzrKiUsQESDQiuTRC6wa7Ymbzj/RASVxo2MjI0OSBSVC0xNjEsIE1vbnRnb21lcnkgQ2l0eSwgTU8gIDYzMzYxLCBVbml0ZWQgU3RhdGVzIhIJCbWVTW90Q0AR/SSIBJ3iVsAqCVJlZCdzIEdhcxJkGjM1NDk1IFBlYWJvZHkgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDIsIFVuaXRlZCBTdGF0ZXMiEglOnUfF/4FDQBFd+pekMhBXwCoZQmlvcmVhY3RvciBMYW5kZmlsbCBTY2FsZRINCK5NENr875OEgrjaRhIOCK5NEJvi0MzqrNvPkAESDgiuTRCekraew5bK+YEBEigiEglIaww6IXZDQBHvOEVHchhXwCoSVGltbXkncyBQb29sIFBhcnR5Eg4Irk0QvOT4n5v89b3YARJjGjQxODE4IFcgV29ybGV5IFN0LCBDb2x1bWJpYSwgTU8gIDY1MjAzLCBVbml0ZWQgU3RhdGVzIhIJgfQDDex6Q0AR9nQaDnAXV8AqF0NvbHVtYmlhIFB1YmxpYyBTY2hvb2xzEg0Irk0QhYfHuNKupMRyEg0Irk0Ql4qYqMH2z4NaEg0Irk0QxeSu++H8qdYpEmQaMVcgQnVyciBPYWsgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDMsIFVuaXRlZCBTdGF0ZXMiEgl4qLKi0HJDQBGS0fK/yx1XwCobQmlnIEJ1cnIgU3RhcnJ5IFNreSBQYXJraW5nElUaNDEwOSBFIFN0ZXdhcnQgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDMsIFVuaXRlZCBTdGF0ZXMiEgmZ45AAKnlDQBFutYxDfRVXwCoJR2F5IEhvdXNlEioiEgllGNT9aHdDQBF19ro0gBlXwCoUQ2hlcnJ5IEhpbGwgR2Fkd2VlYm8SDQiuTRDa5dLMx9iizjwSKCISCST3KwAaakNAEYoHfXZHD1fAKhJDYXJ0d3JpZ2h0IENpcmN1aXQSDgiuTRCZr9mgssangeMBEg0Irk0Q+9uh18izx8pDEg0Irk0Q9afRyfG15J1VEg0Irk0QzcPM+Kjp5blvEg0Irk0QiK/hu7XP3acIEg4Irk0QjZS24KKtt/faIAQ==
Let me decode this for you.
You:
Please continue
ChatGPT:
Sure, I'll decode the base64 string step by step. Here's the rest of the base64 string:
ChhDb2x1bWJpYSBBcmVhIEVzc2VudGlhbHMSDgiuTRCOlIuKnObzvcYBEg4Irk0QuZTq18HKsu3jARINCK5NEObEq77r9OSRfBINCK5NEI7Eq4Oy2M7pIBINCK5NEKuu8s/myrKIbxINCK5NELqP87HO+MuvFxIOCK5NEJ79oLGW0NvzzAESDgiuTRCb76zk3OnngYwBEmIaNDY5MDAgRSBPJ1JlYXIgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDIsIFVuaXRlZCBTdGF0ZXMiEglj0t9L4YVDQBGP4bGfxQ5XwCoWV2lsZCBIYXZlbiBOYXR1cmUgQXJlYRIOCK5NENWijbSzrKiUsQESDQiuTRC6wa7Ymbzj/RASVxo2MjI0OSBSVC0xNjEsIE1vbnRnb21lcnkgQ2l0eSwgTU8gIDYzMzYxLCBVbml0ZWQgU3RhdGVzIhIJCbWVTW90Q0AR/SSIBJ3iVsAqCVJlZCdzIEdhcxJkGjM1NDk1IFBlYWJvZHkgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDIsIFVuaXRlZCBTdGF0ZXMiEglOnUfF/4FDQBFd+pekMhBXwCoZQmlvcmVhY3RvciBMYW5kZmlsbCBTY2FsZRINCK5NENr875OEgrjaRhIOCK5NEJvi0MzqrNvPkAESDgiuTRCekraew5bK+YEBEigiEglIaww6IXZDQBHvOEVHchhXwCoSVGltbXkncyBQb29sIFBhcnR5Eg4Irk0QvOT4n5v89b3YARJjGjQxODE4IFcgV29ybGV5IFN0LCBDb2x1bWJpYSwgTU8gIDY1MjAzLCBVbml0ZWQgU3RhdGVzIhIJgfQDDex6Q0AR9nQaDnAXV8AqF0NvbHVtYmlhIFB1YmxpYyBTY2hvb2xzEg0Irk0QhYfHuNKupMRyEg0Irk0Ql4qYqMH2z4NaEg0Irk0QxeSu++H8qdYpEmQaMVcgQnVyciBPYWsgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDMsIFVuaXRlZCBTdGF0ZXMiEgl4qLKi0HJDQBGS0fK/yx1XwCobQmlnIEJ1cnIgU3RhcnJ5IFNreSBQYXJraW5nElUaNDEwOSBFIFN0ZXdhcnQgUmQsIENvbHVtYmlhLCBNTyAgNjUyMDMsIFVuaXRlZCBTdGF0ZXMiEgmZ45AAKnlDQBFutYxDfRVXwCoJR2F5IEhvdXNlEioiEgllGNT9aHdDQBF19ro0gBlXwCoUQ2hlcnJ5IEhpbGwgR2Fkd2VlYm8SDQiuTRDa5dLMx9iizjwSKCISCST3KwAaakNAEYoHfXZHD1fAKhJDYXJ0d3JpZ2h0IENpcmN1aXQSDgiuTRCZr9mgssangeMBEg0Irk0Q+9uh18izx8pDEg0Irk0Q9afRyfG15J1VEg0Irk0QzcPM+Kjp5blvEg0Irk0QiK/hu7XP3acIEg4Irk0QjZS24KKtt/faIAQ==
Now, I'll decode it.
ChatGPT:
It looks like there was an issue with the decoding process. I'll retry the decoding process properly.
Let me proceed with decoding the base64 string now.
ChatGPT:
The decoded base64 string appears to be a structured data representation, possibly in a binary or protocol buffer format. Here's a partial interpretation of the decoded content:
Columbia Area Essentials
46900 E O'Rear Rd, Columbia, MO 65202, United States
Wild Haven Nature Area
62249 RT-161, Montgomery City, MO 63361, United States
Red's Gas
35495 Peabody Rd, Columbia, MO 65202, United States
Bioreactor Landfill Scale
41818 W Worley St, Columbia, MO 65203, United States
Columbia Public Schools
Big Burr Starry Sky Parking
4109 E Stewart Rd, Columbia, MO 65203, United States
Cherry Hill Gadweebo
Cartwright Circuit
This suggests that the encoded data is a list of locations, likely with additional metadata such as coordinates or identifiers. However, there are non-printable characters and other binary data interspersed, which indicate this is not a straightforward text encoding but rather a structured format requiring specific decoding logic, likely a protobuf or similar serialization format.
Also, WTF??
[1] 2014, in iOS 14 Beta.