程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python automatic refresh 12306 ticket grabbing

編輯:Python
#!/usr/bin/env python
#-*- coding: utf-8 -*-
""" adopt splinter brush 12306 Train tickets You can automatically fill in the account and password , meanwhile , At login time , You can also change the account password Then manually identify the verification code , And log in , Next thing , Let the script do it , Just wait quietly for the result of ticket grabbing ( During ticket swiping , The browser cannot be closed ) """
import re
from splinter.browser import Browser
from time import sleep
import time
import sys
import httplib2
from urllib import parse
import smtplib
import numpy as np
from email.mime.text import MIMEText
class BrushTicket(object):
""" Ticket buying class and implementation method """
def __init__(self, user_name, password, passengers, from_time, from_station, to_station, number, seat_type):
""" Define instance properties , initialization """
# 1206 Account and password 
self.user_name = user_name
self.password = password
# Name of passenger 
self.passengers = passengers
# Starting station and terminal station 
self.from_station = from_station
self.to_station = to_station
# Date of ride 
self.from_time = from_time
# Train number 
self.number = number.capitalize()
# Seat type td Location 
if seat_type == ' Business class, special class ':
seat_type_index = 1
seat_type_value = 9
elif seat_type == ' First class seat ':
seat_type_index = 2
seat_type_value = 'M'
elif seat_type == ' Second-class seat ':
seat_type_index = 3
seat_type_value = 0
elif seat_type == ' Advanced soft bed ':
seat_type_index = 4
seat_type_value = 6
elif seat_type == ' Soft sleeper ':
seat_type_index = 5
seat_type_value = 4
elif seat_type == ' Move and lie ':
seat_type_index = 6
seat_type_value = 'F'
elif seat_type == ' Hard sleeper ':
seat_type_index = 7
seat_type_value = 3
elif seat_type == ' soft seats ':
seat_type_index = 8
seat_type_value = 2
elif seat_type == ' Hard seat ':
seat_type_index = 9
seat_type_value = 1
elif seat_type == ' No seat ':
seat_type_index = 10
seat_type_value = 1
elif seat_type == ' other ':
seat_type_index = 11
seat_type_value = 1
else:
seat_type_index = 7
seat_type_value = 3
self.seat_type_index = seat_type_index
self.seat_type_value = seat_type_value
# Main page URL 
self.login_url = 'https://kyfw.12306.cn/otn/login/init'
self.init_my_url = 'https://kyfw.12306.cn/otn/view/index.html'
self.ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'
# Browser driven information , Drive download page :https://sites.google.com/a/chromium.org/chromedriver/downloads
self.driver_name = 'chrome'
self.executable_path = r'H:\For personal use\PYTHON\file\chromedriver.exe'
def do_login(self):
""" Login function realization , Manually identify the verification code to log in """
self.driver.visit(self.login_url)
sleep(1)
self.driver.fill('loginUserDTO.user_name', self.user_name)
self.driver.fill('userDTO.password', self.password)
print(' Please enter the verification code ……')
while True:
if self.driver.url != self.init_my_url:
sleep(1)
else:
break
def start_brush(self):
""" The function of buying tickets is realized """
self.driver = Browser(driver_name=self.driver_name, executable_path=self.executable_path)
# The size of the browser window 
self.driver.driver.set_window_size(1000, 900)
self.do_login()
self.driver.visit(self.ticket_url)
try:
print(' Tickets start to swipe ……')
# Load ticket query information 
self.driver.cookies.add({
"_jc_save_fromStation": self.from_station})
self.driver.cookies.add({
"_jc_save_toStation": self.to_station})
self.driver.cookies.add({
"_jc_save_fromDate": self.from_time})
self.driver.reload()
count = 0
while self.driver.url.split('?')[0] == self.ticket_url:
self.driver.find_by_text(' Inquire about ').click()
sleep(1)
count += 1
print(' The first %d Click to query ……' % count)
try:
car_no_location = self.driver.find_by_id("queryLeftTable")[0].find_by_text(self.number)[0]
current_tr = car_no_location.find_by_xpath("./../../../../..")
if current_tr.find_by_tag('td')[self.seat_type_index].text == '--':
print(' There is no such seat type for sale , The current ticket swiping has ended , Please reopen !')
sys.exit(1)
elif current_tr.find_by_tag('td')[self.seat_type_index].text == ' nothing ':
print(' No ticket , Continue to try to ……')
elif current_tr.find_by_tag('td')[self.seat_type_index].text == ' be an alternate ':
print(' be an alternate , Continue to try to ……')
else:
# There are tickets , Try booking 
print(' Here is the ticket ( Remaining votes :' + str(current_tr.find_by_tag('td')[self.seat_type_index].text) + '), Start trying to book ……')
current_tr.find_by_css('td.no-br>a')[0].click()
sleep(1)
print(' Start selecting users ……')
key_value = 1
for p in self.passengers:
# Select the user 
self.driver.find_by_text(p).last.click()
# Choose seat type 
seat_select = self.driver.find_by_id("seatType_" + str(key_value))[0]
seat_select.find_by_xpath("//option[@value='" + str(self.seat_type_value) + "']")[0].click()
key_value += 1
sleep(0.5)
if p[-1] == ')':
self.driver.find_by_id('dialog_xsertcj_ok').click()
print(' Submitting order ……')
self.driver.find_by_id('submitOrder_id').click()
sleep(0.5)
# Check whether the result is normal 
submit_false_info = self.driver.find_by_id('orderResultInfo_id')[0].text
if submit_false_info != '':
print(submit_false_info)
self.driver.find_by_id('qr_closeTranforDialog_id').click()
sleep(0.2)
self.driver.find_by_id('preStep_id').click()
sleep(0.3)
continue
print(' Confirming order ……')
self.driver.find_by_id('submitOrder_id').click()
sleep(1)
print(' Reservation successful , Please pay in time ……')
# send content 
def mail_to(neirong, biaoti, geishei):
text = neirong
msg = MIMEText(text, 'plain', 'utf-8')
msg['subject'] = biaoti
msg["From"] = geishei
s = smtplib.SMTP(SMTPServer, 25)
s.login(sender, passwd)
s.sendmail(sender, sender, msg.as_string())
s.quit()
mail_to(neirong, biaoti, geishei)
#self.driver.quit()
except Exception as error_info:
print(error_info)
#self.driver.quit()
break
except Exception as error_info:
print(error_info)
self.driver.quit()
sys.exit(1)
if __name__ == '__main__':
# City cookie Dictionaries 
city_list = {

'bj': '%u5317%u4EAC%2CBJP', # Beijing 
'hd': '%u5929%u6D25%2CTJP', # handan 
'nn': '%u5357%u5B81%2CNNZ', # nanning 
'wh': '%u6B66%u6C49%2CWHN', # wuhan 
'cs': '%u957F%u6C99%2CCSQ', # Changsha 
'ty': '%u592A%u539F%2CTYV', # taiyuan 
'yc': '%u8FD0%u57CE%2CYNV', # yuncheng 
'gz': '%u5E7F%u5DDE%2CGZQ', # Guangzhou 
'qhc': '%u6E05%u6CB3%u57CE%2CQYP' # Qinghe city 
}
# Email messages 
SMTPServer = "smtp.163.com"
sender = "**********@163.com"
passwd = "********"
c = time.time()
b = time.localtime(c)
q = time.strftime("%Y-%m-%d %X", b)
neirong = ("12306:" + q + " I got the ticket , Turn to time !")
biaoti = (" A letter " + q)
geishei = sender
# from txt For information 
with open(r'H:\For personal use\PYTHON\file\tickets.txt', 'r', encoding='utf-8', errors='ignore') as f:
info_array = np.genfromtxt(f, dtype=str, delimiter=':')
account = info_array[0][1]
password = info_array[1][1]
from_time = info_array[2][1]
start = info_array[3][1]
end = info_array[4][1]
from_station = city_list[start]
to_station = city_list[end]
number = info_array[5][1]
seat_type = info_array[6][1]
passengers = info_array[7][1].split(",")
# Print ticket buyer information 
print(account, password, passengers, from_time, from_station, to_station, number, seat_type)
# Start grabbing tickets 
ticket = BrushTicket(account, password, passengers, from_time, from_station, to_station, number, seat_type)
ticket.start_brush()

When you don’t know what to do, just settle down and study!


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved