#!/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!