火車票軟體源碼
Ⅰ 想用java製作一個自動買火車票的軟體,請問怎麼實現網頁上按鈕的點擊
google上有個開源項目組 go_home你可以參考一下
大概的思路是,填寫用戶名密碼,發送到12306執行登陸的地址游高,然後接受返回的信息,包括cookie(包含sessionID),
然頌者後在模擬網站需要的表單內容填充request發送到「查詢」功能對應的地神櫻尺址,然後解析返回的內容
大概就是這樣,具體的源代碼可以去go_home獲取,不過不知道是不是還兼容現在的12306
Ⅱ 求個能運行的火車票售票系統,最好帶源碼的~~
能正常運行的火車大氏票售票系統是沒有的;只有模擬售票版的系統。如果我們可以從網上下載到火車票售票系統並且可以正常使用的話那鐵路部門不是亂套了?他們的代售點的電腦都是邦定了電腦主板上的MAC地址的.並且是使用耐族鐵通專線上網;其他地方滾畝散用不了的~~
Ⅲ 12306有多少行代碼
基於Selenium和Chrome瀏覽器實現。
默認搶票類型為普通票,硬座。需求多的話可以在源碼里改,我寫的注釋挺詳細。
復制粘貼就能使用,2019年8月13日 測試可用。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait,Select
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time,sys
class robTickets(object):
def __init__(self):
'登錄頁、主頁、搶票頁'
self.login_url="https://kyfw.12306.cn/otn/resources/login.html"
self.initmy_url="https://kyfw.12306.cn/otn/view/index.html"
self.search_url="https://kyfw.12306.cn/otn/leftTicket/init"
self.driver = webdriver.Chrome()
self.hastictket=False
def run(self):
self._login()
self._order_ticket()
def _login(self):
'登錄頁面手動登錄'
self.driver.get(self.login_url)
time.sleep(1)
self.driver.find_element_by_class_name("login-hd-account").click()
username = input("請輸入 用戶名/手機號/郵箱 :")
password = input("請輸入 密碼:")
print("請在瀏覽器中完成驗證碼並確認")
self.driver.find_element_by_id("J-userName").send_keys(username)
self.driver.find_element_by_id("J-password").send_keys(password)
WebDriverWait(self.driver,1000).until(
EC.url_to_be(self.initmy_url)
)
print("登錄成功!")
self._wait_input()
self._order_ticket()
def _wait_input(self):
self.from_station=input("請輸入出發地:")
self.to_station=input("請輸入目的地:")
self.depart_time=input("出發時間(yyy-mm-dd):")
def _order_ticket(self):
'選票頁面手動選票,自動搶票'
self.driver.get(self.search_url)
self.url = "https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc&fs=%s,BJP&ts=%s,SHH&date=%s&flag=N,N,Y"%(self.from_station,self.to_station,self.depart_time)
self.driver.get(self.url)
self.order_url="https://kyfw.12306.cn/otn/confirmPassenger/initDc"
WebDriverWait(self.driver,60).until(
EC.presence_of_all_elements_located((By.XPATH,"//tbody[@id='queryLeftTable']/tr"))
)
tr_list = self.driver.find_elements_by_xpath("//tbody[@id='queryLeftTable']/tr[not(@datatran)]")
print("共搜索到 "+str(len(tr_list))+" 條結果!")
self.passengers = input("請輸入乘客姓名(多個乘客的話,用英文逗號隔開):").split(",")
self.trains = input("請輸入車次(多個車次,用英文逗號隔開):").split(",")
# 循環檢票
TNT = int(input("搶票監測時間(秒):"))
st = time.time()
i=0
while time.time()-st<TNT:
for tr in tr_list:
train_number = tr.find_element_by_class_name("number").text
if train_number in self.trains:
self.hastictket=True
ticket = tr.find_element_by_xpath(".//td[last()-3]").text
if ticket == "有" or ticket.isdigit():
print(train_number+" "+ticket+" 票")
tr.find_element_by_class_name("btn72").click()
self._money()
if self.hastictket==False:
print("未查詢到相關班次!")
self.driver.quit()
sys.exit()
# 未找到票,刷新界面
self.driver.refresh()
tr_list = self.driver.find_elements_by_xpath("//tbody[@id='queryLeftTable']/tr[not(@datatran)]")
WebDriverWait(self.driver, 60).until(
EC.presence_of_all_elements_located((By.XPATH, "//tbody[@id='queryLeftTable']/tr"))
)
i+=1
print("搶票第 %d 次"%i)
def _money(self):
'支付界面自動下單'
WebDriverWait(self.driver, 60).until(
EC.url_to_be(self.order_url)
)
WebDriverWait(self.driver, 60).until(
EC.presence_of_all_elements_located((By.XPATH, "//ul[@id='normal_passenger_id']//li"))
)
lis = self.driver.find_elements_by_xpath("//ul[@id='normal_passenger_id']//li")
x = 0
for li in lis:
# 遍歷聯系人尋找乘客
if li.find_element_by_xpath("./label").text in self.passengers:
li.find_element_by_xpath("./input[@class='check']").click()
x += 1
WebDriverWait(self.driver, 1000).until(
EC.visibility_of_element_located((By.ID, "seatType_%d" % x))
)
# 此處value為1代表硬座,修改此處可以更改票的類型
selectTag = Select(self.driver.find_element_by_id("seatType_%d" % x))
selectTag.select_by_value("1")
print("正在提交訂單,請等待60s...")
self.driver.find_element_by_id("submitOrder_id").click()
WebDriverWait(self.driver, 20).until(
EC.element_to_be_clickable((By.ID, "qr_submit_id"))
)
# 提交並檢查訂單,此處限時60s
start = time.time()
while time.time() - start < 60:
try:
self.driver.find_element_by_xpath(r"//a[@id='qr_submit_id']").click()
except:
if self.driver.current_url != self.order_url:
print("訂單已完成,請打開12306完成支付!")
time.sleep(1000)
else:
if self.driver.find_element_by_xpath(r"//div[@class='tit']").text == "下單成功。":
print("訂單已完成,請打開12306完成支付!")
self.driver.get("https://kyfw.12306.cn/otn/view/train_order.html")
time.sleep(1000)
else:
time.sleep(0.1)
if __name__=='__main__':
print("本程序默認抓取的是普通票,硬座,想實現更多功能請在源碼里修改")
spider = robTickets()
spider.run()
復制
運行截圖:
python
Selenium
12306
海島奇兵無限鑽石版
精選推薦
廣告
python實現12306自動搶票,並發簡訊郵件通知
1740閱讀·6評論·1點贊
2021年4月26日
想去看演唱卻總是搶不到票?教你用Python製作一個自動搶票腳本
1.4W閱讀·367評論·92點贊
2021年11月24日
利用Python自動搶火車票真的不難,100行代碼即可完成
556閱讀·0評論·0點贊
2022年12月15日
python實現雲伺服器上12306自動化搶票功能
806閱讀·1評論·1點贊
2022年10月2日
python搶票軟體源代碼_一百多行python代碼實現搶票助手
5063閱讀·0評論·0點贊
2021年3月6日
Python實戰之12306搶票
2499閱讀·15評論·6點贊
2022年3月15日
gta5正版下載
精選推薦
廣告
1每天Python小例-12306爬蟲#WinError 2
310閱讀·0評論·0點贊
2021年5月26日
100行Python代碼實現自動搶火車票
246閱讀·0評論·0點贊
2023年1月14日
小年到了,回家搶票太難,用Python做個腳本12306自動查票以及自動購票....
36閱讀·0評論·0點贊
2023年1月14日
Python製作一個12306查票程序腳本(附完整代碼,僅供學習參考)
841閱讀·0評論·3點贊
2021年9月9日
使用Python實現12306自動化搶票
2689閱讀·2評論·1點贊
2021年4月22日
Python實現自動搶票12306(基於Python3.8+splinter)
299閱讀·0評論·0點贊
2021年9月18日
python爬蟲(十七)12306案例
1008閱讀·0評論·1點贊
2021年9月13日
python實現12306全自動搶票
2.0W閱讀·3評論·26點贊
2019年1月2日
12306自動搶票軟體代碼實現
2.0W閱讀·17評論·9點贊
2018年2月3日
網頁小腳本,真簡單 搶手機腳本 搶票腳本 淘寶腳本 不知道能不能行
1.2W閱讀·5評論·1點贊
2019年1月16日
12306火車票搶票Python代碼
2898閱讀·3評論·1點贊
2018年5月10日
[轉]搶票工具代碼
684閱讀·0評論·1點贊
2019年9月26日
python大麥搶票腳本_搶不到票?你離idol只差
Ⅳ 急求基於java的火車票售票系統,源代碼
500給你做
Ⅳ 搶票代碼原理
1
為什麼會實州旅埋行搶票機制?
其他所謂的搶票,根本原理就是幫你時時刻刻盯著12306而已。無論哪一家的搶票,最終都是要通過.
2
有人知道搶票軟體的原理是什麼嗎?
「購票者提供個人信息,將被上傳至伺服器資料庫。 一旦檢測到余票就迅速鎖定,並通過高速填寫乘車人信息和自動識別驗證碼來搶票
3
12306是搶票原理分析 - 多線程之間實現同步 - evanYang - 的博客...
2020年5月3日程序執行的順序按照代碼的先後順序執行。 一般來說處理器為了提高程序運行效率
4
python自動搶票的原理
python自動搶票的原理_利用Python代碼自動搶火車票的原理以及代碼解析
weixin_39890629
原創
關注
1點贊·1024人閱讀
今年你不妨自己寫一段代碼來搶回家的火車票,是不是很Cool。
准備工具:
12306網站用戶名和密碼
chrome瀏覽器及下載chromedriver
下載Python代碼
代碼用的Python+Splinter開發,Splinter是一個使用Python開發的開源Web應用測試工具,它可以幫你實現自動瀏覽站點和與其進行交互。Splinter執行的時候會自動打開你指定的瀏覽器,訪問指定的URL。然後你所開發的模擬的任何行為,都會自動完成,你只需要鎮胡坐在電腦面前,像看電影一樣看著屏幕上各種動作自動完成然後收集結果即可。
了解原理:
找到相應URL,找到控制項模擬登錄、查詢、訂票操作。關鍵是找到控制項名稱,難點是起始地不是直接輸入的頁面值,冊螞需要在cookie中查出。
12306查詢URL:
12306登錄URL:
我的12306URL:
購票確認URL:
Python代碼打開URL,找到控制項填充值:
找到用戶名密碼控制項名
找到起始地控制項名
確定起始地的值,方法Chrome瀏覽器中的「檢查」功能(按F12),Network--->Cookies中找到:
cookie中起始地的值
拷貝起始地的cookie值,我把幾個常用的城市拷出來,放到了字典中:
查詢車票代碼:
其實,你只需要運行代碼:
當然,還需要手動點一下的還是萬惡的12306驗證碼,搶到票後確認支付就行啦。
搶票進行中
搶票成功!
5
登錄
首頁
學習
實踐
活動
專區
工具
TVP
返回騰訊雲官網
阿黎逸陽
111 篇文章
關注
100行代碼自動買火車票——和你一起探索搶票軟體背後的原理
2021-10-08 15:32:42閱讀 6940
大家有沒有這種感覺,一到國慶、春節這種長假,搶火車票就非常困難?
各大互聯網公司都推出搶票服務,只要加錢給服務費就可以增加搶到票的幾率。
有些火車票代售網點和一些加速買票軟體,說你只要給100元服務費就可以優先幫忙搶到票。
本文和你一起探索搶票軟體背後的原理。
本文目錄
效果展示
代碼詳解
2.1 導入庫
2.2 確定好基本購票信息
2.3 登錄12306
2.4 模擬滑動滑塊
2.5 處理疫情特殊要求
2.6 點擊購票並填寫相關信息
2.7 鎖定車票
一、效果展示
在正式進入代碼講解之前,先來看下本文的實現效果。
如果不是為了演示效果,直接在最後確定階段加一個延時點擊確定,應該不到45秒可以鎖定一張票,只要在30分鍾之內付款即可。
二、代碼詳解
本小節會詳細解鎖搶票軟體是如何模擬登錄網站,進行自動買票的。
為了更清晰地給大家展示,部分代碼沒有寫成函數,直接裸代碼運行,讓需要買票的朋友可以自己應用軟體進行購票。
1 導入庫
首先導入本文需要載入的庫,如果你有些庫還沒有安裝,導致運行代碼時報錯,可以在Anaconda Prompt中用pip方法安裝。
import json
import time
from captcha import *
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import wait
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
#導入庫
復制
2 確定好購票基本信息
導入庫後,在python代碼中填寫你購票的基本信息。
purpose = 'ADULT' #購買成人票,如果是學生票,需調整代碼
names = ['謝朝陽'] #填寫購票人姓名
date = '2021-09-21' #填寫購票日期
start_station = '深圳' #購票出發站
end_station = '長沙南' #購票目的站
password = '11234567xyz' #登錄12306的秘密
username ='xiezhaoyang122700' #登錄12306的賬號
trains = ['G1004', 'G80', 'G6028', 'G6182', 'G6016'] #你想買的班次
#填寫基本信息
復制
本文預訂的是2021年9月21日從深圳到長沙南的高鐵票,你可以根據自己的實際需要進行調整。
由於有些班次的時間過早或過晚,買了也很不方便,所以可以在trains中挑選出你滿意的班次進行購票。
在這里需要提醒大家,我之前在嘗試代碼時碰到的坑,那就是時間中如果有個位數要在前面填0。
比如2021年9月2日,你在填寫購票日期date時要寫成'2021-09-02',否則在運行代碼時日期總是填不進去。
3 登錄12306
確定好購票的基本信息後,就可以應用python模擬登錄12306了,代碼如下:
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
browser = webdriver.Chrome(options=options)
browser.maximize_window()
login_url = 'https://kyfw.12306.cn/otn/resources/login.html'
#ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'
browser.get(login_url)
time.sleep(0.5)
wait.WebDriverWait(browser, 5).until(EC.element_to_be_clickable((By.CLASS_NAME,'login-hd-account'))).click()
input_name = browser.find_element_by_id('J-userName')
input_pd = browser.find_element_by_id('J-password')
input_name.send_keys(username)
input_pd.send_keys(password)
login = browser.find_element_by_id('J-login')
login.click()
#登錄12306
復制
整體思路是:
應用python模擬調用google瀏覽器;
輸入12306網址;
等網頁載入完全後點擊賬戶密碼登錄;
找到賬號密碼的id,把賬戶密碼信息填充進去;
找到登錄id,模擬點擊登錄按鈕。
在這一小節中要注意兩個點。一是要在python安裝目錄中放和google版本匹配的chromedriver,供python調用。
二是要學會找填寫賬戶密碼信息的id。
首先,在google瀏覽器中輸入12306登錄網址:https://kyfw.12306.cn/otn/resources/login.html。
接著點擊賬戶密碼登錄,會出現如下界面。
然後點擊紅框中的三個點,找到更多工具,點擊開發者工具,會出現如下界面。
點擊紅框中的箭頭,把滑鼠移動到賬戶框上去,就會出現如下界面:
undefined
右邊變灰的框里就會出現對應的id,點擊賬號框,再把滑鼠移動到右邊變灰的字元上去,點擊右鍵,會出現 element的選項,復制下來即可。
<input type="text" class="input" id="J-userName" placeholder="用戶名/郵箱/手機號" style="height: 44px; line-height: 44px; outline: black 0px;" aria-label="請輸入用戶名/郵箱/手機號" title="請輸入用戶名/郵箱/手機號">
復制
發現了嗎?源代碼input_name中要填寫的browser.find_element_by_id('J-userName')內容,即為id="J-userName"中的信息。
4 模擬滑動滑塊
輸入完用戶名和密碼,點擊立即登錄後,會出現如下滑塊驗證要求。
運行如下代碼即可拖動滑塊進行驗證。
browser.implicitly_wait(5)
print('=====開始處理滑動驗證碼=====')
track = [300, 400, 500]
for i in track:
try:
btn = browser.find_element_by_xpath('//*[@id="nc_1__scale_text"]/span')
ActionChains(browser).drag_and_drop_by_offset(btn,i,0).perform()
except:
time.sleep(2)
#拉動滑塊驗證
復制
其中,browser.implicitly_wait(5)表示隱性等待5秒,track中放的是滑塊拉動的距離。
5 處理疫情特殊要求
完成滑塊驗證要求後,會出現如下疫情特殊要求提示:
用如下代碼點擊確認即可。
browser.implicitly_wait(5)
browser.find_element_by_xpath('/html/body/div[5]/div[2]/div[3]/a').click()
time.sleep(2)
#疫情特殊要求
復制
browser.find_element_by_xpath和id的區別是,在右鍵復制時要 XPath或 full XPath。
6 點擊購票並填寫出發地、目的地、出發時間
接下來是選擇買票,並將出發地、目的地、出發時間等信息填寫進去。
browser.find_element_by_xpath('//*[@id="J-chepiao"]/a').click()
browser.find_element_by_xpath('//*[@id="megamenu-3"]/div[1]/ul/li[1]/a').click()
browser.find_element_by_xpath('//*[@id="qd__id"]').click()
#選擇買票
def input_info():
print('=====開始買票=====')
from_station = browser.find_element_by_xpath('//*[@id="fromStationText"]')
from_station.send_keys(Keys.ENTER)
from_station.send_keys(Keys.CONTROL, 'a')
from_station.send_keys(start_station, Keys.ENTER)
browser.implicitly_wait(5)
to_station = browser.find_element_by_xpath('//*[@id="toStationText"]')
to_station.send_keys(Keys.ENTER)
to_station.send_keys(Keys.CONTROL, 'a')
to_station.send_keys(end_station, Keys.ENTER)
browser.implicitly_wait(5)
start_date = browser.find_element_by_xpath('//*[@id="train_date"]')
start_date.send_keys(Keys.ENTER)
start_date.send_keys(Keys.CONTROL, 'a')
start_date.send_keys(Keys.CONTROL, 'x')
start_date.send_keys(date, Keys.ENTER)
browser.implicitly_wait(5)
wait.WebDriverWait(browser, 3).until(EC.element_to_be_clickable((By.ID,'query_ticket'))).click()
input_info()
input_info()
#將出發地、目的地、出發日期填進去
復制
得到結果如下:
這里需要注意的是我調用了兩遍input_info函數,因為12306可能採取了一些反爬措施,一遍輸入進去後查不出東西,顯示為灰色。
7 鎖定車票
最後是依次查找trains中的車次是否有票,有的話點擊購買鎖定車票。
trList = browser.find_elements_by_xpath(".//tbody[@id='queryLeftTable']/tr[not(@datatran)]")
for tr in trList:
trainNum = tr.find_element_by_class_name("number").text
if trainNum in trains:
leftTicket = tr.find_element_by_xpath(".//td[4]").text
print('leftTicket', leftTicket)
if leftTicket == '有' or leftTicket.isdigit():
orderBtn = tr.find_element_by_class_name("btn72")
orderBtn.click()
browser.implicitly_wait(5)
passengerLabels = browser.find_elements_by_xpath(".//ul[@id='normal_passenger_id']/li/label")
for passengerLabel in passengerLabels:
name = passengerLabel.text
if name in names:
passengerLabel.click()
browser.implicitly_wait(20)
# 獲取提交按鈕
submitBtn = browser.find_element_by_id("submitOrder_id")
submitBtn.click()
browser.implicitly_wait(20)
confirmBtn = browser.find_element_by_id("qr_submit_id")
confirmBtn.click()
time.sleep(2)
browser.implicitly_wait(20)
confirmBtn = browser.find_element_by_id("qr_submit_id")
confirmBtn.click()
break
#依次查找trains中的車次是否有票,有的話點擊購買
復制
所以,如果你有特別心儀的車次,可以在trains中放在最前面,依次填寫覺得還行的車次。
至此,應用python解鎖搶票軟體背後的原理已講解完畢,感興趣的朋友可以自己跟著本文實現一遍。
12306不定期會更新買票界面,所以過一段時間可能之前的代碼就要進行一些調整,需要自己弄清裡面的原理,才可以以不變應萬變。
本文的代碼沒有進行高級的封裝,只為大家能更清楚地了解每一步,能在搶票高峰期買到自己心儀的票。
也寫得很基礎,沒有進一步的調優縮短時效,感興趣的朋友可以自行研究,如有任何疑問可以跟我溝通。
6
搶票軟體原理 - Python實戰案例教學(視頻講解) 12306...
2020年12月7日python有很多方法去實現搶票,其基本原理,就是讓程序自動模擬人去操作12306網站
7
為什麼會實行搶票機制?
其他所謂的搶票,根本原理就是幫你時時刻刻盯著12306而已。無論哪一家的搶票,最終都是要通過.
Ⅵ 火車票預訂系統裡面有代碼怎麼變成程序,求教
1,查看源代碼
2,復制
3,粘貼到文本鬧含文檔
4,重命名文液悄笑檔運叢 XX.htm
Ⅶ 誰能教我用myeclipse寫個簡單的基於java的火車票網上訂票系統,有源碼的可不可以發個
您要簡單做還是復雜做,如果簡單做就如樓上所述,如果復雜做就現在開始好好學習,不要一步登天,必須先學會三個框架,做企業級開發一定會用到的:struts2、sprint、hibernate
Ⅷ 火車票訂票系統怎麼做,最好用asp的,要有源代碼
直接按F12查看源代碼就可以了,
Ⅸ 急求用mfc做一個圖形界面,界面是一個關於火車票查詢系統的界面。可以講一下方法,當然能有源代碼就更好了
這個你要的太急了,這個速度的話你估計要出大價錢才能有人幫你寫,這種系統需要資料庫來支持的,就是光界面的話可以採用Combobox的下拉列表,一般這種東西都不是用MFC寫的,用ASP或者C#等都很合適,畢竟火車票查詢需要通過網路判指訪問資料庫,單機掘升配的東西部那麼笑臘重要
Ⅹ Python 實現一個火車票查詢的工具
使用 python 實現一個查詢火車票的小工具
主要功能:
輸入出發車站,到達車站,時間,然後返回所有的車次信息,和余票信息
支持輸入附加選項查詢不同的火車的類型,比如高鐵,動車。
#查詢上海到北京2017-04-25的高鐵和動車的車票,-g -d 是附加選項 表示高鐵和動車
python3 trains.py -gd 上海 北京 2017-04-25
運行結果:
1. 對12306網站買票過程抓包分析
點擊查詢之後,通過抓包發現返回了一個json的文件,查看這個文件,就是保存著具體車次的信息。抓包如下圖所示。
請求的url 是:
GET /otn/leftTicket/query?leftTicketDTO.train_date=2017-04-20&leftTicketDTO.from_station=TJP&leftTicketDTO.to_station=TYV&purpose_codes=ADULT HTTP/1.1
發現這個請求使用的是get方法,然後傳遞了四個參數,一個是出發站,一個是到達車站,一個是成年人or學生,最後一個是時間。如下圖:
但是有一個問題是,我輸入的是天津到太原,但是這個卻轉換成了拼音的簡稱。必須要找到這個轉換的字典是什麼,這樣才能正確的使用這個介面。
在網頁的源代碼找到這個文件,station_name.js 文件,如下圖:
js文件的格式是,如下圖,使用的話,必須要想用正則表達式處理一下:
2. 使用正則表達式處理這個js文件
使用正則表達式,將js 文件裡面的車站名字和對應的簡稱提取出來,然後寫入到一個station.py 文件裡面,作為字典,程序運行的時候,將這個文件以模塊的形式包含進去。
關於正則表達式,先佔一個坑,以後在詳細的寫。
正則表達式的代碼:
運行的時候:
# 將輸出重定向到一個新的文件stations.py裡面python3 test3.py > stations.py
3. 使用docopt 優雅的完成命令行的輸入
docopt 是一個很優雅的處理輸入的一個模塊,docopt可以根據你寫的文檔描述,可以自動為你生成解析器,可以非常容易的為你的python程序創建命令行界面。http://www.jianshu.com/p/d2c7cbf21931
4. 主程序
4.1 處理url
4.2 輸出
運行結果:
5. 使用prettytable模塊 優雅的輸出
詳細:http://www.jianshu.com/p/a6172b68810e
作者 sexycoder 本文轉載自簡書,轉載需授權