def send_qr_image(nick_name): image_url = upload( '../qr_code.png') if not image_url: return url = 'https://oapi.dingtalk.com/robot/send?access_token={}'.format( global_config.getRaw('messenger', 'dingtalk_token')) payload = { "msgtype": "markdown", "markdown": { "title": "扫描二维码", "text": "#### %s,二维码失效 \n> ![screenshot](%s)\n> ###### 二维码失效重新登录 \n" % (nick_name, image_url) }, "at": { "atMobiles": [ "15860059910" ], "isAtAll": False } } headers = { 'User-Agent': global_config.getRaw('config', 'DEFAULT_USER_AGENT') } result = requests.post(url, json=payload, headers=headers) print(result.text)
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 submit_seckill_order(self): """提交抢购(秒杀)订单 :return: 抢购结果 True/False """ url = 'https://marathon.jd.com/seckillnew/orderService/pc/submitOrder.action' payload = { 'skuId': self.sku_id, } try: self.seckill_order_data[ self.sku_id] = self._get_seckill_order_data() except Exception as e: logger.info('抢购失败,无法获取生成订单的基本信息,接口返回:【{}】'.format(str(e))) return False logger.info('提交抢购订单...') headers = { 'User-Agent': self.user_agent, 'Host': 'marathon.jd.com', 'Referer': 'https://marathon.jd.com/seckill/seckill.action?skuId={0}&num={1}&rid={2}' .format(self.sku_id, self.seckill_num, int(time.time())), } resp = self.session.post(url=url, params=payload, data=self.seckill_order_data.get(self.sku_id), headers=headers) resp_json = None try: resp_json = parse_json(resp.text) except Exception as e: logger.info('抢购失败,返回信息:{}'.format(resp.text[0:128])) return False # 返回信息 # 抢购失败: # {'errorMessage': '很遗憾没有抢到,再接再厉哦。', 'orderId': 0, 'resultCode': 60074, 'skuId': 0, 'success': False} # {'errorMessage': '抱歉,您提交过快,请稍后再提交订单!', 'orderId': 0, 'resultCode': 60017, 'skuId': 0, 'success': False} # {'errorMessage': '系统正在开小差,请重试~~', 'orderId': 0, 'resultCode': 90013, 'skuId': 0, 'success': False} # 抢购成功: # {"appUrl":"xxxxx","orderId":820227xxxxx,"pcUrl":"xxxxx","resultCode":0,"skuId":0,"success":true,"totalMoney":"xxxxx"} if resp_json.get('success'): order_id = resp_json.get('orderId') total_money = resp_json.get('totalMoney') pay_url = 'https:' + resp_json.get('pcUrl') logger.info('抢购成功,订单号:{}, 总价:{}, 电脑端付款链接:{}'.format( order_id, total_money, pay_url)) if global_config.getRaw('messenger', 'enable') == 'true': success_message = "抢购成功,订单号:{}, 总价:{}, 电脑端付款链接:{}".format( order_id, total_money, pay_url) send_wechat(success_message) return True else: logger.info('抢购失败,返回信息:{}'.format(resp_json)) if global_config.getRaw('messenger', 'enable') == 'true': error_message = '抢购失败,返回信息:{}'.format(resp_json) send_wechat(error_message) return False
def send_wechat(message): """推送信息到微信""" url = 'http://sc.ftqq.com/{}.send'.format( global_config.getRaw('messenger', 'sckey')) payload = {"text": '抢购结果', "desp": message} headers = { 'User-Agent': global_config.getRaw('config', 'DEFAULT_USER_AGENT') } requests.get(url, params=payload, headers=headers)
def _get_seckill_order_data(self): """生成提交抢购订单所需的请求体参数 :return: 请求体参数组成的dict """ logger.info('生成提交抢购订单所需参数...') # 获取用户秒杀初始化信息 self.seckill_init_info[self.sku_id] = self._get_seckill_init_info() init_info = self.seckill_init_info.get(self.sku_id) if init_info is None: return False logger.info(f"输出init_info:{init_info}") # addr = {'addressDetail': '谭家岭东路2号 (审批服务中心)', 'addressName': '单位', 'areaCode': '86', 'cityId': 1158, 'cityName': '宁波市', 'countyId': 46345, 'countyName': '余姚市', 'defaultAddress': True, 'email': '', 'id': 843945282, 'mobile': '134****9880', 'mobileKey': '93b9f23b73966c2ac40fc3f9035b95b6', 'name': '陈云', 'overseas': 0, 'phone': '', 'postCode': '', 'provinceId': 15, 'provinceName': '浙江', 'townId': 52176, 'townName': '城区', 'yuyueAddress': False} default_address = init_info['addressList'][0] # 默认地址dict # default_address = addr # 默认地址dict invoice_info = init_info.get('invoiceInfo', {}) # 默认发票信息dict, 有可能不返回 token = init_info['token'] data = { 'skuId': self.sku_id, 'num': self.seckill_num, 'addressId': default_address['id'], # 'addressId': 843945282, 'yuShou': 'true', 'isModifyAddress': 'false', 'name': default_address['name'], 'provinceId': default_address['provinceId'], 'cityId': default_address['cityId'], 'countyId': default_address['countyId'], 'townId': default_address['townId'], 'addressDetail': default_address['addressDetail'], 'mobile': default_address['mobile'], 'mobileKey': default_address['mobileKey'], 'email': default_address.get('email', ''), 'postCode': '', 'invoiceTitle': invoice_info.get('invoiceTitle', -1), 'invoiceCompanyName': '', 'invoiceContent': invoice_info.get('invoiceContentType', 1), 'invoiceTaxpayerNO': '', 'invoiceEmail': '', 'invoicePhone': invoice_info.get('invoicePhone', ''), 'invoicePhoneKey': invoice_info.get('invoicePhoneKey', ''), 'invoice': 'true' if invoice_info else 'false', 'password': global_config.get('account', 'payment_pwd'), 'codTimeType': 3, 'paymentType': 4, 'areaCode': '', 'overseas': 0, 'phone': '', 'eid': global_config.getRaw('config', 'eid'), 'fp': global_config.getRaw('config', 'fp'), 'token': token, 'pru': '' } return data
def send_url_msg(title, url): """将登陆连接以Markdown发送至手机,点击后即可完成登陆""" # 获取钉钉消息信息 webhook = global_config.getRaw('messenger', 'webhook') secret = global_config.getRaw('messenger', 'secret') xiaoding = DingtalkChatbot(webhook, secret=secret) xiaoding.send_markdown( title=title, text="[%s](%s)" % (url, url) )
def upload(pat): from maotai.config import global_config key = uuid.uuid4() access_key = global_config.getRaw('upload', 'access_key') secret_key = global_config.getRaw('upload', 'secret_key') bucket_name = global_config.getRaw('upload', 'bucket_name') q = qiniu.Auth(access_key, secret_key) key = '%s.png' % key token = q.upload_token(bucket_name, key) ret, info = qiniu.put_file(token, key, pat) bucket_domain = 'file.clickear.top' base_url = 'https://%s/%s' % (bucket_domain, key) if ret is not None: return base_url
def _get_seckill_order_data(self): """生成提交抢购订单所需的请求体参数 :return: 请求体参数组成的dict """ logger.info('生成提交抢购订单所需参数...') # 获取用户秒杀初始化信息 self.seckill_init_info[self.sku_id] = self._get_seckill_init_info() init_info = self.seckill_init_info.get(self.sku_id) default_address = init_info['addressList'][0] # 默认地址dict invoice_info = init_info.get('invoiceInfo', {}) # 默认发票信息dict, 有可能不返回 token = init_info['token'] data = { 'skuId': self.sku_id, 'num': self.seckill_num, 'addressId': default_address['id'], 'yuShou': 'true', 'isModifyAddress': 'false', 'name': default_address['name'], 'provinceId': default_address['provinceId'], 'cityId': default_address['cityId'], 'countyId': default_address['countyId'], 'townId': default_address['townId'], 'addressDetail': default_address['addressDetail'], 'mobile': default_address['mobile'], 'mobileKey': default_address['mobileKey'], 'email': default_address.get('email', ''), 'postCode': '', 'invoiceTitle': invoice_info.get('invoiceTitle', -1), 'invoiceCompanyName': '', 'invoiceContent': invoice_info.get('invoiceContentType', 1), 'invoiceTaxpayerNO': '', 'invoiceEmail': '', 'invoicePhone': invoice_info.get('invoicePhone', ''), 'invoicePhoneKey': invoice_info.get('invoicePhoneKey', ''), 'invoice': 'true' if invoice_info else 'false', 'password': global_config.get('account', 'payment_pwd'), 'codTimeType': 3, 'paymentType': 4, 'areaCode': '', 'overseas': 0, 'phone': '', 'eid': global_config.getRaw('config', 'eid'), 'fp': global_config.getRaw('config', 'fp'), 'token': token, 'pru': '' } return data
def get_sku_title(self): """获取商品名称""" url = 'https://item.jd.com/{}.html'.format(global_config.getRaw('config', 'sku_id')) resp = self.session.get(url).content x_data = etree.HTML(resp) sku_title = x_data.xpath('/html/head/title/text()') return sku_title[0]
def local_time(self): """ 获取本地毫秒时间 :return: """ step_error_time_ms = global_config.getRaw('config', 'step_error_time_ms').__str__() return int(round(time.time() * 1000)) - int(step_error_time_ms)
def make_reserve(self): """商品预约""" logger.info('商品名称:{}'.format(self.get_sku_title())) url = 'https://yushou.jd.com/youshouinfo.action?' payload = { 'callback': 'fetchJSON', 'sku': self.sku_id, '_': str(int(time.time() * 1000)), } headers = { 'User-Agent': self.user_agent, 'Referer': 'https://item.jd.com/{}.html'.format(self.sku_id), } resp = self.session.get(url=url, params=payload, headers=headers) resp_json = parse_json(resp.text) reserve_url = resp_json.get('url') self.timers.start() while True: try: self.session.get(url='https:' + reserve_url) logger.info('预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约') if global_config.getRaw('messenger', 'enable') == 'true': success_message = "预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约" send_wechat(success_message) break except Exception as e: logger.error('预约失败正在重试...')
def __init__(self): self.spider_session = SpiderSession() self.spider_session.load_cookies_from_local() self.qrlogin = QrLogin(self.spider_session) # 初始化信息 self.sku_id = global_config.getRaw('config', 'sku_id') self.seckill_num = global_config.getRaw('config', 'seckill_num') self.seckill_init_info = dict() self.seckill_url = dict() self.seckill_order_data = dict() self.timers = Timer() self.session = self.spider_session.get_session() self.user_agent = self.spider_session.user_agent self.nick_name = None
def send_wechat(message): """推送信息到微信""" # url = 'http://sc.ftqq.com/{}.send'.format(global_config.getRaw('messenger', 'sckey')) # payload = { # "text": '抢购结果', # "desp": message # } url = 'https://oapi.dingtalk.com/robot/send?access_token={}'.format( global_config.getRaw('messenger', 'dingtalk_token')) payload = {"msgtype": "text", "text": {"content": message}} headers = { 'User-Agent': global_config.getRaw('config', 'DEFAULT_USER_AGENT') } result = requests.post(url, json=payload, headers=headers) print(result.text)
def __init__(self): self.spider_session = SpiderSession() self.spider_session.load_cookies_from_local() self.qrlogin = QrLogin(self.spider_session) # 初始化信息 self.sku_id = global_config.getRaw('config', 'sku_id') self.seckill_num = global_config.getRaw('config', 'seckill_num') self.seckill_init_info = dict() self.seckill_url = dict() self.seckill_order_data = dict() self.timers = Timer() self.session = self.spider_session.get_session() self.user_agent = self.spider_session.user_agent self.nick_name = None logger.info('商品名称:{}'.format(self.get_sku_title())) logger.info('商品url:{}'.format('https://item.jd.com/{}.html'.format( self.sku_id)))
def make_reserve(self): """商品预约""" logger.info('商品名称:{}'.format(self.get_sku_title())) url = 'https://yushou.jd.com/youshouinfo.action?' payload = { 'callback': 'fetchJSON', 'sku': self.sku_id, '_': str(int(time.time() * 1000)), } headers = { 'User-Agent': self.user_agent, 'Referer': 'https://item.jd.com/{}.html'.format(self.sku_id), } resp = self.session.get(url=url, params=payload, headers=headers) resp_json = parse_json(resp.text) reserve_url = resp_json.get('url') resp.raise_for_status() self.timers.start() retry_time = 3 is_reserve_ok = false while retry_time > 0: retry_time -= 1 try: resp = self.session.get(url='https:' + reserve_url) if resp.status_code != 200: logger.error("预约请求失败:{}, 重试中....".format( resp.status_code)) continue logger.info('预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约') is_reserve_ok = True if global_config.getRaw('messenger', 'enable') == 'true': success_message = "预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约" send_wechat(success_message) break except Exception as e: logger.error('预约失败正在重试...') if not is_reserve_ok: logger.error('预约失败...') return is_reserve_ok
def __init__(self): self.cookies_dir_path = "./cookies/" self.user_agent = global_config.getRaw('config', 'DEFAULT_USER_AGENT') self.session = self._init_session()
def send_text_msg(message): """推送消息到钉钉""" webhook = global_config.getRaw('messenger', 'webhook') secret = global_config.getRaw('messenger', 'secret') xiaoding = DingtalkChatbot(webhook, secret=secret) xiaoding.send_text(msg=message)
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__() relogin_time_everyday = global_config.getRaw('config', 'relogin_time').__str__() # 最后购买时间 self.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") logger.info("最后购买时间:%s" % self.last_purchase_time) 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") relogin_time_config = datetime.strptime( localtime.tm_year.__str__() + '-' + localtime.tm_mon.__str__() + '-' + localtime.tm_mday.__str__() + ' ' + relogin_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 self.relogin_time = relogin_time_config # elif time.mktime(localtime) > time.mktime(self.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 = 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") self.relogin_time = datetime.strptime( localtime.tm_year.__str__() + '-' + localtime.tm_mon.__str__() + '-' + (localtime.tm_mday + 1).__str__() + ' ' + relogin_time_everyday, "%Y-%m-%d %H:%M:%S.%f") # self.buy_time = buy_time_config logger.info("开始购买时间:{}".format(self.buy_time)) logger.info("重新登陆时间:{}".format(self.relogin_time)) self.buy_time_ms = int( time.mktime(self.buy_time.timetuple()) * 1000.0 + self.buy_time.microsecond / 1000) self.relogin_ms = int( time.mktime(self.relogin_time.timetuple()) * 1000.0 + self.relogin_time.microsecond / 1000) self.sleep_interval = sleep_interval self.diff_time = self.local_jd_time_diff() seckill_duration_ms = int( global_config.getRaw('config', 'seckill_duration_ms')) self.buy_endtime_ms = self.buy_time_ms + seckill_duration_ms logger.info("抢购结束时间ms: {}".format(self.buy_endtime_ms))