python auto-refresh grab tickets

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

Guess you like

Origin www.cnblogs.com/benming/p/12072354.html