如何 decode/recreate Google 航班搜索 URL?

How can I decode/recreate Google Flights Search URLs?

问题

Google Flights 上,搜索信息被编码在 URL 参数中,大概是为了让用户可以轻松地彼此共享航班搜索。 URL 格式如下所示:

https://www.google.com/travel/flights/search?tfs=CBwQAhoeagcIARIDSE5MEgoyMDIxLTA5LTEzcgcIARIDU0ZPGh5qBwgBEgNTRk8SCjIwMjEtMDktMTdyBwgBEgNITkxwAYIBCwj___________8BQAFIAZgBAQ

我正在尝试编写一个程序,可以在给定航班信息(出发地、目的地、航班日期、乘客等)的情况下生成航班搜索 URL。为此,我需要知道信息在 URL 中是如何编码的,以便我可以重新创建它。

我试过的

我知道航班信息是用 base64 或其变体编码的(我一直在使用 base64decode.org 进行测试)。对于 2021 年 9 月 13 日至 2021 年 9 月 17 日从 HNL-SFO 出发的往返航班,Google 航班有此 URL:

https://www.google.com/travel/flights/search?tfs=CBwQAhoeagcIARIDSE5MEgoyMDIxLTA5LTEzcgcIARIDU0ZPGh5qBwgBEgNTRk8SCjIwMjEtMDktMTdyBwgBEgNITkxwAYIBCwj___________8BQAFIAZgBAQ

下划线解码为

之前的tfs查询参数部分
jHNL
2021-09-13rSFOjSFO
2021-09-17rHNLp

其中包含一些(但不是全部)可识别的航班信息。我不明白的是可识别信息之间的空白。使用 this site,我了解到空格是字符的混合:

U+0008 : <control> BACKSPACE [BS]
U+001C : <control> INFORMATION SEPARATOR FOUR {file separator (FS)}
U+0010 : <control> DATA LINK ESCAPE [DLE]
U+0002 : <control> START OF TEXT [STX]
U+001A : <control> SUBSTITUTE [SUB]
U+001E : <control> INFORMATION SEPARATOR TWO {record separator (RS)}
U+006A : LATIN SMALL LETTER J
U+0007 : <control> BELL [BEL]
U+0008 : <control> BACKSPACE [BS]
U+0001 : <control> START OF HEADING [SOH]
U+0012 : <control> DEVICE CONTROL TWO [DC2]
U+0003 : <control> END OF TEXT [ETX]
U+0048 : LATIN CAPITAL LETTER H
U+004E : LATIN CAPITAL LETTER N
U+004C : LATIN CAPITAL LETTER L
...

这表明我没有正确解码数据。我已经尝试了 base64 的一些其他变体,但没有任何运气。

有谁知道这个信息是如何编码的?另一件一直想不通的事情是下划线(8BQAFIAZgBAQ)后面的信息是如何编码的。根据 Google 航班网站的行为,我认为它对乘客信息进行了编码,但 base64 仅解码为空白字符。

其他上下文

两年前,我制作了一个程序的工作版本,它产生了 URLs like

https://www.google.com/flights?hl=en#flt=ORD.MCO.2021-07-16*MCO.ORD.2021-07-19;c:USD;e:1;px:2,2,0,0;sd:1;t:f

几个月前 Google 将他们使用的格式从上面的格式更改为编码版本。我想弄清楚如何重新创建编码的 URLs,这样我就可以更新我的程序而不是将其淘汰。

我怀念能够对查询进行编码的能力并且有同样的问题。发现它在 base64 中,干得不错。

我认为逆向工程是找出事物编码方式的唯一方法。例如,下划线后面的内容很可能是二进制编码的。

经济性见下:

11101111 10111111 10111101 00010100 00000000 00010100 11101111 10111111 10111101 00011001 11101111 10111111 10111101 00010000 00010000

和相同的查询,但用于业务 class

11101111 10111111 10111101 00010100 00000000 00010100 11101111 10111111 10111101 00101001 11101111 10111111 10111101 00010000 00010000

如您所见,第 10 个字节从 00011001 变为 10111101

您可以使用 q URL 参数让您的程序以查询格式输出航班 URLs。不需要 encode/decode URL.

例如:

https://www.google.com/travel/flights?q=Flights%20to%20SFO%20from%20HNL%20on%202022-09-13%20through%202022-09-17

结果页面:HNL <> SFO Flight Results