• 12306购票辅助工具


    前段时间在GitHub上看到一段刷票的脚步代码,下下来稍稍改了下加了个简陋的UI界面,另外把车站列表等信息弄成了csv文件,方便不改源码的情况下添加车站。

    先上核心内容:

    1. try:
    2. if hasattr(print_func, '__call__'):
    3. print_func('开始刷票……')
    4. # print('开始刷票……')
    5. # 加载车票查询信息
    6. self.driver.cookies.add({"_jc_save_fromStation": self.from_station})
    7. self.driver.cookies.add({"_jc_save_toStation": self.to_station})
    8. self.driver.cookies.add({"_jc_save_fromDate": self.from_time})
    9. self.driver.reload()
    10. count = 0
    11. while self.driver.url == self.ticket_url:
    12. try:
    13. self.driver.find_by_text('查询').click()
    14. except Exception as error_info:
    15. print(error_info)
    16. sleep(1)
    17. continue
    18. sleep(0.5 * refresh_times)
    19. count += 1
    20. local_date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    21. if hasattr(print_func, '__call__'):
    22. print_func('第%d次点击查询……[%s]' % (count, local_date))
    23. # print('第%d次点击查询……[%s]' % (count, local_date))
    24. try:
    25. for car_no in self.numbers:
    26. current_tr = self.driver.find_by_xpath('//tr[@datatran="' + car_no + '"]/preceding-sibling::tr[1]')
    27. if current_tr:
    28. current_time = current_tr.find_by_css('.start-t').text
    29. if current_tr.find_by_tag('td')[self.seat_type_index].text == '--':
    30. if hasattr(print_func, '__call__'):
    31. print_func('%s无此座位类型出售……' % (car_no + '(' + current_time + ')',))
    32. # print('%s无此座位类型出售……' % (car_no + '(' + current_time + ')',))
    33. sleep(0.2)
    34. elif current_tr.find_by_tag('td')[self.seat_type_index].text == '无':
    35. if hasattr(print_func, '__call__'):
    36. print_func('%s无票……' % (car_no + '(' + current_time + ')',))
    37. # print('%s无票……' % (car_no + '(' + current_time + ')',))
    38. sleep(0.2)
    39. else:
    40. # 有票,尝试预订
    41. if hasattr(print_func, '__call__'):
    42. print_func(car_no + '(' + current_time + ')刷到票了(余票数:' + str(
    43. current_tr.find_by_tag('td')[self.seat_type_index].text) + '),开始尝试预订……')
    44. # print(car_no + '(' + current_time + ')刷到票了(余票数:' + str(
    45. # current_tr.find_by_tag('td')[self.seat_type_index].text) + '),开始尝试预订……')
    46. current_tr.find_by_css('td.no-br>a')[0].click()
    47. sleep(1)
    48. key_value = 1
    49. for p in self.passengers:
    50. if '()' in p:
    51. p = p[:-1] + '学生' + p[-1:]
    52. # 选择用户
    53. if hasattr(print_func, '__call__'):
    54. print_func('开始选择用户……')
    55. # print('开始选择用户……')
    56. self.driver.find_by_text(p).last.click()
    57. # 选择座位类型
    58. if hasattr(print_func, '__call__'):
    59. print_func('开始选择席别……')
    60. # print('开始选择席别……')
    61. if self.seat_type_value != 0:
    62. self.driver.find_by_xpath(
    63. "//select[@id='seatType_" + str(key_value) + "']/option[@value='" + str(
    64. self.seat_type_value) + "']").first.click()
    65. key_value += 1
    66. sleep(0.5)
    67. if p[-1] == ')':
    68. self.driver.find_by_id('dialog_xsertcj_ok').click()
    69. sleep(0.1)
    70. if hasattr(print_func, '__call__'):
    71. print_func('正在提交订单……')
    72. # print('正在提交订单……')
    73. self.driver.find_by_id('submitOrder_id').click()
    74. sleep(1)
    75. # 查看放回结果是否正常
    76. submit_false_info = self.driver.find_by_id('orderResultInfo_id')[0].text
    77. if submit_false_info != '':
    78. print(submit_false_info)
    79. self.driver.find_by_id('qr_closeTranforDialog_id').click()
    80. sleep(0.2)
    81. self.driver.find_by_id('preStep_id').click()
    82. sleep(0.3)
    83. continue
    84. if hasattr(print_func, '__call__'):
    85. print_func('正在确认订单……')
    86. # print('正在确认订单……')
    87. sleep(1)
    88. self.driver.find_by_id('qr_submit_id').click()
    89. if hasattr(print_func, '__call__'):
    90. print_func('预订成功,请及时前往支付……')
    91. # print('预订成功,请及时前往支付……')
    92. # 发送通知信息
    93. self.send_mail(self.receiver_email, '恭喜您,抢到票了,请及时前往12306支付订单!')
    94. # self.send_sms(self.receiver_mobile, '您的验证码是:8888。请不要把验证码泄露给其他人。')
    95. else:
    96. if hasattr(print_func, '__call__'):
    97. print_func('当前车次异常')
    98. # print('当前车次异常')
    99. except Exception as error_info:
    100. if hasattr(print_func, '__call__'):
    101. print_func(error_info)
    102. # print(error_info)
    103. # 跳转到抢票页面
    104. self.driver.visit(self.ticket_url)
    105. except Exception as error_info:
    106. print(error_info)

    其中self.driver是需要引入splinter.browser.Browser,根据源码可以看到支持的浏览器类型基本覆盖了常用的浏览器了。

    _DRIVERS = {
        'chrome': None,
        'edge': None,
        'firefox': None,
        'remote': None,
        'django': None,
        'flask': None,
        'zope.testbrowser': None,
    }

    我用的是Chrome浏览器,以此为例需要先查看自身浏览器的版本号下载对应版本的驱动。

    由于墙的存在下载速度太慢,可以选择国内源:http://npm.taobao.org/mirrors/chromedriver/

     下载后将压缩包里的文件复制到Chrome浏览器安装目录的Chrome/Application目录下。

    以上步骤都弄好后可以先在python console尝试一下 ,看是否成功调出Chrome浏览器。

    1. from splinter.browser import Browser
    2. driver = Browser(driver_name='chrome')

     原脚本文件运行后是在黑窗窗上输入个类信息的,我加了个ui界面,输入相对方便些,但是要用于购票的话,还是需要提前上12306网站查看车次信息。因为这里并没有加爬取网页车次信息和座位类型供选择的功能,若有感兴趣的欢迎下载源码修改完善。https://gitee.com/solun/python-pro.git

     当然,如果有需要也可以直接下载我打包好的exe文件直接使用,只是每次购票的时候都需要重复扫码登录。另外车站列表中只有部分城市的火车站,若要添加新的可按如下方法操作。

    下载链接

    链接:12306购票辅助工具
    提取码:4tfj 
    --来自百度网盘超级会员V5的分享

    车站添加方法

     

     如图所示,在浏览器中打开12306网址,并选择车站名,打开开发者模式,选择“网络”,点击任意一条请求查看cookie内容, 其中_jc_save_fromStation= %u6C88%u9633%2CSYT 代表刚刚选择的出发站沈阳站; _jc_save_toStation= %u4E0A%u6D77%2CSHH 代表目的地上海站; 将加粗部分的编码复制到stations.csv中,按格式编辑即可。

  • 相关阅读:
    耐心一些,总有一种清理方法能让你靠近幸福
    【2015】【论文笔记】等离子光混合器THz辐射的光谱——
    深度解析链动2+1模式,颠覆传统卖货思维?
    武汉轻工大学计算机考研资料汇总
    Android gradle dependency tree change(依赖树变化)监控实现
    OPTEE:CA-TA会话的创建(二)
    Linux Docker 安装 Nginx 反向代理 负载均衡
    Python和Java哪个更好找工作?
    Java练习题——抽象类、方法以及接口
    AI学习集合-前瞻
  • 原文地址:https://blog.csdn.net/sinat_23568211/article/details/126297531