美文网首页Python新世界
见过刷火车票的脚本!还没见过刷飞机特价票的!Python实现的?

见过刷火车票的脚本!还没见过刷飞机特价票的!Python实现的?

作者: 919b0c54458f | 来源:发表于2018-11-21 13:59 被阅读11次

    代码,有兴趣的童鞋可以围观下面这个链接:

    《美剧的正确下载姿势》

    >>>>基础“芝士”

    在之前文章中有说明,老婆大人是个机票贩子。她们工作中主要使用的是中航信开发的一款叫“eterm”的软件。她们行内都叫这个软件为“黑屏”,具体界面如下图:

    看到上面的界面你是否也有下面的感受:

    简单描述一下eterm的操作流程,方便理解脚本的实现过程。

    输入查询命令:

    AVH/PEKNRT/15NOV/CA

    【查询从北京首都机场到日本东京成田国际机场,11月15日,国航的航班信息】

    然后双击 后面的空白部分,即可显示各个航班的机票情况详细信息。

    一般人理解的舱位只有:头等舱/商务舱/经济舱。但对于机票代理人员来说,航班CA181共有J/C/D/Z/R/G/E/Y/B/M/U/H/Q/V/W/S/T/L/N/K这些种舱位。红色框中双字符中的第一个字符表示舱位,第二个字符表示此舱位还剩余多少张票(低于10张票时用数字表示,大于等于10张票时用A表示,其他字母表示没票)

    Y舱以上舱位一般为商务或头等舱,Y舱及以下为经济舱,各个舱位的价格按舱位顺序递减。航空公司会根据机票出售情况,释放不同的舱位机票。一般情况是先买的机票比较便宜,但有时候航空公司也会偶尔释放几个低舱位的机票。如果能刷到一张低舱位的机票,就可以省下好几千块钱。这就是我客户(老婆)的需求。

    >>>>正文

    上面提到的文章中使用了windows的api接口,但我按文章中的操作,使用spy++并没有找到这个操作界面的“句柄”。对于我这个software菜鸟来说,找句柄实在是太难了,找到句柄还有再操作句柄就更难了。

    上面的文章还使用了另一个工具:PyMouse。我在学习上面的文章时,发现这个库真的真的太好用了。PyMouse 再配合PyKeyboard简直就是windows 自动化的神器呀。

    在安装PyMouse这个库时遇到了一个坑,记录一下:

    Python3中使用的PyMouse这个库作者已经不在维护,直接使用pip install PyMouse会失败,失败后记得uninstall。

    现在这个库包含在PyUserInput这个库中。PyUserInput还包括操作键盘的PyKeyboard库。

    在安装PyUserInput时还是需要安装Pyhook。不清楚为什么PyHook不可以直接pip安装,需要先下载Pyhook的whl,具体可以参考下文:

    https://blog.csdn.net/yanshuai_tek/article/details/80868917

    https://blog.csdn.net/shij19/article/details/53046048

    虽然我没有找到eTerm的api接口,没办法直接操作eTerm,但我现在有了可以模拟鼠标键盘的库,我就可以直接模拟人工操作eTerm的过程了呀。

    Python脚本的操作思路如下:

    先用鼠标选取报出的航班信息,然后在模拟Ctrl+c进行复制

    把使用win32clipboard库,将剪贴板中复制的信息保存到变量中

    处理航班信息,找到关心的舱位是否有余票

    如果有余票,则把余票信息发邮件到自己的邮箱

    如果没有余票,等待10分钟,然后模拟鼠标双击,重新查询航班信息

    由于eTerm这个软件大家应该听都没听过,应该没办法运行整个脚本,部分脚本如下:

    1from pykeyboard import PyKeyboard

    2from pymouse import PyMouse

    3import time

    4import re

    5import win32clipboard as w

    6import win32con

    7import smtplib

    8from email.mime.text import MIMEText

    9

    10

    11k = PyKeyboard()

    12m = PyMouse()

    13passList = ['A','1','2','3','4','5','6','7','8','9']

    14mailto_list=['xxxxxx@163.com']

    15

    16#用于将剪贴板中的信息复制到text变量中

    17def getText():

    18 w.OpenClipboard()

    19 t = w.GetClipboardData(win32con.CF_TEXT)

    20 w.CloseClipboard()

    21 text = str(t,encoding = 'utf8')

    22 return text

    23

    24#解析航班信息的函数,此处省略了

    25def exText(txtList):

    26 fDict = {}

    27 .......

    28 return fDict

    29

    30#刷新航班信息,复制航班信息到剪贴板

    31def checkData(a_x,a_y,b_x,b_y,c_x,c_y):

    32 m.click(c_x,c_y,1,2)#第3个参数1表示左键,第4个参数2表示双击

    33 time.sleep(3)

    34 m.click(a_x,a_y)

    35 k.press_key(k.shift_key)

    36 m.click(b_x,b_y)

    37 k.release_key(k.shift_key)

    38 k.press_key(k.control_key)

    39 k.tap_key('C')

    40 k.release_key(k.control_key)

    41 time.sleep(3)

    42 newText = getText()

    43 return newText

    44

    45

    46#发现有低舱时,给自己发邮件,在之前文章中有此代码。

    47class mailhelper(object):

    48 pass

    49

    50def main():

    51 print("请在3秒内把鼠标放在第一个点位置")

    52 time.sleep(3)

    53 a_x,a_y = m.position()

    54 print("请在3秒内把鼠标放在第二个点位置")#前两个位置用于获取航班信息

    55 time.sleep(3)

    56 b_x,b_y = m.position()

    57 print("请在3秒内把鼠标放在要双击的位置")#这个位置用于刷新航班信息

    58 time.sleep(3)

    59 c_x,c_y = m.position()

    60 for i in range(3):

    61 text = checkData(a_x,a_y,b_x,b_y,c_x,c_y)

    62 textList = text.split('')

    63 flyDict = exText(textList)

    64 emailText = checkClass('UA850','L',flyDict)

    65 print(emailText)

    66 time.sleep(10)

    67

    68 if emailText :

    69 mailhelper().send_mail(mailto_list,'发现一个低舱',emailText)

    70

    71

    72

    73if __name__ == '__main__':

    74 main()

    进群:548377875   即可获取数十套PDF以及大量的学习教程哦!

    相关文章

      网友评论

        本文标题:见过刷火车票的脚本!还没见过刷飞机特价票的!Python实现的?

        本文链接:https://www.haomeiwen.com/subject/nufcqqtx.html