#!/usr/bin/env python
#-*- coding: utf-8 -*-
"""
By splinter brush 12306 train
It can automatically fill the account password, and, when you log in, you can also modify the account password
Then manual identification code, and log in, the next thing, handed over the script to do, quietly waiting for the results of rush tickets like (brush counting process, the browser can not 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 class and implementation ." ""
def __init__(self, user_name, password, passengers, from_time, from_station, to_station, number, seat_type):
"" " Instance property is defined, initialization " ""
# 1206 account password
self.user_name = user_name
self.password = password
# Passenger's name
self.passengers = passengers
# Start and end stations and
self.from_station = from_station
self.to_station = to_station
# Travel dates
self.from_time = from_time
# Train No.
self.number = number.capitalize()
# Seat type where td position
if seat_type == ' business seat Principal Block ':
seat_type_index = 1
seat_type_value = 9
elif seat_type == ' class seat ':
seat_type_index = 2
seat_type_value = 'M'
elif seat_type == ' two seat ':
seat_type_index = 3
seat_type_value = 0
elif seat_type == ' advanced soft sleeper ':
seat_type_index = 4
seat_type_value = 6
elif seat_type == ' soft ':
seat_type_index = 5
seat_type_value = 4
elif seat_type == ' action lying ':
seat_type_index = 6
seat_type_value = 'F'
elif seat_type == ' hard ':
seat_type_index = 7
seat_type_value = 3
elif seat_type == ' soft seat ':
seat_type_index = 8
seat_type_value = 2
elif seat_type == ' 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 driver information, driver 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):
"" " Log function realization, manual identification codes to sign 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 this code ...... ')
while True:
if self.driver.url != self.init_my_url:
sleep(1)
else:
break
def start_brush(self):
"" " Ticket functions to achieve ." ""
self.driver = Browser(driver_name=self.driver_name, executable_path=self.executable_path)
# Size of the browser window
self.driver.driver.set_window_size(1000, 900)
self.do_login()
self.driver.visit(self.ticket_url)
try:
print ( ' start of brush ...... ')
# Load the 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 ( ' query ') .click ()
sleep(1)
count += 1
print ( ' first % d hits 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 ( ' No such type seats sold, has ended the current brush votes, please re-open! ')
sys.exit(1)
elif current_tr.find_by_tag('td')[self.seat_type_index].text == '无':
print ( ' without a ticket, continue to try ...... ')
elif current_tr.find_by_tag('td')[self.seat_type_index].text == '候补':
print ( ' candidate, continues to try ...... ')
else:
# Tickets, try to book
print ( ' brush to the vote (more than votes: ' + str (current_tr.find_by_tag ( 'td') [self.seat_type_index] .text) + ' ), I began to try to book ...... ')
current_tr.find_by_css('td.no-br>a')[0].click()
sleep(1)
print ( ' start selecting the user ...... ')
key_value = 1
for p in self.passengers:
# Select Users
self.driver.find_by_text(p).last.click()
# Select the type of seat
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 ( ' being submitted orders ...... ')
self.driver.find_by_id('submitOrder_id').click()
sleep(0.5)
# Check whether the results returned to 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 ( ' is confirming orders ...... ')
self.driver.find_by_id('submitOrder_id').click()
sleep(1)
print ( ' book success, please go to pay ...... ')
# Sending 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 dictionary
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' # qinghecheng
}
# -Mail 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 + " to grab votes, turn into time! ")
biaoti = ( " letter " + q)
geishei = sends
# From txt to obtain 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 forex rebate information
print(account, password, passengers, from_time, from_station, to_station, number, seat_type)
# Start to grab votes
ticket = BrushTicket(account, password, passengers, from_time, from_station, to_station, number, seat_type)
ticket.start_brush()
Original link: https: //blog.csdn.net/qq_34158880/article/details/103602447