forked from phoniex628/jd_maotai_seckill
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtimer.py
81 lines (68 loc) · 3.06 KB
/
timer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# -*- coding:utf-8 -*-
import time
import requests
import json
from datetime import datetime
from jd_logger import logger
from config import global_config
class Timer(object):
def __init__(self, sleep_interval=0.5):
# '2018-09-28 22:45:50.000'
# buy_time = 2020-12-22 09:59:59.500
localtime = time.localtime(time.time())
buy_time_everyday = global_config.getRaw('config', 'buy_time').__str__()
last_purchase_time_everyday = global_config.getRaw('config', 'last_purchase_time').__str__()
# 最后购买时间
last_purchase_time = datetime.strptime(
localtime.tm_year.__str__() + '-' + localtime.tm_mon.__str__() + '-' + localtime.tm_mday.__str__() + ' ' + last_purchase_time_everyday,
"%Y-%m-%d %H:%M:%S.%f")
buy_time_config = datetime.strptime(
localtime.tm_year.__str__() + '-' + localtime.tm_mon.__str__() + '-' + localtime.tm_mday.__str__() + ' ' + buy_time_everyday,
"%Y-%m-%d %H:%M:%S.%f")
if time.mktime(localtime) < time.mktime(buy_time_config.timetuple()):
# 取正确的购买时间
self.buy_time = buy_time_config
elif time.mktime(localtime) > time.mktime(last_purchase_time.timetuple()):
# 取明天的时间 购买时间
self.buy_time = datetime.strptime(
localtime.tm_year.__str__() + '-' + localtime.tm_mon.__str__() + '-' + (
localtime.tm_mday + 1).__str__() + ' ' + buy_time_everyday,
"%Y-%m-%d %H:%M:%S.%f")
else:
# 直接是购买时间
self.buy_time = buy_time_config
print("购买时间:{}".format(self.buy_time))
self.buy_time_ms = int(time.mktime(self.buy_time.timetuple()) * 1000.0 + self.buy_time.microsecond / 1000)
self.sleep_interval = sleep_interval
self.diff_time = self.local_jd_time_diff()
def jd_time(self):
"""
从京东服务器获取时间毫秒
:return:
"""
url = 'https://a.jd.com//ajax/queryServerData.html'
ret = requests.get(url).text
js = json.loads(ret)
return int(js["serverTime"])
def local_time(self):
"""
获取本地毫秒时间
:return:
"""
return int(round(time.time() * 1000))
def local_jd_time_diff(self):
"""
计算本地与京东服务器时间差
:return:
"""
return self.local_time() - self.jd_time()
def start(self):
logger.info('正在等待到达设定时间:{},检测本地时间与京东服务器时间误差为【{}】毫秒'.format(self.buy_time, self.diff_time))
while True:
# 本地时间减去与京东的时间差,能够将时间误差提升到0.1秒附近
# 具体精度依赖获取京东服务器时间的网络时间损耗
if self.local_time() - self.diff_time >= self.buy_time_ms:
logger.info('时间到达,开始执行……')
break
else:
time.sleep(self.sleep_interval)