pnr.sh看UA PNR手动平替方式(浏览器开发者模式)

【UPDATE】有一些技术水平很高(比我高到不知道哪里去)的朋友,把我这里写的内容转变成了一个油猴脚本。详细可看这个:pnr.sh看UA PNR半自动平替(油猴脚本)

【原文】
大家吼哇!

众所周知,PNR.SH这个网站是大家经常用来看UA票的状态的网站,如检查客服是否正确地完成改票的操作。

但是,近几个月,PNR.SH的UA功能已经坏掉了。我分析了一下代码,貌似是因为UA的服务器block了PNR.SH的访问。但是,尽管没有PNR.SH,我们也可以使用手动的方法来看机票的状态。

PNR.SH是如何工作的?

PNR.SH网站的工作原理,其实就是模拟客户的浏览器,去向UA服务器请求行程的信息。

用户使用浏览器去请求行程信息,流程大致如图所示:

用户在浏览器界面输入PNR ABCDEF和姓名JIANG ZEMIN之后,并点击“lookup”之后:

  • 浏览器向UA服务器发送一个请求。
  • UA服务器处理这个请求之后,把结果用JSON的格式传回给浏览器。
  • 浏览器再把这个JSON字符串里面的内容,用漂漂亮亮的格式渲染出来。

这个JSON字符串里面,不仅有用户可以直接在浏览器看到的内容(如具体行程),也可以看到一些额外的信息,如每个coupon的status(如BR CNTRL、ADJUSTED、INVOL EXCH之类的)和每一个航段的status(如HK1)。浏览器在显示网页的过程中,会把这些额外的信息忽略掉,但是如果可以看到整个JSON的内容,就可以自己得出这些额外信息了。

PNR.SH就是模拟浏览器,直接向UA服务器发送请求,然后把UA服务器返回的结果里面的额外内容展示出来。

使用浏览器开发者模式,来直接读取JSON信息

既然PNR.SH不再能够直接联系UA的服务器,那我们就可以直接通过浏览器的开发者模式,来读取JSON信息。

基本示意图如下:

当然,这就要求用户可以自己阅读JSON文件的内容,需要对JSON、编程有一定的熟悉度。可以用一个文件编辑器(如VS Code)来看。

具体流程

我们就使用Google Chrome浏览器来做示范。其他浏览器应该差不多。

打开United官网之后,按F12按钮进入开发者模式。

在开发者模式里面,进入Network(网络)选项卡,然后在Filter里面输入"lookup"字样。

为什么是“lookup”呢?因为现在的UA网站,在当用户输入PNR和姓名、点击提交之后,就会向UA服务器的一个叫做“lookup”的endpoint发送请求。服务器处理完之后,就会在对同一个请求予以回复。我们的目的是截获这个回复,就在Filter这里写入“lookup”即可。

然后,正常地在UA网站上的“My Trips”里面输入PNR和姓名,点击“search”。我们就可以看到,开发者模式里面就突然出现了一个搜索结果。

我们点击这一行,然后在弹出的窗口中进入“Response”选项卡。这里面就有我们所需要的JSON内容。

把这个复制进一个text editor,就可以去看里面的内容了。这里面可以搜索“FlightSegmentType”,就可以看到行程里面每一个航班的状态了。我这里是HK1。搜索“FlightStatuses”,就可以看到Ticket coupon status。

不过这个文件里面,大部分内容都是不太重要的。可能需要自己探索探索找到需要的信息。

不过UA的JSON里面已经没有客服留的remarks了。要看remarks的我也没办法。

差不多就这样,PNR.SH能看到的信息,都是来源于这个JSON。(我看了PNR.SH的源代码,里面的JSON schema和这个一摸一样。)

其他航司是否也可以这样子?

我们知道,PNR.SH只支持特定的几个航司,但是许多其他航司的网站/服务器,设计也是差不多的。我自己试了一下,加航、汉莎、波兰航空、韩亚、AA、日航等等都可以用类似的方法(试了下,长荣不太行)。当然,这些其他航司的网站,都不会使用“lookup”这个endpoint。怎么解决呢?

我一般的做法很鸡贼,就是在搜索结果加载出来之后,在开发者模式左边的Find处输入票号(有没有中间的dash都试一下)、姓名、常旅客号码等信息。

大家想一想,我只在网站上输入了我的PNR,浏览器却收到了含有我的票号的一个JSON。或者,我只输入了我的姓氏(JIANG),航司系统却给我返回了带有我名字(ZEMIN)的JSON。那这个JSON肯定就是航司网站系统查询内部数据库之后返回的了。毕竟它居然直接给我了我没告诉它的信息,对不对?那这个JSON应该就是服务器返回的我的详细行程信息了。:troll:

有些航司(如日航、LH)的这个JSON里面,甚至可以看到客服留下的Remarks。

比如,我之前用AA里程定了这个行程

Day 1: NGO(名古屋) - HND 日航国内Class J
在HND隔夜转机
Day 2: HND - DFW 日航头等

我就打电话给日航问了一下,我这个属于是在HND转机到国际头等,在NGO是否可以使用JL的Sakura Lounge。日航客服最后说不行,因为属于隔夜转机。我当时还想,到时候去JL的lounge碰碰运气。

然后我就在日航网站背后的JSON里面看到了这个remark:

ADVD <我姓名> CANT USE NGO LOUNGE FOR <我NGO-HND航班信息> DUE TRANSFER NOT ON THE SAME DAY

其中ADVD的意思是“ADVISED”。这个remark的意思就是说,客服已经明确和我讲不能用NGO休息室了。到时候如果我到了机场还问能不能进休息室,柜台的人就可以直接看到这个remarks,就可以直接拒绝我。:yaoming:

本人technical ability、知识水平不高,无法自己写一个PNR.SH的全自动平替。有这个需求的人请另请高明,我实在也不是谦虚。很惭愧,就做了一点微小的工作,谢谢大家!

46 个赞

前排点赞!

原来这个也会写到票里
退了重定就没了?

ua的remark有辦法看得到嗎?想看看打了十餘次客服到底加了什麼註記
謝謝

只有我注意到LZ使用的例子里面的姓名

非常的暴力吗 :troll: :troll:

赞,感谢分享,佩服。

LZ 好牛逼啊

原来大家改完票都不放心,都要自己去查的吗?有多少人,改完票就当成功改完了。。

感谢分享 早日直升钛金

1 个赞

改完就等确认邮件。。从来没去查的路过。。

钛!

lz只是摩蛤 :troll:

应该是,退了重定就没了。

当然我hold到了日航头等,是不可能退了重定的,万一被别人拿走了咋办 :yaoming:

有的时候虽然出票了,票里面还是会有一些奇奇怪怪的问题,就可以去看一下吧

膜蛤 :yanjing:

应该没办法了

不过如果你能说服UA帮你改签到JL的话,JL的网站上应该(?)是可以看得到的?

太强了!

这是想升钛 :troll:

根据LZ的教程写了个非常简单的油猴脚本

3 个赞

nb!

给个feedback

我这个航班的航班号是LO1(波兰航空实际运营),可是从这里看不出实际运营的航司。

好的 暂时还没有想好哪些东西应该显示 哪些没必要显示
目前左上角有个show raw json的按钮可以切换

1 个赞