77 lines
2.8 KiB
Python
77 lines
2.8 KiB
Python
"""复现"把广告文本当成登录二维码"的误判,并验证替代判据。
|
|
|
|
纯读:只截图、只计算,不点击、不发送。
|
|
"""
|
|
import os
|
|
import sys
|
|
|
|
import cv2
|
|
import numpy as np
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
import wechat_bot as bot_module # noqa: E402
|
|
|
|
OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "secgate")
|
|
|
|
|
|
def report(img: np.ndarray, label: str) -> None:
|
|
height, width = img.shape[:2]
|
|
rgb = img[:, :, :3].astype(np.float32)
|
|
gray = rgb.mean(axis=2)
|
|
nav_width = max(16, int(width * 0.06))
|
|
nav = gray[int(height * 0.08):int(height * 0.92), :nav_width]
|
|
center = gray[
|
|
int(height * 0.32):int(height * 0.70),
|
|
int(width * 0.32):int(width * 0.68),
|
|
]
|
|
nav_dark_ratio = float((nav < 120).mean())
|
|
dark = center < 75
|
|
light_ratio = float((center > 220).mean())
|
|
transition_ratio = float(
|
|
(dark[:, 1:] != dark[:, :-1]).mean() + (dark[1:, :] != dark[:-1, :]).mean()
|
|
)
|
|
qr_like = (
|
|
float(dark.mean()) >= 0.025 and light_ratio >= 0.45 and transition_ratio >= 0.035
|
|
)
|
|
print(f"--- {label} {width}x{height}")
|
|
print(f" nav_dark_ratio = {nav_dark_ratio:.4f} (需 < 0.12)")
|
|
print(f" center dark = {float(dark.mean()):.4f} (需 >= 0.025)")
|
|
print(f" light_ratio = {light_ratio:.4f} (需 >= 0.45)")
|
|
print(f" transition = {transition_ratio:.4f} (需 >= 0.035)")
|
|
print(f" qr_like = {qr_like}")
|
|
print(f" 旧判据结论 = {nav_dark_ratio < 0.12 and qr_like}")
|
|
|
|
gray8 = cv2.cvtColor(img[:, :, :3], cv2.COLOR_BGR2GRAY)
|
|
detector = cv2.QRCodeDetector()
|
|
ok, points = detector.detect(gray8)
|
|
print(f" cv2 真的找到二维码 = {bool(ok)}")
|
|
if ok and points is not None:
|
|
for quad in np.asarray(points).reshape(-1, 4, 2):
|
|
w = np.linalg.norm(quad[0] - quad[1])
|
|
h = np.linalg.norm(quad[1] - quad[2])
|
|
print(f" 四角={quad.astype(int).tolist()} 边长≈{w:.0f}x{h:.0f}")
|
|
|
|
|
|
def main() -> None:
|
|
os.makedirs(OUT, exist_ok=True)
|
|
bot = bot_module.WeChatBot()
|
|
bot.safe_window_mode = True
|
|
bot.auto_activate_window = False
|
|
if not bot.connect(activate=False, wait_if_missing=False):
|
|
print("[-] 未挂载到企业微信窗口")
|
|
return
|
|
img = bot._capture_full_window()
|
|
if img is None:
|
|
print("[-] 截屏失败")
|
|
return
|
|
cv2.imwrite(os.path.join(OUT, "full.png"), img[:, :, :3])
|
|
report(img, "当前企业微信主界面(不该被判为验证页)")
|
|
print()
|
|
print(f"looks_like_security_verification() = "
|
|
f"{bot_module.looks_like_security_verification(img)}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|