我如何解码/重新创建谷歌航班搜索URL?

8

问题

Google Flights上的搜索信息被编码在URL参数中,可能是为了让用户方便地分享航班搜索结果。URL格式如下:

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

我正在尝试编写一个程序,可以根据航班信息(起点、终点、航班日期、乘客数量等)生成航班搜索URL。为此,我需要知道该信息如何在URL中进行编码,以便重新创建它。

我的尝试

我知道航班信息是使用base64编码或其某个变体进行编码的(我一直在使用base64decode.org 进行测试)。对于从HNL-SFO往返于2021-09-13至2021-09-17的航班,Google Flights具有以下URL:

https://www.google.com/travel/flights/search?tfs=CBwQAhoeagcIARIDSE5MEgoyMDIxLTA5LTEzcgcIARIDU0ZPGh5qBwgBEgNTRk8SCjIwMjEtMDktMTdyBwgBEgNITkxwAYIBCwj___________8BQAFIAZgBAQ
tfs查询参数下划线前面的部分解码为
jHNL
2021-09-13rSFOjSFO
2021-09-17rHNLp

这段文字包含了一些(但不是全部)可识别的飞行信息,我不理解的是在这些可识别信息之间的空格。通过这个网站,我了解到这些空格是由多种字符混合组成的:

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 Flights网站的行为,我认为它对乘客信息进行编码,但它的base64解码只产生空格字符。

附加上下文

两年前,我制作了一个可工作的程序版本,可以生成类似于以下的URL:

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将他们使用的格式从上述格式更改为编码版本。我想弄清如何重新创建编码的URL,以便更新我的程序而不是让它退役。
3个回答

4
您可以使用qURL参数以查询格式输出航班URL,无需对URL进行编码/解码。
例如:
https://www.google.com/travel/flights?q=Flights%20to%20SFO%20from%20HNL%20on%202022-09-13%20through%202022-09-17

这将导致结果页面:HNL<>SFO航班结果


1
谢谢你的提示!你知道是否可以指定乘客数量吗?有没有相关的规范或指南? - ReachingNewFlights
2
我已经弄清楚了如何处理乘客和票价等级:例如结果 - ReachingNewFlights
1
没错,继续使用查询字符串构建您想要预填充的参数即可。我不确定是否所有参数都是可控的,但我需要的所有参数都可以通过这种查询格式工作。 - neoJato
1
谢谢,你帮了我很大的忙。你知道是否有一个短语可以控制座位上婴儿的数量吗?“婴儿”似乎对应于膝上婴儿。这是我需要但无法弄清楚的唯一一个。 - ReachingNewFlights
1
由于就技术而言,坐在座位上的婴儿在大多数航空公司中算是购买了座位,因此我认为将其映射为“1个儿童”应该是安全的。在这种情况下,我没有找到任何区分“坐着的婴儿”和“儿童”的区别的内容。 - neoJato
显示剩余9条评论

0

我想念能够编码查询并得到相同问题的能力。很好,你找出它是在base64中。

我认为逆向工程是发现如何编码事物的唯一方法。例如,下划线后面的东西很可能是二进制编码的。

请参见以下经济数据:

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

同样的查询,但是针对商务舱

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

正如您所看到的,第10个字节从00011001变为10111101


0

Google的Bard能够解码这个

我的问题是,这个Google Flights的URL使用了什么编码? https://www.google.com/travel/flights/search?tfs=CBwQAhopEgoyMDIzLTA5LTA5ag0IAhIJL20vMDJfMjg2cgwIAhIIL20vMDdkZmsaKRIKMjAyMy0wOS0xOGoMCAISCC9tLzA3ZGZrcg0IAhIJL20vMDJfMjg2QAFIA3ABggELCP___________wGYAQE

巴德的回应
您提供的Google Flights URL是使用URL安全的Base64格式进行编码的。这是一种将数据编码为字符串以便在网络上传输而不会损坏的方法。然后可以将编码后的字符串解码回其原始形式。
要解码该URL,您可以使用Base64解码器。有许多在线的Base64解码器可供使用,或者您可以使用支持Base64解码的编程语言。
以下是解码后的字符串:
tfs=origin=SFO&destination=LAX&departure_date=2023-06-06&return_date=2023-06-13&adults=1&children=0&infants=0&cabin=economy
该字符串告诉Google Flights在2023年6月6日从SFO到LAX搜索航班,并于2023年6月13日返回。搜索是针对1个成人的经济舱航班。
您可以使用该字符串在Google Flights上搜索航班。只需将字符串复制并粘贴到Google Flights网站的搜索栏中。

我能够获得的唯一可复制/可读的URL是使用接受答案中列出的查询格式。
一些例子:
一种方式

https://www.google.com/travel/flights?q=Flights%20to%20TYO%20from%20JFK%20on%202023-09-09%20oneway&curr=USD

一位成年人和两个孩子坐头等舱。

https://www.google.com/travel/flights?q=Flights%20to%20SFO%20from%20HNL%20on%202023-09-13%20through%202023-09-17%20with%20one%20adult%20and%20two%20children%20first%20class&curr=USD

1位成年人从FRA到SFO的商务舱

https://www.google.com/travel/flights?q=Flights%20to%20SFO%20from%20FRA%20on%202023-09-13%20through%202023-09-17%20with%20one%20adult%20business%20class&curr=USD

我唯一遇到的问题是高级经济舱。 我尝试了premium%20economy、premium+economy、premium_economy、p_economy、py以及其他很多方式,但是我无法显示高级经济舱的航班。

1
巴德的答案是错误的。你展示的链接是关于从纽约到东京的9月9日至18日的旅程,但巴德说它是关于从旧金山到洛杉矶的6月6日至13日的旅程。事实上,无论我尝试什么经过编码的谷歌航班链接,巴德都给出相同的回答。看起来巴德在这里产生了幻觉。 - ReachingNewFlights
有人发现如何使用q参数筛选特定航空公司吗? - Valentino
@Valentino - 你只需在搜索查询的那部分添加特定的航空公司即可。注意:我无法让“联盟”起作用,但也没有花太多时间在上面。 - undefined
@Valentino,我在我的采纳答案中添加了一个示例,只显示特定航空公司(United)的结果,希望能帮到你! - undefined
@neoJato 谢谢!你能找到如何选择多个航空公司而不仅仅是一个吗?尝试使用逗号、和、或的方式了吗? - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接