提交 f3c31eb5 编写于 作者: C cycz

v2版本

上级 20a05bb0
......@@ -17,6 +17,8 @@
避免抢购,程序自动一次只买一件
V2版本 不需要添加url,只需要加入商品id、地区id。刷新更加频繁更快。
地区id不知道如何获取的使用AreaTool.py
## 版本
- [x] python3
......@@ -27,6 +29,7 @@
- [x] 邮件通知
## 更新记录
- 【2020.02.06】V2版本,刷新更快更频繁,通过配置文件添加商品和地区id。
- 【2020.02.06】提交失败之后会继续不会暂停。
- 【2020.02.06】购物车有套装商品导致解析skuid错误。
- 【2020.02.05】商品有货,但是该商品已下柜,提交会报错,对部分代码进行了优化。
......
[config]
# skuids 英文逗号[,]相隔 (分清楚英文和中文逗号)
skuids =65437208345,7498169,26883451883
# 地区id (不知道怎么获取的使用一下AreaTool.py工具)
area =19_1607_4773_0
# cookie
cookies_String =__jdv=122270672xxxxxxx
# mail
mail = xxxxxx@qq.com
# 支付密码
# 如果你的账户中有可用的京券(注意不是东券)或 在上次购买订单中使用了京豆,
# 那么京东可能会在下单时自动选择京券支付 或 自动勾选京豆支付。
# 此时下单会要求输入六位数字的支付密码。请在下方配置你的支付密码,如 123456 。
# 如果没有上述情况,下方请留空。
payment_pwd =
eid =
fp =
\ No newline at end of file
# -*- coding: utf-8 -*-
import os
import configparser
class Config(object):
def __init__(self, config_file='config.ini'):
self._path = os.path.join(os.getcwd(), config_file)
if not os.path.exists(self._path):
raise FileNotFoundError("No such file: config.ini")
self._config = configparser.ConfigParser()
self._config.read(self._path, encoding='utf-8')
self._configRaw = configparser.RawConfigParser()
self._configRaw.read(self._path, encoding='utf-8')
def get(self, section, name):
return self._config.get(section, name)
def getRaw(self, section, name):
return self._configRaw.get(section, name)
global_config = Config()
......@@ -3,30 +3,29 @@
京东抢购口罩程序
'''
import requests
import logging
import logging.handlers
import time
import json
import sys
import random
from bs4 import BeautifulSoup
from log.jdlogger import logger
from jdemail.jdEmail import sendMail
'''
需要修改
'''
# cookie 网页获取
cookies_String = 'xxxxxx'
cookies_String = 'xxxxxxx'
# 有货通知 收件邮箱
mail = 'xxxxxx@qq.com'
# 商品的url
url = [
'https://c0.3.cn/stock?skuId=1336984&area=19_1607_4773_0&venderId=1000078145&buyNum=1&choseSuitSkuIds=&cat=9192,12190,1517&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=1580535906442142991701&ch=1&callback=jQuery6715489',
'https://c0.3.cn/stock?skuId=4642656&area=19_1607_4773_0&venderId=1000006724&buyNum=1&choseSuitSkuIds=&cat=9192,12190,1517&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=1580535906442142991701&ch=1&callback=jQuery4552086',
'https://c0.3.cn/stock?skuId=65466451629&area=19_1607_4773_0&venderId=127922&buyNum=1&choseSuitSkuIds=&cat=9855,9858,9924&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=1580535906442142991701&ch=1&callback=jQuery2790674',
'https://c0.3.cn/stock?skuId=65437208345&area=19_1607_4773_0&venderId=127922&buyNum=1&choseSuitSkuIds=&cat=9855,9858,9924&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=1580535906442142991701&ch=1&callback=jQuery1749958',
'https://c0.3.cn/stock?skuId=7498169&area=19_1607_4773_0&venderId=1000128491&buyNum=1&choseSuitSkuIds=&cat=9855,9858,9924&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=15631231857651045904648&ch=1&callback=jQuery4102801',
'https://c0.3.cn/stock?skuId=7498165&area=19_1607_4773_0&venderId=1000128491&buyNum=1&choseSuitSkuIds=&cat=9855,9858,9924&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=15631231857651045904648&ch=1&callback=jQuery9614479',
# 'https://c0.3.cn/stock?skuId=1336984&area=19_1607_4773_0&venderId=1000078145&buyNum=1&choseSuitSkuIds=&cat=9192,12190,1517&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=1580535906442142991701&ch=1&callback=jQuery6715489',
# 'https://c0.3.cn/stock?skuId=4642656&area=19_1607_4773_0&venderId=1000006724&buyNum=1&choseSuitSkuIds=&cat=9192,12190,1517&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=1580535906442142991701&ch=1&callback=jQuery4552086',
# 'https://c0.3.cn/stock?skuId=65466451629&area=19_1607_4773_0&venderId=127922&buyNum=1&choseSuitSkuIds=&cat=9855,9858,9924&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=1580535906442142991701&ch=1&callback=jQuery2790674',
# 'https://c0.3.cn/stock?skuId=65437208345&area=19_1607_4773_0&venderId=127922&buyNum=1&choseSuitSkuIds=&cat=9855,9858,9924&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=1580535906442142991701&ch=1&callback=jQuery1749958',
# 'https://c0.3.cn/stock?skuId=7498169&area=19_1607_4773_0&venderId=1000128491&buyNum=1&choseSuitSkuIds=&cat=9855,9858,9924&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=15631231857651045904648&ch=1&callback=jQuery4102801',
# 'https://c0.3.cn/stock?skuId=7498165&area=19_1607_4773_0&venderId=1000128491&buyNum=1&choseSuitSkuIds=&cat=9855,9858,9924&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=15631231857651045904648&ch=1&callback=jQuery9614479',
'https://c0.3.cn/stock?skuId=7263128&area=19_1607_4773_0&venderId=1000128491&buyNum=1&choseSuitSkuIds=&cat=9855,9858,9924&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=15631231857651045904648&ch=1&callback=jQuery8872960',
# 'https://c0.3.cn/stock?skuId=1739089&area=19_1607_4773_0&venderId=1000017287&buyNum=1&choseSuitSkuIds=&cat=15248,15250,15278&extraParam={%22originid%22:%221%22}&fqsp=0&pdpin=jd_7c3992aa27d1a&pduid=1580535906442142991701&ch=1&callback=jQuery4479703'
]
......@@ -46,68 +45,6 @@ session.headers = {
"Connection": "keep-alive"
}
manual_cookies = {}
'''
日志模块
'''
LOG_FILENAME = 'jdBuyMask.log'
logger = logging.getLogger()
def set_logger():
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
file_handler = logging.handlers.RotatingFileHandler(
LOG_FILENAME, maxBytes=10485760, backupCount=5, encoding="utf-8")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
set_logger()
'''
发送邮件模块
'''
def sendMail(url, isOrder):
import smtplib
from email.mime.text import MIMEText
# email 用于构建邮件内容
from email.header import Header
# 用于构建邮件头
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = '838143144@qq.com'
password = 'alpsneahzhawbfgj'
# 收信方邮箱
to_addr = mail
# 发信服务器
smtp_server = 'smtp.qq.com'
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
if isOrder:
msg = MIMEText(url + ' 类型口罩,已经下单了。24小时内付款', 'plain', 'utf-8')
else:
msg = MIMEText(url + ' 类型口罩,下单失败了,快去抢购!', 'plain', 'utf-8')
# 邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('有口罩啦')
# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL(host=smtp_server)
server.connect(smtp_server, 465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())
# 关闭服务器
server.quit()
def get_tag_value(tag, key='', index=0):
......@@ -226,7 +163,7 @@ def cart_detail():
for item in soup.find_all(class_='item-item'):
try:
sku_id = item['skuid'] # 商品id
except Exception as e :
except Exception as e:
logger.info('购物车中有套装商品,跳过')
continue
try:
......@@ -437,10 +374,14 @@ def submit_order(risk_control):
except Exception as e:
logger.error(e)
return False
'''
'''
def item_removed( sku_id):
def item_removed(sku_id):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/531.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
......@@ -452,6 +393,7 @@ def item_removed( sku_id):
page = requests.get(url=url, headers=headers)
return '该商品已下柜' not in page.text
'''
购买环节
测试三次
......@@ -487,10 +429,10 @@ def buyMask(sku_id):
return False
flag = 0
flag = 1
while (1):
try:
if flag == 0:
if flag == 1:
validate_cookies()
getUsername()
checkSession = requests.Session()
......@@ -512,10 +454,10 @@ while (1):
if item_removed(skuId):
logger.info('[%s]类型口罩有货啦!马上下单', skuId)
if buyMask(skuId):
sendMail(skuidUrl, True)
sendMail(mail,skuidUrl, True)
sys.exit(1)
else:
sendMail(skuidUrl, False)
sendMail(mail,skuidUrl, False)
else:
logger.info('[%s]类型口罩有货,但已下柜商品', skuId)
time.sleep(5)
......
此差异已折叠。
# -*- coding=utf-8 -*-
'''
发送邮件模块
'''
import traceback
def sendMail(mail, url, isOrder):
try:
import smtplib
from email.mime.text import MIMEText
# email 用于构建邮件内容
from email.header import Header
# 用于构建邮件头
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = 'jdbuymask@163.com'
password = 'alpsneahcyz123'
# 收信方邮箱
to_addr = mail
# 发信服务器
smtp_server = 'smtp.163.com'
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
if isOrder:
msg = MIMEText(url + ' 类型口罩,已经下单了。24小时内付款', 'plain', 'utf-8')
else:
msg = MIMEText(url + ' 类型口罩,下单失败了,快去抢购!', 'plain', 'utf-8')
# 邮件头信息
# msg['From'] = Header(from_addr)
msg['From'] = Header(u'from Mark<{}>'.format(from_addr), 'utf-8')
msg['To'] = Header(to_addr)
msg['Subject'] = Header('京东口罩监控','utf-8')
# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL(host=smtp_server)
server.connect(smtp_server, 465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())
# 关闭服务器
server.quit()
except Exception as e:
print(traceback.format_exc())
# -*- coding=utf-8 -*-
import logging
import logging.handlers
'''
日志模块
'''
LOG_FILENAME = 'jdBuyMask.log'
logger = logging.getLogger()
def set_logger():
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
file_handler = logging.handlers.RotatingFileHandler(
LOG_FILENAME, maxBytes=10485760, backupCount=5, encoding="utf-8")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
set_logger()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册