mirror of
https://github.com/zhao-zg/jd-login.git
synced 2026-01-17 00:10:43 +08:00
Compare commits
7 Commits
51ac6664e1
...
8c53e8d103
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c53e8d103 | ||
|
|
61f4b76ea7 | ||
|
|
f4bba3a736 | ||
|
|
1852ec734d | ||
|
|
c54d37731d | ||
|
|
18af00a4f8 | ||
|
|
3e724436c8 |
@ -21,7 +21,7 @@ services:
|
||||
libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2
|
||||
libatspi2.0-0 libxshmfence1 && python -m pip install --upgrade pip && pip
|
||||
install pyppeteer Pillow asyncio aiohttp opencv-python-headless ddddocr
|
||||
quart && rm -rf * && wget -O api.py
|
||||
quart requests fake_useragent && rm -rf * && wget -O api.py
|
||||
https://raw.githubusercontent.com/zhao-zg/jd-login/main/api.py
|
||||
&& wget -O login.py
|
||||
https://raw.githubusercontent.com/zhao-zg/jd-login/main/login.py
|
||||
@ -43,7 +43,7 @@ services:
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
command: >
|
||||
sh -c "rm -rf * && wget -O api.py
|
||||
sh -c "rm -rf * && wget -O api.py && pip requests fake_useragent &&
|
||||
https://raw.githubusercontent.com/zhao-zg/jd-login/main/api.py && wget -O
|
||||
login.py https://raw.githubusercontent.com/zhao-zg/jd-login/main/login.py
|
||||
&& python api.py"
|
||||
|
||||
157
login.py
157
login.py
@ -18,6 +18,7 @@ import base64
|
||||
import io
|
||||
import re
|
||||
import logging
|
||||
from fake_useragent import UserAgent
|
||||
|
||||
# 传参获得已初始化的ddddocr实例
|
||||
ocr = None
|
||||
@ -27,6 +28,14 @@ logger = logging.getLogger("login")
|
||||
simple_format = "[%(asctime)s][%(levelname)s][%(filename)s:%(lineno)d] %(message)s"
|
||||
logging.basicConfig(level=logging.INFO, format=simple_format, datefmt="%Y-%m-%d %H:%M:%S %z")
|
||||
|
||||
user_agents = [
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36",
|
||||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
|
||||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36",
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0",
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0",
|
||||
]
|
||||
# 支持的形状类型
|
||||
supported_types = [
|
||||
"三角形",
|
||||
@ -50,17 +59,6 @@ supported_colors = {
|
||||
"红色": ([0, 50, 50], [10, 255, 255]),
|
||||
}
|
||||
|
||||
|
||||
async def deleteSessionDelay(workList, uid):
|
||||
s = workList.get(uid, "")
|
||||
if s:
|
||||
await asyncio.sleep(15)
|
||||
del workList[uid]
|
||||
async def deleteSession(workList, uid):
|
||||
s = workList.get(uid, "")
|
||||
if s:
|
||||
del workList[uid]
|
||||
|
||||
async def loginPhone(chromium_path, workList, uid, headless):
|
||||
# 判断账号密码错误
|
||||
async def isWrongAccountOrPassword(page, verify=False):
|
||||
@ -93,7 +91,9 @@ async def loginPhone(chromium_path, workList, uid, headless):
|
||||
# 判断验证码超时
|
||||
async def needResendSMSCode(page):
|
||||
try:
|
||||
return await page.querySelector('.getMsg-btn.text-btn.timer.active');
|
||||
if await page.querySelector('.getMsg-btn.text-btn.timer.active'):
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
logger.info("needResendSMSCode " + str(e))
|
||||
return False
|
||||
@ -128,7 +128,7 @@ async def loginPhone(chromium_path, workList, uid, headless):
|
||||
)
|
||||
page = await browser.newPage()
|
||||
await page.setUserAgent(
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
|
||||
UserAgent().random
|
||||
)
|
||||
await page.setViewport({"width": 360, "height": 640})
|
||||
await page.goto(
|
||||
@ -139,8 +139,8 @@ async def loginPhone(chromium_path, workList, uid, headless):
|
||||
IN_SMS_TIMES = 0
|
||||
start_time = datetime.datetime.now()
|
||||
sms_sent = False
|
||||
try:
|
||||
while True:
|
||||
while True:
|
||||
try:
|
||||
now_time = datetime.datetime.now()
|
||||
logger.info("循环检测中...")
|
||||
if (now_time - start_time).total_seconds() > 70:
|
||||
@ -210,16 +210,29 @@ async def loginPhone(chromium_path, workList, uid, headless):
|
||||
break
|
||||
|
||||
await asyncio.sleep(1)
|
||||
except Exception as e:
|
||||
workList[uid].msg = "服务器异常退出"
|
||||
workList[uid].status = "error"
|
||||
print("异常退出")
|
||||
print(e)
|
||||
await browser.close()
|
||||
await deleteSessionDelay(workList, uid)
|
||||
raise e
|
||||
except Exception as e:
|
||||
logger.info("异常退出")
|
||||
logger.error(e)
|
||||
workList[uid].status = "error"
|
||||
workList[uid].msg = "异常退出"
|
||||
break
|
||||
|
||||
print("任务完成退出")
|
||||
logger.info("任务完成退出")
|
||||
|
||||
logger.info("任务完成退出")
|
||||
logger.info("开始删除缓存文件......")
|
||||
if os.path.exists("image.png"):
|
||||
os.remove("image.png")
|
||||
if os.path.exists("template.png"):
|
||||
os.remove("template.png")
|
||||
if os.path.exists("shape_image.png"):
|
||||
os.remove("shape_image.png")
|
||||
if os.path.exists("rgba_word_img.png"):
|
||||
os.remove("rgba_word_img.png")
|
||||
if os.path.exists("rgb_word_img.png"):
|
||||
os.remove("rgb_word_img.png")
|
||||
logger.info("缓存文件已删除!")
|
||||
logger.info("开始关闭浏览器....")
|
||||
await browser.close()
|
||||
logger.info("浏览器已关闭!")
|
||||
return
|
||||
@ -246,14 +259,8 @@ async def loginPassword(chromium_path, workList, uid, headless):
|
||||
# 判断验证码错误
|
||||
async def isStillInSMSCodeSentPage(page):
|
||||
try:
|
||||
if await page.xpath('//*[@id="header"]/span[2]'):
|
||||
element = await page.xpath('//*[@id="header"]/span[2]')
|
||||
if element:
|
||||
text = await page.evaluate(
|
||||
"(element) => element.textContent", element[0]
|
||||
)
|
||||
if text == "手机短信验证":
|
||||
return True
|
||||
if not await page.querySelector('.getMsg-btn.timer.active') and await page.querySelector('.acc-input.msgCode'):
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
logger.info("isStillInSMSCodeSentPage " + str(e))
|
||||
@ -262,14 +269,8 @@ async def loginPassword(chromium_path, workList, uid, headless):
|
||||
# 判断验证码超时
|
||||
async def needResendSMSCode(page):
|
||||
try:
|
||||
if await page.xpath('//*[@id="app"]/div/div[2]/div[2]/button'):
|
||||
element = await page.xpath('//*[@id="app"]/div/div[2]/div[2]/button')
|
||||
if element:
|
||||
text = await page.evaluate(
|
||||
"(element) => element.textContent", element[0]
|
||||
)
|
||||
if text == "获取验证码":
|
||||
return True
|
||||
if await page.querySelector('.getMsg-btn.timer.active'):
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
logger.info("needResendSMSCode " + str(e))
|
||||
@ -306,7 +307,7 @@ async def loginPassword(chromium_path, workList, uid, headless):
|
||||
)
|
||||
page = await browser.newPage()
|
||||
await page.setUserAgent(
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
|
||||
UserAgent().random
|
||||
)
|
||||
await page.setViewport({"width": 360, "height": 640})
|
||||
await page.goto(
|
||||
@ -316,8 +317,9 @@ async def loginPassword(chromium_path, workList, uid, headless):
|
||||
|
||||
IN_SMS_TIMES = 0
|
||||
start_time = datetime.datetime.now()
|
||||
try:
|
||||
while True:
|
||||
|
||||
while True:
|
||||
try:
|
||||
now_time = datetime.datetime.now()
|
||||
logger.info("循环检测中...")
|
||||
if (now_time - start_time).total_seconds() > 120:
|
||||
@ -490,20 +492,20 @@ async def loginPassword(chromium_path, workList, uid, headless):
|
||||
break
|
||||
|
||||
await asyncio.sleep(1)
|
||||
except Exception as e:
|
||||
logger.info("异常退出")
|
||||
logger.error(e)
|
||||
logger.info("异常退出,正在保存当前页面信息......")
|
||||
dateTime = datetime.datetime.now().strftime('%Y%m%d %H_%M_%S.%f')
|
||||
logger.info(f"页面截图保存到: error_{usernum}-screenshot-{dateTime}.png")
|
||||
await page.screenshot({'path': f"error_{usernum}-screenshot-{dateTime}.png"})
|
||||
logger.info(f"页面HTML保存到: error_{usernum}-html-{dateTime}.html")
|
||||
content = await page.content()
|
||||
with open(f"error_{usernum}-html-{dateTime}.html", 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
await browser.close()
|
||||
await deleteSessionDelay(workList, uid)
|
||||
raise e
|
||||
except Exception as e:
|
||||
logger.info("异常退出")
|
||||
logger.error(e)
|
||||
logger.info("异常退出,正在保存当前页面信息......")
|
||||
dateTime = datetime.datetime.now().strftime('%Y%m%d %H_%M_%S.%f')
|
||||
logger.info(f"页面截图保存到: error_{usernum}-screenshot-{dateTime}.png")
|
||||
await page.screenshot({'path': f"error_{usernum}-screenshot-{dateTime}.png"})
|
||||
logger.info(f"页面HTML保存到: error_{usernum}-html-{dateTime}.html")
|
||||
content = await page.content()
|
||||
with open(f"error_{usernum}-html-{dateTime}.html", 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
workList[uid].status = "error"
|
||||
workList[uid].msg = "异常退出"
|
||||
break
|
||||
|
||||
logger.info("任务完成退出")
|
||||
logger.info("开始删除缓存文件......")
|
||||
@ -568,21 +570,22 @@ async def typephoneuser(page, usernum):
|
||||
await page.waitFor(random.randint(200, 500))
|
||||
await page.click(".getMsg-btn.text-btn.timer")
|
||||
await page.waitFor(random.randint(500, 1000))
|
||||
|
||||
async def typeuser(page, usernum, passwd):
|
||||
print("开始输入账号密码")
|
||||
logger.info("开始输入账号密码")
|
||||
await page.waitForSelector(".J_ping.planBLogin")
|
||||
await page.click(".J_ping.planBLogin")
|
||||
await page.type(
|
||||
"#username", usernum, {"delay": random.randint(10, 20)}
|
||||
"#username", usernum, {"delay": random.randint(60, 121)}
|
||||
)
|
||||
await page.type(
|
||||
"#pwd", passwd, {"delay": random.randint(10, 20)}
|
||||
"#pwd", passwd, {"delay": random.randint(100, 151)}
|
||||
)
|
||||
await page.waitFor(random.randint(200, 500))
|
||||
await page.waitFor(random.randint(100, 2000))
|
||||
await page.click(".policy_tip-checkbox")
|
||||
await page.waitFor(random.randint(200, 500))
|
||||
await page.waitFor(random.randint(100, 2000))
|
||||
await page.click(".btn.J_ping.btn-active")
|
||||
await page.waitFor(random.randint(500, 1000))
|
||||
await page.waitFor(random.randint(100, 2000))
|
||||
|
||||
|
||||
async def sendSMSDirectly(page):
|
||||
@ -602,7 +605,7 @@ async def sendSMSDirectly(page):
|
||||
|
||||
try:
|
||||
while True:
|
||||
if await page.xpath('//*[@id="captcha_modal"]/div/div[3]/div'):
|
||||
if await page.xpath('//*[@id="small_img"]'):
|
||||
await verification(page)
|
||||
|
||||
elif await page.xpath('//*[@id="captcha_modal"]/div/div[3]/button'):
|
||||
@ -644,7 +647,7 @@ async def sendSMS(page):
|
||||
|
||||
try:
|
||||
while True:
|
||||
if await page.xpath('//*[@id="captcha_modal"]/div/div[3]/div'):
|
||||
if await page.xpath('//*[@id="small_img"]'):
|
||||
await verification(page)
|
||||
|
||||
elif await page.xpath('//*[@id="captcha_modal"]/div/div[3]/button'):
|
||||
@ -799,6 +802,9 @@ async def verification(page):
|
||||
await page.mouse.move(
|
||||
box["x"] + distance, box["y"], {"steps": 10}
|
||||
)
|
||||
await page.waitFor(
|
||||
random.randint(200, 500)
|
||||
)
|
||||
await page.mouse.up()
|
||||
logger.info("过滑块结束")
|
||||
|
||||
@ -910,7 +916,9 @@ async def verification_shape(page):
|
||||
|
||||
# 文字点选的重试次数,超过将重启浏览器
|
||||
retry_count = 10
|
||||
for i in range(5):
|
||||
i = 5
|
||||
while i > 0:
|
||||
i -= 1
|
||||
await page.waitForSelector("div.captcha_footer img")
|
||||
image_src = await page.Jeval(
|
||||
"#cpc_img", 'el => el.getAttribute("src")'
|
||||
@ -1097,7 +1105,7 @@ async def download_file(url, file_path):
|
||||
file.write(chunk)
|
||||
downloaded_size += len(chunk)
|
||||
progress = (downloaded_size / file_size) * 100
|
||||
logger.info(f"已下载{progress:.2f}%...", end="\r")
|
||||
logger.info(f"已下载{progress:.2f}%...")
|
||||
logger.info("下载完成,进行解压安装....")
|
||||
|
||||
|
||||
@ -1183,6 +1191,8 @@ async def main(workList, uid, oocr, oocrDet):
|
||||
logger.info("初始化浏览器。。。。。")
|
||||
chromium_path = await init_chrome()
|
||||
headless = 'new'
|
||||
if platform.system() == "Windows":
|
||||
headless = False
|
||||
logger.info("进入选择登录方式流程")
|
||||
|
||||
try_time = 1
|
||||
@ -1198,16 +1208,5 @@ async def main(workList, uid, oocr, oocrDet):
|
||||
await asyncio.sleep(random.uniform(2, 4))
|
||||
logger.info(f"进行第{try_time}次重试")
|
||||
try_time += 1
|
||||
if os.path.exists("image.png"):
|
||||
os.remove("image.png")
|
||||
if os.path.exists("template.png"):
|
||||
os.remove("template.png")
|
||||
if os.path.exists("shape_image.png"):
|
||||
os.remove("shape_image.png")
|
||||
if os.path.exists("rgba_word_img.png"):
|
||||
os.remove("rgba_word_img.png")
|
||||
if os.path.exists("rgb_word_img.png"):
|
||||
os.remove("rgb_word_img.png")
|
||||
await deleteSessionDelay(workList, uid)
|
||||
print("登录完成")
|
||||
logger.info("登录完成")
|
||||
await asyncio.sleep(10)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user