这个是之前在学校是真的闲的要吐的时候,自己做着玩的,也算是对Python的一次练习吧,里面全是一些字符串操作,没什么技术含量,各位大佬请让路啦~~嘻嘻
然后,代码长这样:
import requests
import json
import datetime
import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def main():
# 输入要获取的车票信息
train_date_in=input("乘车日期(eg:2222-02-02):")
from_station=input("出发站:")
to_station=input("到达站:")
# 调用getStationCode()函数,将城市转化为对应代码
from_station = getStationCode(from_station)
to_station = getStationCode(to_station)
# url拼接
url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date='+train_date_in+'&leftTicketDTO.from_station='+from_station+'&leftTicketDTO.to_station='+to_station+'&purpose_codes=ADULT'
train_info = requests.get(url).text
# 将获得的数据保存在data.json文件内
f = open('data.json','w',encoding='utf-8')
f.write(train_info)
f.close()
# 将获得的数据转化为json格式
before = open('data.json','r',encoding='utf-8')
data = json.load(before)
before.close()
print(type(data))
# 从json数据中取出map(城市和对应的代码)、result(各车次车票信息)
data = data['data']
map_ = data['map']
result = data['result']
# 调用getTrainInfo()函数,获得各车次信息
train_date = train_date_in[0:4] + train_date_in[5:7]
TICKET = train_date_in + '\n' + getTrainInfo(result,map_,train_date)
# 将车票信息发送到本人邮箱
sendEmail(TICKET)
while(True):
try:
# 定时发送,可以自定义邮件发送得时间,我这里设置的是整点发送
if(datetime.datetime.now().minute == 0):
sendEmail(TICKET)
time.sleep(20)
except Exception:
# print("出现异常,继续运行")
continue
else:
# print("没有异常")
continue
def getStationCode(station):
search = open('12306city_code.txt','r',encoding = 'utf-8')
lines = search.readlines()
for line in lines:
if(station in line):
station = line[-4:-1]
search.close()
return station
def getTrainInfo(result,map_,train_date):
count = 1
TICKET = ''
for i in result:
print(count)
if("列车运行图调整,暂停发售" in i):
print("列车运行图调整,暂停发售,再看看别的吧@_@")
elif("暂售至" in i):
print("您选择的时间段暂时还没有开售哦^-^")
elif("预订" not in i):
print("抱歉,该班车暂时不能预定3333...")
else:
# 获得班车号
train_name = i.find('|') + 1
train_name = i.find('|',train_name) + 1
train_name_start = i.find('|',train_name) + 1
train_name_end = i.find('|',train_name_start)
train_name = i[train_name_start:train_name_end]
print(train_name)
# 获得班车出发站-到达站信息
train_station = i.find('|',train_name_end) + 1
train_station = i.find('|',train_station) + 1
train_station = i.find('|',train_station) + 1
# 获得出发站名字
# print(i[train_station:train_station+3])
train_station_from = map_[i[train_station:train_station+3]]
print(train_station_from)
train_station = i.find('|',train_station) + 1
# 获得到达站名字
# print(i[train_station:train_station+3])
train_station_to = map_[i[train_station:train_station+3]]
print(train_station_to)
# 获得班车时间信息
train_time = i.find('|',train_station) + 1
# 获得列车发车时间
train_time_run = i[train_time:train_time+5]
print(train_time_run)
# 获得列车到站时间
train_time_stop = i[train_time+6:train_time+11]
print(train_time_stop)
# 拿到列车车票信息
ticket_info = i[i.find(train_date):]
print(ticket_info)
# 根据列车首字母获得不同类型列车的车票信息
# 查找K字头列车车票
if(train_name[0] == 'K'):
K_TICKET = getTrainTicket_K(ticket_info)
if(len(K_TICKET)>0):
TICKET = TICKET + '\n' + train_name + '\n' + train_station_from + '-' + train_station_to + '\n' + train_time_run + '-' + train_time_stop + '\n' + K_TICKET
# 查找T字头列车车票
if(train_name[0] == 'T'):
T_TICKET = getTrainTicket_T(ticket_info)
if(len(T_TICKET)>0):
TICKET = TICKET + '\n' + train_name + '\n' + train_station_from + '-' + train_station_to + '\n' + train_time_run + '-' + train_time_stop + '\n' + T_TICKET
# 查找D字头列车车票
if(train_name[0] == 'D'):
D_TICKET = getTrainTicket_D(ticket_info)
if(len(D_TICKET)>0):
TICKET = TICKET + '\n' + train_name + '\n' + train_station_from + '-' + train_station_to + '\n' + train_time_run + '-' + train_time_stop + '\n' + D_TICKET
# 查找Z字头列车车票
if(train_name[0] == 'Z'):
Z_TICKET = getTrainTicket_Z(ticket_info)
if(len(Z_TICKET)>0):
TICKET = TICKET + '\n' + train_name + '\n' + train_station_from + '-' + train_station_to + '\n' + train_time_run + '-' + train_time_stop + '\n' + Z_TICKET
# 查找G字头列车车票
if(train_name[0] == 'G'):
G_TICKET = getTrainTicket_G(ticket_info)
if(len(G_TICKET)>0):
TICKET = TICKET + '\n' + train_name + '\n' + train_station_from + '-' + train_station_to + '\n' + train_time_run + '-' + train_time_stop + '\n' + G_TICKET
print("\n\n")
count += 1
TICKET = TICKET + '\n'
print(TICKET)
return TICKET
def getTrainTicket_K(ticket_info):
K_TICKET = ''
# 拿到软卧车票信息
soft_sleeper_start = 27
soft_sleeper_end = ticket_info.find('|',soft_sleeper_start)
soft_sleeper = ticket_info[soft_sleeper_start:soft_sleeper_end]
if(len(soft_sleeper)>0):
soft_sleeper_ticket = "软卧:" + soft_sleeper
K_TICKET = K_TICKET + soft_sleeper_ticket
# 获得无座车票信息
no_seat_start = soft_sleeper_end + 3
no_seat_end = ticket_info.find('|',no_seat_start)
no_seat = ticket_info[no_seat_start:no_seat_end]
if(len(no_seat)>0):
no_seat_ticket = "无座:" + no_seat
K_TICKET = K_TICKET + '\n' + no_seat_ticket
# 获得硬卧车票信息
hard_sleeper_start = no_seat_end + 2
hard_sleeper_end = ticket_info.find('|',hard_sleeper_start)
hard_sleeper = ticket_info[hard_sleeper_start:hard_sleeper_end]
if(len(hard_sleeper)>0):
hard_sleeper_ticket = "硬卧:" + hard_sleeper
K_TICKET = K_TICKET + '\n' + hard_sleeper_ticket
# 获得硬座车票信息
hard_seat_start = hard_sleeper_end + 1
hard_seat_end = ticket_info.find('|',hard_seat_start)
hard_seat = ticket_info[hard_seat_start:hard_seat_end]
if(len(hard_seat)>0):
hard_seat_ticket = "硬座:" + hard_seat
K_TICKET = K_TICKET + '\n' + hard_seat_ticket
return K_TICKET
def getTrainTicket_T(ticket_info):
T_TICKET = ''
# 获得高级软卧车票信息
special_soft_sleeper_start = 25
special_soft_sleeper_end = ticket_info.find('|',special_soft_sleeper_start)
special_soft_sleeper = ticket_info[special_soft_sleeper_start:special_soft_sleeper_end]
if(len(special_soft_sleeper)>0):
special_soft_sleeper_ticket = "高级软卧:" + special_soft_sleeper
T_TICKET = T_TICKET + special_soft_sleeper_ticket
# 获得其他信息
other_start = special_soft_sleeper_end + 1
other_end = ticket_info.find('|',other_start)
other = ticket_info[other_start:other_end]
if(len(other)>0):
other_ticket = "其他:" + other
T_TICKET = T_TICKET + '\n' + other_ticket
# 获得软卧车票信息
soft_sleeper_start = other_end + 1
soft_sleeper_end = ticket_info.find('|',soft_sleeper_start)
soft_sleeper = ticket_info[soft_sleeper_start:soft_sleeper_end]
soft_sleeper_ticket = "软卧:" + soft_sleeper
T_TICKET = T_TICKET + '\n' + soft_sleeper_ticket
# 获得无座车票信息
no_seat_start = soft_sleeper_end + 3
no_seat_end = ticket_info.find('|',no_seat_start)
no_seat = ticket_info[no_seat_start:no_seat_end]
no_seat_ticket = "无座:" + no_seat
T_TICKET = T_TICKET + '\n' + no_seat_ticket
# 获得硬卧车票信息
hard_sleeper_start = no_seat_end + 2
hard_sleeper_end = ticket_info.find('|',hard_sleeper_start)
hard_sleeper = ticket_info[hard_sleeper_start:hard_sleeper_end]
hard_sleeper_ticket = "硬卧:" + hard_sleeper
T_TICKET = T_TICKET + '\n' + hard_sleeper_ticket
# 获得硬座车票信息
hard_seat_start = hard_sleeper_end + 1
hard_seat_end = ticket_info.find('|',hard_seat_start)
hard_seat = ticket_info[hard_seat_start:hard_seat_end]
hard_seat_ticket = "硬座:" + hard_seat
T_TICKET = T_TICKET + '\n' + hard_seat_ticket
return T_TICKET
def getTrainTicket_D(ticket_info):
D_TICKET = ''
# 20180820|3|H6|03|09|1|0||无|||||无||||无|||无|A0F0O0O0|AFOO|0
# 获取高级软卧车票
special_soft_sleeper_start = 26
special_soft_sleeper_end = ticket_info.find('|',special_soft_sleeper_start)
special_soft_sleeper = ticket_info[special_soft_sleeper_start:special_soft_sleeper_end]
if(len(special_soft_sleeper)>0):
special_soft_sleeper_ticket = "高级软卧:" + special_soft_sleeper
D_TICKET = D_TICKET + special_soft_sleeper_ticket
# 获得软卧车票信息
soft_sleeper_start = special_soft_sleeper_end + 2
soft_sleeper_end = ticket_info.find('|',soft_sleeper_start)
soft_sleeper = ticket_info[soft_sleeper_start:soft_sleeper_end]
if(len(soft_sleeper)>0):
soft_sleeper_ticket = "软卧:" + soft_sleeper
D_TICKET = D_TICKET + '\n' + soft_sleeper_ticket
# 获得无座车票信息
no_seat_start = soft_sleeper_end + 2
no_seat_end = ticket_info.find('|',no_seat_start)
no_seat = ticket_info[no_seat_start:no_seat_end]
if(len(no_seat)>0):
no_seat_ticket = "无座:" + no_seat
D_TICKET = D_TICKET + '\n' + no_seat_ticket
# 获得二等座车票信息
second_seat_start = no_seat_end + 4
second_seat_end = ticket_info.find('|',second_seat_start)
second_seat = ticket_info[second_seat_start:second_seat_end]
if(len(second_seat)>0):
second_seat_ticket = "二等座:" + second_seat
D_TICKET = D_TICKET + '\n' + second_seat_ticket
# 获得一等座车票信息
first_seat_start = second_seat_end + 1
first_seat_end = ticket_info.find('|',first_seat_start)
first_seat = ticket_info[first_seat_start:first_seat_end]
if(len(first_seat)>0):
first_seat_ticket = "一等座:" + first_seat
D_TICKET = D_TICKET + '\n' + first_seat_ticket
# 获取动卧车票信息
D_sleeper_start = first_seat_end + 2
D_sleeper_end = ticket_info.find('|',D_sleeper_start)
D_sleeper = ticket_info[D_sleeper_start:D_sleeper_end]
if(len(D_sleeper)>0):
D_sleeper_ticket = "动卧:" + D_sleeper
D_TICKET = D_TICKET + '\n' + D_sleeper_ticket
return D_TICKET
def getTrainTicket_Z(ticket_info):
Z_TICKET = ''
# 获取高级软卧车票
special_soft_sleeper_start = 25
special_soft_sleeper_end = ticket_info.find('|',special_soft_sleeper_start)
special_soft_sleeper = ticket_info[special_soft_sleeper_start:special_soft_sleeper_end]
if(len(special_soft_sleeper)>0):
special_soft_sleeper_ticket = "高级软卧:" + special_soft_sleeper
Z_TICKET = Z_TICKET + special_soft_sleeper_ticket
print(special_soft_sleeper_ticket)
# 获得软卧车票信息
soft_sleeper_start = special_soft_sleeper_end + 2
# hard_sleeper_start = 27
soft_sleeper_end = ticket_info.find('|',soft_sleeper_start)
soft_sleeper = ticket_info[soft_sleeper_start:soft_sleeper_end]
if(len(soft_sleeper)>0):
soft_sleeper_ticket = "软卧:" + soft_sleeper
Z_TICKET = Z_TICKET + '\n' + soft_sleeper_ticket
# 获得软座车票信息
soft_seat_start = soft_sleeper_end + 1
soft_seat_end = ticket_info.find('|',soft_seat_start)
soft_seat = ticket_info[soft_seat_start:soft_seat_end]
if(len(soft_seat)>0):
soft_seat_ticket = "软座:" + soft_seat
Z_TICKET = Z_TICKET + '\n' + soft_seat_ticket
# 获得无座车票信息
no_seat_start = soft_seat_end + 2
no_seat_end = ticket_info.find('|',no_seat_start)
no_seat = ticket_info[no_seat_start:no_seat_end]
if(len(no_seat)>0):
no_seat_ticket = "无座:" + no_seat
Z_TICKET = Z_TICKET + '\n' + no_seat_ticket
# 获得硬卧车票信息
hard_sleeper_start = no_seat_end + 2
hard_sleeper_end = ticket_info.find('|',hard_sleeper_start)
hard_sleeper = ticket_info[hard_sleeper_start:hard_sleeper_end]
if(len(hard_sleeper)):
hard_sleeper_ticket = "硬卧:" + hard_sleeper
Z_TICKET = Z_TICKET + '\n' + hard_sleeper_ticket
# 获得硬座车票信息
hard_seat_start = hard_sleeper_end + 1
hard_seat_end = ticket_info.find('|',hard_seat_start)
hard_seat = ticket_info[hard_seat_start:hard_seat_end]
if(len(hard_seat)>0):
hard_seat_ticket = "硬座:" + hard_seat
Z_TICKET = Z_TICKET + '\n' + hard_seat_ticket
return Z_TICKET
def getTrainTicket_G(ticket_info):
G_TICKET = ''
# 获得二等座车票信息
second_seat_start = 34
second_seat_end = ticket_info.find('|',second_seat_start)
second_seat = ticket_info[second_seat_start:second_seat_end]
if(len(second_seat)>0):
second_seat_ticket = "二等座:" + second_seat
G_TICKET = G_TICKET + second_seat_ticket
else:
second_seat_ticket = "二等座:" + '-'
G_TICKET = G_TICKET + second_seat_ticket
# 获得一等座车票信息
first_seat_start = second_seat_end + 1
first_seat_end = ticket_info.find('|',first_seat_start)
first_seat = ticket_info[first_seat_start:first_seat_end]
first_seat_ticket = "一等座:" + first_seat
G_TICKET = G_TICKET + '\n' + first_seat_ticket
# 获得商务座/特等座车票信息
special_seat_start = first_seat_end + 1
special_seat_end = ticket_info.find('|',special_seat_start)
special_seat = ticket_info[special_seat_start:special_seat_end]
special_seat_ticket = "商务座:" + special_seat
G_TICKET = G_TICKET + '\n' + special_seat_ticket
return G_TICKET
# 邮件发送模块
def sendEmail(message):
# 这是原版
'''
mail_host = "smtp.qq.com"
mail_user = "" # 发送邮箱
mail_pass = "" # 发送邮箱对应的POP3/SMTP服务授权码
receivers = [] # 收件人可以有多个,以列表形式存放
# 在text中传入要发送的内容
text=message
#三个参数:第一个为内容第二个是文本格式第三个是utf-8编码
message = MIMEText(text, 'plain', 'utf-8')
message['From'] = '' # 邮件发送者
message['To'] = '' # 邮件接受者
subject = "Python"
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.ehlo()
smtpObj.starttls()
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print ("邮件发送成功")
except Exception:
print ("邮件发送失败")
time.sleep(60)
'''
# 这是简化版
user = "2917919207@qq.com"
pwd = "tnggxargxcoxecca"
mail_host = "smtp.qq.com"
# 这里得收件人可以有多个
receivers = ['2917919207@qq.com']
# 在text中传入要发送的内容
text=message
# 三个参数:第一个为内容第二个是文本格式第三个是utf-8编码
message = MIMEText(text, 'plain', 'utf-8')
# 发件人
message['From'] = user
# 收件人
message['To'] = "all users"
# 邮件标题
subject = "乘风查票小助手"
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.ehlo()
smtpObj.starttls()
smtpObj.login(user,pwd)
smtpObj.sendmail(user, receivers, message.as_string())
print ("邮件发送成功")
except Exception:
print ("邮件发送失败")
time.sleep(60)
if __name__ == '__main__':
main()
代码可以直接复制粘贴,把邮箱数据改成自己的就可以正常运行
依赖库的安装可以去请教度娘,我就不再废话了
发送邮件的邮箱需要打开POP3/SMTP服务,我这边做一个演示,这个只针对不懂得人,知道的可以忽略这一坨。。。。
1、打开QQ邮箱
2、打开“设置”里面的“账号”
3、然后找到这个POP3/SMTP服务的设置的地方
4、点击开启之后:
5、最后
最后,把这一堆字母复制到上面的发送模块的"pwd"里面,user是对应的邮箱账号,然后运行程序即可
程序运行之后,它会先发送一条当前查询到的车票信息,之后到了整点你也会收到它帮你查到的车票信息,嘿嘿。
哦对了,12306里面有自己的一套车站代码,要做12306车票余量查询必须要用到那个东西,但是那个东西稍微大一点,这里不好放,有兴趣的同学可以去公众号【AAAAA小世界】回复12306拿到车站代码
哦还有,要把拿到的车站代码txt文件和这个Python文件放在同一个文件夹下才可以哦。