Update login.py

This commit is contained in:
zhao-zg 2024-12-06 09:55:09 +08:00 committed by GitHub
parent 0ac90fa27b
commit d655280518
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

174
login.py
View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# login.py # login.py
# author: github/svjdck & github.com/icepage/AutoUpdateJdCookie & 小九九 t.me/gdot0 & zhaozg # author: github/svjdck & github.com/icepage/AutoUpdateJdCookie & 小九九 t.me/gdot0
import os import os
from pyppeteer import launch from pyppeteer import launch
@ -50,17 +50,6 @@ supported_colors = {
"红色": ([0, 50, 50], [10, 255, 255]), "红色": ([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 loginPhone(chromium_path, workList, uid, headless):
# 判断账号密码错误 # 判断账号密码错误
async def isWrongAccountOrPassword(page, verify=False): async def isWrongAccountOrPassword(page, verify=False):
@ -128,19 +117,21 @@ async def loginPhone(chromium_path, workList, uid, headless):
), ),
} }
) )
try: page = await browser.newPage()
page = await browser.newPage() await page.setUserAgent(
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") "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
await page.setViewport({"width": 360, "height": 640}) )
await page.goto( await page.setViewport({"width": 360, "height": 640})
"https://plogin.m.jd.com/login/login" await page.goto(
) "https://plogin.m.jd.com/login/login"
await typephoneuser(page, usernum) )
await typephoneuser(page, usernum)
IN_SMS_TIMES = 0 IN_SMS_TIMES = 0
start_time = datetime.datetime.now() start_time = datetime.datetime.now()
sms_sent = False sms_sent = False
while True: while True:
try:
now_time = datetime.datetime.now() now_time = datetime.datetime.now()
logger.info("循环检测中...") logger.info("循环检测中...")
if (now_time - start_time).total_seconds() > 70: if (now_time - start_time).total_seconds() > 70:
@ -210,18 +201,33 @@ async def loginPhone(chromium_path, workList, uid, headless):
break break
await asyncio.sleep(1) await asyncio.sleep(1)
except Exception as e: except Exception as e:
workList[uid].msg = "服务器异常退出" logger.info("异常退出")
workList[uid].status = "error" logger.error(e)
logger.info("异常退出") workList[uid].status = "error"
logger.info(e) workList[uid].msg = "异常退出"
await browser.close() break
await deleteSessionDelay(workList, uid)
raise e
logger.info("任务完成退出") 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() await browser.close()
logger.info("浏览器已关闭!")
return return
async def loginPassword(chromium_path, workList, uid, headless): async def loginPassword(chromium_path, workList, uid, headless):
# 判断账号密码错误 # 判断账号密码错误
async def isWrongAccountOrPassword(page, verify=False): async def isWrongAccountOrPassword(page, verify=False):
@ -241,33 +247,21 @@ async def loginPassword(chromium_path, workList, uid, headless):
logger.info("isWrongAccountOrPassword " + str(e)) logger.info("isWrongAccountOrPassword " + str(e))
return False return False
# 判断验证码超时 # 判断验证码错误
async def isStillInSMSCodeSentPage(page): async def isStillInSMSCodeSentPage(page):
try: try:
if await page.xpath('//*[@id="header"]/span[2]'): if not await page.querySelector('.getMsg-btn.timer.active') and await page.querySelector('.acc-input.msgCode'):
element = await page.xpath('//*[@id="header"]/span[2]') return True
if element:
text = await page.evaluate(
"(element) => element.textContent", element[0]
)
if text == "手机短信验证":
return True
return False return False
except Exception as e: except Exception as e:
logger.info("isStillInSMSCodeSentPage " + str(e)) logger.info("isStillInSMSCodeSentPage " + str(e))
return False return False
# 判断验证码错误 # 判断验证码超时
async def needResendSMSCode(page): async def needResendSMSCode(page):
try: try:
if await page.xpath('//*[@id="app"]/div/div[2]/div[2]/button'): if await page.querySelector('.getMsg-btn.timer.active'):
element = await page.xpath('//*[@id="app"]/div/div[2]/div[2]/button') return True
if element:
text = await page.evaluate(
"(element) => element.textContent", element[0]
)
if text == "获取验证码":
return True
return False return False
except Exception as e: except Exception as e:
logger.info("needResendSMSCode " + str(e)) logger.info("needResendSMSCode " + str(e))
@ -278,7 +272,7 @@ async def loginPassword(chromium_path, workList, uid, headless):
title = await page.title() title = await page.title()
if title in ['手机语音验证', '手机短信验证']: if title in ['手机语音验证', '手机短信验证']:
logger.info('需要' + title) logger.info('需要' + title)
return True return True
return False return False
except Exception as e: except Exception as e:
logger.info("isSendSMSDirectly " + str(e)) logger.info("isSendSMSDirectly " + str(e))
@ -302,22 +296,24 @@ async def loginPassword(chromium_path, workList, uid, headless):
), ),
} }
) )
try: page = await browser.newPage()
page = await browser.newPage() await page.setUserAgent(
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") "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
await page.setViewport({"width": 360, "height": 640}) )
await page.goto( await page.setViewport({"width": 360, "height": 640})
"https://plogin.m.jd.com/login/login" await page.goto(
) "https://plogin.m.jd.com/login/login?appid=300&returnurl=https%3A%2F%2Fm.jd.com%2F&source=wq_passport"
await typeuser(page, usernum, passwd) )
await typeuser(page, usernum, passwd)
IN_SMS_TIMES = 0 IN_SMS_TIMES = 0
start_time = datetime.datetime.now() start_time = datetime.datetime.now()
while True: while True:
try:
now_time = datetime.datetime.now() now_time = datetime.datetime.now()
logger.info("循环检测中...") logger.info("循环检测中...")
if (now_time - start_time).total_seconds() > 70: if (now_time - start_time).total_seconds() > 120:
logger.info("进入超时分支") logger.info("进入超时分支")
workList[uid].status = "error" workList[uid].status = "error"
workList[uid].msg = "登录超时" workList[uid].msg = "登录超时"
@ -487,13 +483,13 @@ async def loginPassword(chromium_path, workList, uid, headless):
break break
await asyncio.sleep(1) await asyncio.sleep(1)
except Exception as e: except Exception as e:
logger.info("异常退出") logger.info("异常退出")
logger.info(e) logger.error(e)
await browser.close() workList[uid].status = "error"
await deleteSessionDelay(workList, uid) workList[uid].msg = "异常退出"
raise e break
logger.info("任务完成退出") logger.info("任务完成退出")
logger.info("开始删除缓存文件......") logger.info("开始删除缓存文件......")
if os.path.exists("image.png"): if os.path.exists("image.png"):
@ -557,21 +553,22 @@ async def typephoneuser(page, usernum):
await page.waitFor(random.randint(200, 500)) await page.waitFor(random.randint(200, 500))
await page.click(".getMsg-btn.text-btn.timer") await page.click(".getMsg-btn.text-btn.timer")
await page.waitFor(random.randint(500, 1000)) await page.waitFor(random.randint(500, 1000))
async def typeuser(page, usernum, passwd): async def typeuser(page, usernum, passwd):
logger.info("开始输入账号密码") logger.info("开始输入账号密码")
await page.waitForSelector(".J_ping.planBLogin") await page.waitForSelector(".J_ping.planBLogin")
await page.click(".J_ping.planBLogin") await page.click(".J_ping.planBLogin")
await page.type( await page.type(
"#username", usernum, {"delay": random.randint(10, 20)} "#username", usernum, {"delay": random.randint(60, 121)}
) )
await page.type( 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.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.click(".btn.J_ping.btn-active")
await page.waitFor(random.randint(500, 1000)) await page.waitFor(random.randint(100, 2000))
async def sendSMSDirectly(page): async def sendSMSDirectly(page):
@ -899,7 +896,9 @@ async def verification_shape(page):
# 文字点选的重试次数,超过将重启浏览器 # 文字点选的重试次数,超过将重启浏览器
retry_count = 10 retry_count = 10
for i in range(5): i = 5
while i > 0:
i -= 1
await page.waitForSelector("div.captcha_footer img") await page.waitForSelector("div.captcha_footer img")
image_src = await page.Jeval( image_src = await page.Jeval(
"#cpc_img", 'el => el.getAttribute("src")' "#cpc_img", 'el => el.getAttribute("src")'
@ -1168,35 +1167,24 @@ async def main(workList, uid, oocr, oocrDet):
return "mac" return "mac"
else: else:
return "unknown" return "unknown"
logger.info("初始化浏览器")
logger.info("初始化浏览器。。。。。")
chromium_path = await init_chrome() chromium_path = await init_chrome()
headless = 'new' headless = 'new'
#headless = False logger.info("进入选择登录方式流程")
logger.info("选择登录")
try_time = 1 try_time = 1
while True: while True:
if workList[uid].type == "phone": if workList[uid].type == "phone":
logger.info("选择手机号登录") logger.info("选择手机号登录")
result = await loginPhone(chromium_path, workList, uid, headless) result = await loginPhone(chromium_path, workList, uid, headless)
elif workList[uid].type == "password": elif workList[uid].type == "password":
logger.info("选择密码登录") logger.info("选择密码登录")
result = await loginPassword(chromium_path, workList, uid, headless) result = await loginPassword(chromium_path, workList, uid, headless)
if result != "notSupport" or try_time > 5: if result != "notSupport" or try_time > 5:
break break
await asyncio.sleep(random.uniform(2, 4)) await asyncio.sleep(random.uniform(2, 4))
logger.info(f"进行第{try_time}次重试") logger.info(f"进行第{try_time}次重试")
try_time += 1 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)
logger.info("登录完成") logger.info("登录完成")
await asyncio.sleep(10) await asyncio.sleep(10)