Github上的開源工具幫助你實現“十一”回家的願望

原文鏈接:https://blog.csdn.net/BEYONDMA/article/details/100622963

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/BEYONDMA/article/details/100622963
下週末就是中秋節了,筆者做一名北漂的天津人,也特別能理解那些遠離家鄉獨自在外的同事,每逢佳節倍思親,但這時候的火車票卻是十分難搶,那麼筆者就爲大家介紹一下今天Github上趨勢榜首的“12306自動搶票”項目的使用方法(Github地址在https://codeload.github.com/testerSunshine/12306/zip/master)

 特別說明:本項目屬於爬蟲類項目,如果商用可能會有法律風險,請各位讀者謹慎使用,如果由於根據本文使用12306自動搶票軟件引發法律糾紛,筆者並不承擔。

12306搶票項目的安裝和使用
  目前“12306自動搶票”的Github官網上還沒有一個完整的安裝和佈署攻略,這裏我就把完整的安裝流程向大家說明一下。不過目前本項目應該還只支持UBANTU等LINUX平臺,這個項目的很多依賴項在WINDOWS平臺上裝非常麻煩,所以建議直接在UBANTU上佈署,這樣相對比較簡單。
    1.下載項目源碼:

    使用以下命令下載項目源碼    

git clone https://github.com/testerSunshine/12306.git
cd 12306
2.下載項目依賴的識別碼打碼模型

 打開以下網址:https://github.com/testerSunshine/12306model,下載下圖兩個標紅的模型文件,並放到12306項目的根目錄(一般是~/12306)





  3.安裝項目依賴

  使用以下命令下載項目依賴項,本項目的依賴項比較多,建議直接使用sudo安裝更多穩妥,如果有報錯,則需要單獨去解決具體安裝項的問題,目前看最主要的問題可能在於tensorflow的安裝,不過由於不需要GPU的版本,所以直接安裝應該也不會有什麼問題。

sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
4.安裝chromedriver

使用以下命令安裝chromedriver,一般安裝後會放在/usr/local/bin下,需要在配置文件的CHROME_PATH標籤下填好

sudo apt-get install chromium-chromedriver
5.修改配置文件

 修改“12306自動搶票”項目根目錄下的TickerConfig.py,具體註釋原作者已經寫好了,如下:

關於軟件使用配置說明,一定要看!!!

ps: 如果是候補車票,需要通過人證一致性覈驗的用戶及激活的“鐵路暢行”會員可以提交候補需求,請您按照操作說明在鐵路12306app.上完成人證覈驗

關於候補了之後是否還能繼續撿漏的問題在此說明: 軟件爲全自動候補加撿漏,如果軟件候補成功則會停止搶票,發出郵件通知,但是不會影響你繼續撿漏,

如果這個時候撿漏撿到的話,也是可以付款成功的,也就是說,撿漏+候補,可以最大程度提升搶票成功率

刷票模式:1=刷票 2=候補+刷票

TICKET_TYPE = 2

候補最晚兌現日期,目前軟件爲撿漏加自動候補,所以這個值一定要填,並且這個日期一定要填小於最長訂票時間(30天)

格式爲日期+小時+分

舉例: 比如今天纔可以買10.1號的票,比如你那個發車是10.1號上午兩點,你兌現時間寫到10.1晚上22點?

t("#fromDate").val() + “#” + t("#dafaultTime").html().replace(“時”, “”) + “#” + t("#dafaultMinutes").html().replace(“分”, “”),

J_Z_PARAM = “2019-09-28#22#59”

出發日期(list) “2018-01-06”, “2018-01-07”

ps: 日期如果是單日,一定要前面補個0,正確做法:2019-01-01, 錯誤做法:2019-1-1

STATION_DATES = [
“2019-09-25”
]

填入需要購買的車次(list),“G1353”

STATION_TRAINS = [
“”,
]

出發城市,比如深圳北,就填深圳就搜得到

FROM_STATION = “”

到達城市 比如深圳北,就填深圳就搜得到

TO_STATION = “”

座位(list) 多個座位ex:

“商務座”,

“一等座”,

“二等座”,

“特等座”,

“軟臥”,

“硬臥”,

“硬座”,

“無座”,

“動臥”,

SET_TYPE = [
“”,
]

當餘票小於乘車人,如果選擇優先提交,則刪減聯繫人和餘票數一致在提交

bool

IS_MORE_TICKET = True

乘車人(list) 多個乘車人ex:

- “張三”

- “李四”

TICKET_PEOPLES = [
“”,
]

12306登錄賬號

USER = “”
PWD = “”

加入小黑屋時間默認爲5分鐘,此功能爲了防止殭屍票導致一直下單不成功錯過正常的票

TICKET_BLACK_LIST_TIME = 5

自動打碼

IS_AUTO_CODE = True

郵箱配置,如果搶票成功,將通過郵件配置通知給您

列舉163

email: “[email protected]

notice_email_list: “[email protected]

username: “xxxxx”

password: "xxxxx

host: “smtp.163.com”

列舉qq ,qq設置比較複雜,需要在郵箱–>賬戶–>開啓smtp服務,取得授權碼==郵箱登錄密碼

email: “[email protected]

notice_email_list: “[email protected]

username: “xxxxx”

password: “授權碼”

host: “smtp.qq.com”

EMAIL_CONF = {
“IS_MAIL”: False,
“email”: “”,
“notice_email_list”: “”,
“username”: “”,
“password”: “”,
“host”: “”,
}

是否開啓 pushbear 微信提醒, 使用前需要前往 http://pushbear.ftqq.com 掃碼綁定獲取 send_key 並關注獲得搶票結果通知的公衆號

PUSHBEAR_CONF = {
“is_pushbear”: False,
“send_key”: “”
}

是否開啓cdn查詢,可以更快的檢測票票 1爲開啓,2爲關閉

IS_CDN = 1

下單接口分爲兩種,1 模擬網頁自動撿漏下單(不穩定),2 模擬車次後面的購票按鈕下單(穩如老狗)

ORDER_TYPE = 2

下單模式 1 爲預售,整點刷新,刷新間隔0.1-0.5S, 然後會校驗時間,比如12點的預售,那腳本就會在12.00整檢票,刷新訂單

2 是撿漏,撿漏的刷新間隔時間爲0.5-3秒,時間間隔長,不容易封ip

ORDER_MODEL = 2

是否開啓代理, 0代表關閉, 1表示開始

開啓此功能的時候請確保代理ip是否可用,在測試放裏面經過充分的測試,再開啓此功能,不然可能會耽誤你購票的寶貴時間

使用方法:

1、在agency/proxy_list列表下填入代理ip

2、測試UnitTest/TestAll/testProxy 測試代理是否可以用

3、開啓代理ip

IS_PROXY = 0

預售放票時間, 如果是撿漏模式,可以忽略此操作

OPEN_TIME = “13:00:00”

1=使用selenium獲取devicesID

2=使用網頁端/otn/HttpZF/logdevice獲取devicesId,這個接口的算法目前可能有點問題,如果登錄一直302的請改爲配置1

COOKIE_TYPE = 1

如果COOKIE_TYPE=1,則需配置chromeDriver路徑(注意是填你機器本地chromeDriver的路徑,這個地方一定要改),下載地址http://chromedriver.storage.googleapis.com/index.html

chromedriver配置版本只要和chrome的大版本匹配就行

如果是windows,最好在路徑加上r, ex: r"/Users/wenxianping/Downloads/chromedriver"

CHROME_PATH = “”

PASSENGER_TICKER_STR = {
‘一等座’: ‘M’,
‘特等座’: ‘P’,
‘二等座’: ‘O’,
‘商務座’: 9,
‘硬座’: 1,
‘無座’: 1,
‘軟座’: 2,
‘軟臥’: 4,
‘硬臥’: 3,
}

軟件版本

RE_VERSION = “1.1.106”
5.運行程序開始搶票

直接使用以下命令進行搶票即可:

sudo python run.py
看到軟件幫你自動搶票了

代碼導讀
總體而言這個搶票項目設計思路清昕,有很多地方值得一讀,先給大家帶來以下兩部分

1.使用Selenium得到cookie的device_id,具體在~/config/getCookie.py

def getDrvicesID(session):
“”"
:return:
“”"
print(“cookie獲取中”)
if TickerConfig.COOKIE_TYPE is 1:
from selenium import webdriver#導入Selenium包
cookies = []
options = webdriver.ChromeOptions()
options.add_argument(‘headless’)
driver = webdriver.Chrome(chrome_options=options,
executable_path=TickerConfig.CHROME_PATH)#設置的chrome_driver的地址
driver.get(“https://www.12306.cn/index/index.html”)
time.sleep(10)
#根據cookie的name來獲得
for c in driver.get_cookies():
cookie = dict()
if c.get(“name”) == “RAIL_DEVICEID” or c.get(“name”) == RAIL_EXPIRATION":
cookie[c.get(“name”)] = c.get(“value”)
cookies.append(cookie)
if cookies:
session.httpClint.set_cookies(cookies)
print(“cookie獲取完成”)
elif TickerConfig.COOKIE_TYPE is 2:
request_device_id(session)
2.是自動打碼的部分,在~/verify/localVerifyCode.py

def verify(fn):
backend.clear_session()
verify_titles = [‘打字機’, ‘調色板’, ‘跑步機’, ‘毛線’, ‘老虎’, ‘安全帽’, ‘沙包’, ‘盤子’, ‘本子’, ‘藥片’, ‘雙面膠’, ‘龍舟’, ‘紅酒’, ‘拖把’, ‘捲尺’, ‘海苔’, ‘紅豆’, ‘黑板’, ‘熱水袋’, ‘燭臺’, ‘鐘錶’, ‘路燈’, ‘沙拉’, ‘海報’, ‘公交卡’, ‘櫻桃’, ‘創可貼’, ‘牌坊’, ‘蒼蠅拍’, ‘高壓鍋’, ‘電線’, ‘網球拍’, ‘海鷗’, ‘風鈴’, ‘訂書機’, ‘冰箱’, ‘話梅’, ‘排風機’, ‘鍋鏟’, ‘綠豆’, ‘航母’, ‘電子秤’, ‘紅棗’, ‘金字塔’, ‘鞭炮’, ‘菠蘿’, ‘開瓶器’, ‘電飯煲’, ‘儀表盤’, ‘棉棒’, ‘籃球’, ‘獅子’, ‘螞蟻’, ‘蠟燭’, ‘茶盅’, ‘印章’, ‘茶几’, ‘啤酒’, ‘檔案袋’, ‘掛鐘’, ‘刺繡’, ‘鈴鐺’, ‘護腕’, ‘手掌印’, ‘錦旗’, ‘文具盒’, ‘辣椒醬’, ‘耳塞’, ‘中國結’, ‘蜥蜴’, ‘剪紙’, ‘漏斗’, ‘鑼’, ‘蒸籠’, ‘珊瑚’, ‘雨靴’, ‘薯條’, ‘蜜蜂’, ‘日曆’, ‘口哨’]
# 讀取並預處理驗證碼
img = base64_to_image(fn)#將img轉換
text = get_text(img)
imgs = np.array(list(pretreatment._get_imgs(img)))
imgs = preprocess_input(imgs)
text_list = []
# 識別文字
model = models.load_model(PATH(’…/model.v2.0.h5’))#使用之前的model識別文字
label = model.predict(text)
label = label.argmax()
text = verify_titles[label]
text_list.append(text)
# 獲取下一個詞
# 根據第一個詞的長度來定位第二個詞的位置
if len(text) == 1:
offset = 27
elif len(text) == 2:
offset = 47
else:
offset = 60
text = get_text(img, offset=offset)
if text.mean() < 0.95:
label = model.predict(text)
label = label.argmax()
text = verify_titles[label]
text_list.append(text)
print(“題目爲{}”.format(text_list))
# 加載圖片分類器
model = models.load_model(PATH(’…/12306.image.model.h5’))
labels = model.predict(imgs)
labels = labels.argmax(axis=1)
results = []
for pos, label in enumerate(labels):
l = verify_titles[label]
print(pos+1, l)
if l in text_list:
results.append(str(pos+1))
return results
好了,以上就是對於12306項目的簡介,在這裏也對項目的原作者testerSunshine表示感謝,同時也祝各位讀者身體健康,中秋快樂,閤家團圓!
————————————————
版權聲明:本文爲CSDN博主「beyondma」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/BEYONDMA/article/details/100622963

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章