diff --git a/Pipfile b/Pipfile index 4e01d0a..6ba758a 100644 --- a/Pipfile +++ b/Pipfile @@ -12,6 +12,7 @@ redis = "*" tortoise-orm = "==0.15.4" aiohttp = "*" aioredis = "*" +aiomysql = "*" [requires] python_version = "3.6" diff --git a/Pipfile.lock b/Pipfile.lock index 1ba8704..49060ea 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "2713e1b835a5e2c4ba46b3b038c7920be9dc5d168ac1b3f5727dc529637ba35b" + "sha256": "66b4286bb6eb49e7de326a6a02aa8bec298691068e41d9b73dd28ab3e6c044df" }, "pipfile-spec": 6, "requires": { @@ -34,6 +34,14 @@ "index": "pypi", "version": "==3.6.2" }, + "aiomysql": { + "hashes": [ + "sha256:5fd798481f16625b424eec765c56d712ac78a51f3bd0175a3de94107aae43307", + "sha256:d89ce25d44dadb43cf2d9e4603bd67b7a0ad12d5e67208de013629ba648df2ba" + ], + "index": "pypi", + "version": "==0.0.20" + }, "aioredis": { "hashes": [ "sha256:15f8af30b044c771aee6787e5ec24694c048184c7b9e54c3b60c750a4b93273a", @@ -62,6 +70,44 @@ ], "version": "==19.3.0" }, + "cffi": { + "hashes": [ + "sha256:0b49274afc941c626b605fb59b59c3485c17dc776dc3cc7cc14aca74cc19cc42", + "sha256:0e3ea92942cb1168e38c05c1d56b0527ce31f1a370f6117f1d490b8dcd6b3a04", + "sha256:135f69aecbf4517d5b3d6429207b2dff49c876be724ac0c8bf8e1ea99df3d7e5", + "sha256:19db0cdd6e516f13329cba4903368bff9bb5a9331d3410b1b448daaadc495e54", + "sha256:2781e9ad0e9d47173c0093321bb5435a9dfae0ed6a762aabafa13108f5f7b2ba", + "sha256:291f7c42e21d72144bb1c1b2e825ec60f46d0a7468f5346841860454c7aa8f57", + "sha256:2c5e309ec482556397cb21ede0350c5e82f0eb2621de04b2633588d118da4396", + "sha256:2e9c80a8c3344a92cb04661115898a9129c074f7ab82011ef4b612f645939f12", + "sha256:32a262e2b90ffcfdd97c7a5e24a6012a43c61f1f5a57789ad80af1d26c6acd97", + "sha256:3c9fff570f13480b201e9ab69453108f6d98244a7f495e91b6c654a47486ba43", + "sha256:415bdc7ca8c1c634a6d7163d43fb0ea885a07e9618a64bda407e04b04333b7db", + "sha256:42194f54c11abc8583417a7cf4eaff544ce0de8187abaf5d29029c91b1725ad3", + "sha256:4424e42199e86b21fc4db83bd76909a6fc2a2aefb352cb5414833c030f6ed71b", + "sha256:4a43c91840bda5f55249413037b7a9b79c90b1184ed504883b72c4df70778579", + "sha256:599a1e8ff057ac530c9ad1778293c665cb81a791421f46922d80a86473c13346", + "sha256:5c4fae4e9cdd18c82ba3a134be256e98dc0596af1e7285a3d2602c97dcfa5159", + "sha256:5ecfa867dea6fabe2a58f03ac9186ea64da1386af2159196da51c4904e11d652", + "sha256:62f2578358d3a92e4ab2d830cd1c2049c9c0d0e6d3c58322993cc341bdeac22e", + "sha256:6471a82d5abea994e38d2c2abc77164b4f7fbaaf80261cb98394d5793f11b12a", + "sha256:6d4f18483d040e18546108eb13b1dfa1000a089bcf8529e30346116ea6240506", + "sha256:71a608532ab3bd26223c8d841dde43f3516aa5d2bf37b50ac410bb5e99053e8f", + "sha256:74a1d8c85fb6ff0b30fbfa8ad0ac23cd601a138f7509dc617ebc65ef305bb98d", + "sha256:7b93a885bb13073afb0aa73ad82059a4c41f4b7d8eb8368980448b52d4c7dc2c", + "sha256:7d4751da932caaec419d514eaa4215eaf14b612cff66398dd51129ac22680b20", + "sha256:7f627141a26b551bdebbc4855c1157feeef18241b4b8366ed22a5c7d672ef858", + "sha256:8169cf44dd8f9071b2b9248c35fc35e8677451c52f795daa2bb4643f32a540bc", + "sha256:aa00d66c0fab27373ae44ae26a66a9e43ff2a678bf63a9c7c1a9a4d61172827a", + "sha256:ccb032fda0873254380aa2bfad2582aedc2959186cce61e3a17abc1a55ff89c3", + "sha256:d754f39e0d1603b5b24a7f8484b22d2904fa551fe865fd0d4c3332f078d20d4e", + "sha256:d75c461e20e29afc0aee7172a0950157c704ff0dd51613506bd7d82b718e7410", + "sha256:dcd65317dd15bc0451f3e01c80da2216a31916bdcffd6221ca1202d96584aa25", + "sha256:e570d3ab32e2c2861c4ebe6ffcad6a8abf9347432a37608fe1fbd157b3f0036b", + "sha256:fd43a88e045cf992ed09fa724b5315b790525f2676883a6ea64e3263bae6549d" + ], + "version": "==1.13.2" + }, "chardet": { "hashes": [ "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", @@ -75,6 +121,32 @@ ], "version": "==2.1.2" }, + "cryptography": { + "hashes": [ + "sha256:02079a6addc7b5140ba0825f542c0869ff4df9a69c360e339ecead5baefa843c", + "sha256:1df22371fbf2004c6f64e927668734070a8953362cd8370ddd336774d6743595", + "sha256:369d2346db5934345787451504853ad9d342d7f721ae82d098083e1f49a582ad", + "sha256:3cda1f0ed8747339bbdf71b9f38ca74c7b592f24f65cdb3ab3765e4b02871651", + "sha256:44ff04138935882fef7c686878e1c8fd80a723161ad6a98da31e14b7553170c2", + "sha256:4b1030728872c59687badcca1e225a9103440e467c17d6d1730ab3d2d64bfeff", + "sha256:58363dbd966afb4f89b3b11dfb8ff200058fbc3b947507675c19ceb46104b48d", + "sha256:6ec280fb24d27e3d97aa731e16207d58bd8ae94ef6eab97249a2afe4ba643d42", + "sha256:7270a6c29199adc1297776937a05b59720e8a782531f1f122f2eb8467f9aab4d", + "sha256:73fd30c57fa2d0a1d7a49c561c40c2f79c7d6c374cc7750e9ac7c99176f6428e", + "sha256:7f09806ed4fbea8f51585231ba742b58cbcfbfe823ea197d8c89a5e433c7e912", + "sha256:90df0cc93e1f8d2fba8365fb59a858f51a11a394d64dbf3ef844f783844cc793", + "sha256:971221ed40f058f5662a604bd1ae6e4521d84e6cad0b7b170564cc34169c8f13", + "sha256:a518c153a2b5ed6b8cc03f7ae79d5ffad7315ad4569b2d5333a13c38d64bd8d7", + "sha256:b0de590a8b0979649ebeef8bb9f54394d3a41f66c5584fff4220901739b6b2f0", + "sha256:b43f53f29816ba1db8525f006fa6f49292e9b029554b3eb56a189a70f2a40879", + "sha256:d31402aad60ed889c7e57934a03477b572a03af7794fa8fb1780f21ea8f6551f", + "sha256:de96157ec73458a7f14e3d26f17f8128c959084931e8997b9e655a39c8fde9f9", + "sha256:df6b4dca2e11865e6cfbfb708e800efb18370f5a46fd601d3755bc7f85b3a8a2", + "sha256:ecadccc7ba52193963c0475ac9f6fa28ac01e01349a2ca48509667ef41ffd2cf", + "sha256:fb81c17e0ebe3358486cd8cc3ad78adbae58af12fc2bf2bc0bb84e8090fa5ce8" + ], + "version": "==2.8" + }, "hiredis": { "hashes": [ "sha256:01b577f84c20ecc9c07fc4c184231b08e3c3942de096fa99978e053de231c423", @@ -149,6 +221,20 @@ ], "version": "==4.7.3" }, + "pycparser": { + "hashes": [ + "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3", + "sha256:fdbae4e6f505ece28ab3b96f5c103a1d87e42845d249c33a097f14abb2bdad3e" + ], + "version": "==2.19" + }, + "pymysql": { + "hashes": [ + "sha256:95f057328357e0e13a30e67857a8c694878b0175797a9a203ee7adbfb9b1ec5f", + "sha256:9ec760cbb251c158c19d6c88c17ca00a8632bac713890e465b2be01fdc30713f" + ], + "version": "==0.9.2" + }, "pypika": { "hashes": [ "sha256:a4d80829a065047c39b7838aafb440761bd9a306977c0e6f78caf5eaa056c9e4" @@ -163,6 +249,13 @@ "index": "pypi", "version": "==3.3.11" }, + "six": { + "hashes": [ + "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", + "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" + ], + "version": "==1.13.0" + }, "toml": { "hashes": [ "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", diff --git a/config.toml.example b/config.toml.example index 75e8974..493c57b 100644 --- a/config.toml.example +++ b/config.toml.example @@ -1,13 +1,21 @@ [app] -env = "dev" +env = 'dev' debug = true query_interval = 1.5 # 查询间隔 [web] # Comming soon. -ip = "0.0.0.0" +ip = '0.0.0.0' port = 8081 +[db] +engine = 'sqlite' # 默认使用 sqlite,支持 mysql +# host = '127.0.0.1' +# port = 3306 +# user = 'user' +# password = 'password' +# database = 'py12306' + [[user]] enable = true id = 1 # 用户唯一 Id,数字,不可重复 @@ -18,31 +26,31 @@ password = 'your 12306 password' [[query]] id = 1 user_id = 1 -left_dates = ["2020-01-25", "2019-01-26"] -members = ["宝玉", "宝钗"] +left_dates = ['2020-01-25', '2019-01-26'] +members = ['宝玉', '宝钗'] seats = ['硬卧', '硬座'] -train_numbers = ["K356", "K1172", "K4184"] +train_numbers = ['K356', 'K1172', 'K4184'] stations = ['北京', '深圳'] [[query]] enable = true # 是否启用,默认启用 id = 2 user_id = 0 # 将会使用指定的用户下单 -left_dates= [ "2020-01-25", "2020-01-26" ] # 出发日期 :Array +left_dates= [ '2020-01-25', '2020-01-26' ] # 出发日期 stations = ['北京', '深圳', '北京', '广州'] # 车站 支持多个车站同时查询 -members = [ "宝玉", "黛玉" ] # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['贾琏', '贾琏'] +members = [ '宝玉', '黛玉' ] # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['贾琏', '贾琏'] allow_less_member = false # 是否允许余票不足时提交部分乘客 seats = [ '硬卧', '硬座' ] # 筛选座位 有先后顺序 可用值: 一等座, 二等座, 商务座, 特等座, 硬座, 软座, 硬卧, 二等卧, 软卧, 一等卧, 高级软卧, 动卧, 高级动卧, 无座 -train_numbers = [ "K356", "K1172", "K4184" ] # 筛选车次 可以为空,为空则所有车次都可以提交 如 [] +train_numbers = [ 'K356', 'K1172', 'K4184' ] # 筛选车次 可以为空,为空则所有车次都可以提交 如 [] except_train_numbers = [] # 筛选车次,排除车次 train_numbers 和 except_train_numbers 不可同时存在 periods = ['00:00','24:00'] # 筛选时间 [redis] enable = false -host = "127.0.0.1" +host = '127.0.0.1' port = 6379 db = 1 -password = "" +password = '' [proxy] enable = false @@ -53,12 +61,12 @@ url = 'http://127.0.0.1:8081/get_ip?&rule=12306' [notifaction.ding_talk] # 钉钉通知 使用说明 https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq enable = true -access_token = "" +access_token = '' [notifaction.bark] # Bark 推送到ios设备 参考 https://www.v2ex.com/t/467407 enable = false -push_url = "" +push_url = '' [notifaction.email] # 邮箱配置 diff --git a/py12306/app/app.py b/py12306/app/app.py index 5ea8bea..b4dfe95 100644 --- a/py12306/app/app.py +++ b/py12306/app/app.py @@ -34,8 +34,7 @@ class ConfigInstance: 'host': '127.0.0.1', 'port': 6379, 'db': 0, 'password': None, 'decode_responses': True } DATABASE = { - 'engine': 'sqlite', # or mysql - 'url': f'sqlite://{DATA_DIR}db.sqlite3', + 'db_url': f'sqlite://{DATA_DIR}db.sqlite3', } Notifaction = {} @@ -52,6 +51,10 @@ class ConfigInstance: configs = toml.load(file_path) self._configs = SuperDict(configs) self.REDIS.update(configs.get('redis', {})) + db = configs.get('db', {}) + if db and not db.get('db_url'): + db['db_url'] = f"{db.get('engine')}://{db.get('user')}:{db.get('password')}@{db.get('host')}:{db.get('port')}/{db.get('database')}" + self.DATABASE.update(configs.get('db', {})) self.DEBUG = self._configs.get('app.debug', self.DEBUG) self.Notifaction: dict = self._configs.get('notifaction', self.Notifaction) return self @@ -125,7 +128,7 @@ class App: async def init_db(self): await Tortoise.init( - db_url=Config.DATABASE['url'], + db_url=Config.DATABASE['db_url'], modules={'models': ['app.models']}) # Generate the schema await Tortoise.generate_schemas() diff --git a/py12306/app/models.py b/py12306/app/models.py index f3826cf..b8a66c4 100644 --- a/py12306/app/models.py +++ b/py12306/app/models.py @@ -220,7 +220,7 @@ class Ticket(TimestampMixin, BaseModel): left_station = fields.CharField(default='', max_length=255) arrive_station = fields.CharField(default='', max_length=255) order_text = fields.CharField(default='', max_length=255) - secret_str = fields.CharField(default='', max_length=255) + secret_str = fields.CharField(default='', max_length=1000) left_time = fields.CharField(default='', max_length=255) arrive_time = fields.CharField(default='', max_length=255) # { 'name': seat, 'id': seat_id, 'raw': raw, 'order_id': TrainSeat.order_id[seat] } diff --git a/py12306/app/order.py b/py12306/app/order.py index ce8612b..e77c462 100644 --- a/py12306/app/order.py +++ b/py12306/app/order.py @@ -358,6 +358,7 @@ class OrderTicket: else: pass Logger.info(f'第 {wait_count} 次排队,请耐心等待') + await asyncio.sleep(1) return False