|
@@ -0,0 +1,105 @@
|
|
|
+#!/usr/bin/env python
|
|
|
+# -*- encoding: utf-8 -*-
|
|
|
+'''
|
|
|
+@Contact : liuyuqi.gov@msn.cn
|
|
|
+@Time : 2023/07/11 20:25:17
|
|
|
+@License : Copyright © 2017-2022 liuyuqi. All Rights Reserved.
|
|
|
+@Desc :
|
|
|
+
|
|
|
+'''
|
|
|
+import argparse,time,json
|
|
|
+from email.mime.text import MIMEText
|
|
|
+from email.header import Header
|
|
|
+import os,sys,re,configparser,logging,requests
|
|
|
+import smtplib,random
|
|
|
+from fuck12306 import api
|
|
|
+
|
|
|
+class Crawl12306:
|
|
|
+ ''' 12306 抢票助手 '''
|
|
|
+ def __init__(self):
|
|
|
+ self.sess=requests.Session()
|
|
|
+ self.args=self.get_args()
|
|
|
+ self.conf=self.get_conf()
|
|
|
+
|
|
|
+ def get_conf(self)->dict:
|
|
|
+ ''' read config.ini and return a dict'''
|
|
|
+ cf = configparser.ConfigParser()
|
|
|
+ cf.read("conf/config.ini")
|
|
|
+ return cf
|
|
|
+
|
|
|
+ def get_args(self):
|
|
|
+ parser=argparse.ArgumentParser(description='12306 抢票助手')
|
|
|
+ parser.add_argument('-d','--date',help='出发日期')
|
|
|
+ parser.add_argument('-f','--from',help='出发地')
|
|
|
+ parser.add_argument('-t','--to',help='目的地')
|
|
|
+ parser.add_argument('-m','--mail',help='接收通知的邮箱')
|
|
|
+ parser.add_argument('-c','--config',help='配置文件')
|
|
|
+ return parser.parse_args()
|
|
|
+
|
|
|
+ def get_code_pic(self, number=100):
|
|
|
+ ''' get code picture '''
|
|
|
+ print("............... get code pic ...........")
|
|
|
+ for i in range(number):
|
|
|
+ res= self.sess.get(api.pic_url)
|
|
|
+ time.sleep(random.randint(3,5))
|
|
|
+ if res.status_code == 200:
|
|
|
+ with open("data/pic/pic_%s%s.png" % (int(time.time(),i),), "wb") as file:
|
|
|
+ file.write(res.content)
|
|
|
+
|
|
|
+ # 监控余票
|
|
|
+ def monitor(self):
|
|
|
+ print("余票监控中...")
|
|
|
+ while True:
|
|
|
+ try:
|
|
|
+ res=self.sess.get(self.conf["url"]["left_ticket_url"])
|
|
|
+ if res.status_code == 200:
|
|
|
+ j = json.loads(r.text)
|
|
|
+ k = j['data']
|
|
|
+ str1 = ""
|
|
|
+ strData = ["G6305","D7501","G6325","D7521","D7533","D7529","D2381","G6337","D7525","G6321","D7513","G6313","G1607","G6309","D7533","D7517","G6329","D7505","G6345","G6341"]
|
|
|
+
|
|
|
+ for r in k['result']:
|
|
|
+ for cs in strData:
|
|
|
+ if "|" + cs+"|" in r:
|
|
|
+ if r.split('|')[-7] != '无': #二等座
|
|
|
+ str1 = str1 + cs + ',有票啦~~\n'
|
|
|
+ if len(str1)>5:
|
|
|
+ print(str1)
|
|
|
+ self.send_mail(str1)
|
|
|
+
|
|
|
+
|
|
|
+ sys.stdout.write('\r')
|
|
|
+ sys.stdout.write('已查询%d次~' % self.num)
|
|
|
+ sys.stdout.flush()
|
|
|
+ self.num+=1
|
|
|
+ else:
|
|
|
+ self.send_mail("获取车票信息失败~~")
|
|
|
+ except Exception as e:
|
|
|
+ pass
|
|
|
+ finally:
|
|
|
+ pass
|
|
|
+ time.sleep(5,10)
|
|
|
+ self.send_mail('有票了')
|
|
|
+
|
|
|
+ def send_mail(self,content:str):
|
|
|
+ message = MIMEText(content, 'plain', 'utf-8')
|
|
|
+ message['From'] = Header("肥肥", 'utf-8')
|
|
|
+ message['To'] = Header("圆圆", 'utf-8')
|
|
|
+ message['Subject'] = Header("余票提醒", 'utf-8')
|
|
|
+ try:
|
|
|
+ smtpObj = smtplib.SMTP()
|
|
|
+ smtpObj.connect(self.conf["mail"]["host"], 25) # 25 为 SMTP 端口号
|
|
|
+ smtpObj.login(self.conf["mail"]["user"], self.conf["mail"]["password"])
|
|
|
+ smtpObj.sendmail(self.conf["mail"]["sender"], self.conf["mail"]["receiver"], message.as_string())
|
|
|
+ print("邮件发送成功")
|
|
|
+ except Exception as e:
|
|
|
+ print("Error: 无法发送邮件")
|
|
|
+ finally:
|
|
|
+ pass
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def check_update():
|
|
|
+ ''' check application update '''
|
|
|
+ pass
|
|
|
+
|
|
|
+
|