首页 > 其他分享 >plawright过抖音手机号登录验证

plawright过抖音手机号登录验证

时间:2024-04-08 17:35:58浏览次数:25  
标签:手机号 get self await response plawright 过抖音 page wait

import httpx
import random
import asyncio
import ddddocr
from PIL import Image
from io import BytesIO
from loguru import logger
from playwright.async_api import Page, Response, async_playwright


class AwemeBrowser:

    def __init__(self, session: str, headless: bool = False):
        self.x = 0
        self.y = ""
        self.url1 = ""
        self.url2 = ""
        self.tag = False
        self._session = session
        self._headless = headless
        self.ocr = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)

    async def login(self, page: Page, username) -> None:
        page.on("response", self.on_response)

        await page.goto('https://doujia.douyin.com/login')
        await page.wait_for_timeout(self.wait_random)
        if "扫码登录" not in await page.content():
            logger.info("账号={}, 正常在线".format(username))
        else:
            await page.click('li:has-text("验证码登录")')
            # 清空输入框
            await page.evaluate('document.querySelector(".web-login-normal-input__input").value=""')
            await page.evaluate('document.querySelector(".web-login-button-input__input").value=""')
            # 账号密码登录
            await page.wait_for_timeout(self.wait_random)
            await page.type(selector=".web-login-normal-input__input", text=username, delay=100)
            # await page.type(selector=".web-login-button-input__input", text=password, delay=100)
            await page.wait_for_timeout(self.wait_random)
            await page.click('span:has-text("获取验证码")')
            await page.wait_for_timeout(self.wait_random)
            num = 1
            while True:
                logger.warning("当前滑动次数: {}".format(num))

                distance = await self.get_distance()

                tracks = self.get_tracks(distance)

                new_frame = page.frame_locator('#captcha_container > iframe')
                slide = new_frame.locator('.captcha-slider-btn')
                box = await slide.bounding_box()
                await page.mouse.move(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
                await page.mouse.down()
                x = box["x"] + box["width"] / 2
                for track in tracks:
                    x += track
                    await page.mouse.move(x, box["y"])
                    await asyncio.sleep(random.uniform(0.005, 0.02))
                await page.mouse.up()
                await page.wait_for_timeout(self.wait_random)
                num = num + 1
                if num > 5 or self.tag:
                    break
                await page.wait_for_timeout(self.wait_random)

    @property
    def wait_random(self):
        return random.randint(1000, 3000)

    async def on_response(self, response: Response):
        if "https://verify.zijieapi.com/captcha/get" in response.url:
            result = await response.json()
            data = result.get("data")
            picture = data.get("question")
            self.y = picture.get("tip_y")
            self.url1 = picture.get("url1")
            self.url2 = picture.get("url2")

        if "https://verify.zijieapi.com/captcha/verify" in response.url:
            result = await response.json()
            if result.get("code") == 200:
                logger.success("滑块通过, res={}".format(result))
                self.tag = True

    async def get_distance(self):
        async with httpx.AsyncClient() as session:
            response_1 = await session.get(self.url1)
            response_2 = await session.get(self.url2)
        image = Image.open(BytesIO(response_1.content))
        width, height = image.size
        sub_images = []
        for i in range(6):
            left = (i * width) // 6
            right = ((i + 1) * width) // 6
            sub_image = image.crop((left, 0, right, height))
            sub_images.append(sub_image)

        order = [1, 5, 4, 2, 0, 3]
        new_images = [None] * 6
        for i in range(6):
            new_images[order[i]] = sub_images[i]

        merged_image = Image.new('RGB', (width, height))
        for i in range(6):
            left = (i * width) // 6
            right = ((i + 1) * width) // 6
            merged_image.paste(new_images[i], (left, 0))

        # 保存图片
        merged_image.save('logs/images/captcha_restored.png')
        img_byte = BytesIO()
        merged_image.save(img_byte, format='JPEG')
        url1_content = img_byte.getvalue()
        ocr_response = self.ocr.slide_match(response_2.content, url1_content)
        x = ocr_response['target'][0]
        logger.info(f"滑动的距离为: {x}, 高度为: {self.y}")
        return int(int(x) / 550 * 340) - 5

    def get_tracks(self, distance):
        track = []
        current = 0
        mid = distance * 4 / 5
        t = 0.2
        v = 1

        while current < distance:
            if current < mid:
                a = 4
            else:
                a = -3
            v0 = v
            v = v0 + a * t
            move = v0 * t + 1 / 2 * a * t * t
            current += move
            track.append(round(move))
        return track

    async def start(self, username):
        async with async_playwright() as pwt:
            browser = await pwt.chromium.launch_persistent_context(
                headless=self._headless,
                user_data_dir=self._session,
                args=["--start-maximized", '--disable-blink-features=AutomationControlled'],
                no_viewport=True  # 窗口最大化
            )
            await browser.add_init_script(path="logs/js/stealth.min.js")
            page = await browser.new_page()
            await self.login(page=page, username=username)


async def main(username):
    b = AwemeBrowser(session=f"logs/session/{username}")
    await b.start(username)


asyncio.run(main("17682303516"))

  

标签:手机号,get,self,await,response,plawright,过抖音,page,wait
From: https://www.cnblogs.com/yoyo1216/p/18121809

相关文章

  • 记一次对我的学校的微信小程序的渗透测试(短信轰炸+教师手机号泄露)
    0x01教师手机号泄露打开智慧校园小程序点进教师登录后发现,输入我老师名字后会显示尾号抓包,在response中得到完整的手机号手机注册那里填入抓到的手机号,便可以发短信验证码(填别的手机号会被前端的验证拦截并显示'该手机号不对,清核对信息',但验证是前端的[前端就是通......
  • 查询手机号码是否支持携号转网的API接口
      手机号码携号转网已经成为了一个热门话题,很多人在选择运营商时都会考虑这个因素。然而,要知道一个手机号码是否支持携号转网,并且查询其转网前及转网后所归属的运营商,是一件比较困难的事情。不过,幸运的是,有一些API接口可以帮助我们实现这个功能。今天,我要向大家介绍的就是一......
  • Faker库模拟数据生成,批量生成手机号,姓名,邮箱,
    一、简介Faker是一个开源的Python库,由IsaacKelly创建,旨在帮助开发者在测试和开发过程中生成伪造(模拟)数据。这个库能够生成各种类型的信息,包括但不限于姓名、地址、信用卡号、公司名称等,以及各种其他类型的模拟数据,这些数据可以用于填充数据库、创建测试账户、进行单元测试等......
  • Java 快递地址 自动识别地址省市区、手机号、姓名,地址自动补全省市区 速度高达1万/秒
    公司每天需处理大量快递地址,需要将一段字符串进行解析出省、市、区、街道、详细地址、手机、姓名。类似淘宝的地址自动识别,并且需要解析到具体的楼栋单元户室。研究了好久,终于写出了一个Java版的解析算法。下载地址:https://download.csdn.net/download/u011024436/89035851算......
  • 消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设
    消息sms邮箱/手机号/push发送的方案&定时任务xxlJob灵活度&泛型和发送的模板类设计1.消息sms邮箱/手机号/push发送的方案1.判断收件人地址是否为空,不为空则发送邮件。为空则不发送。可以通过该方法终止一些消息的发送。2.收件人的地址可以配置在Apollo中,直接删除该key......
  • 浏览器脚本:获取MOKA简历中的手机号码自动生成二维码方便手机扫描拨号
    效果演示:对其中隐私部分已经隐藏,请自行测试JS控制台代码:letlastPhoneNumber='';constcheckPhoneNumber=()=>{constelements=document.querySelectorAll('[class*="sd-Icon-iconmobile"]');elements.forEach(element=>{cons......
  • 最详细的Keycloak教程(建议收藏):Keycloak实现手机号、验证码登陆——(三)基于springboot&k
    在前面两节分别介绍了Keycloak的下载与使用和keycloak与springboot的集成。接下来第三节让我们一步步的去完成一个简单的前后端分离项目,并且可以扩展实现sso。一、简介本文将介绍如何使用SpringBoot、Keycloak和Vue构建一个具有前后端分离架构的Web应用程序。通过将前......
  • 上传文件附件时判断word、excel、txt等是否含有敏感词如身份证号,手机号等
    上传附件判断word、excel、txt等文档中是否含有敏感词如身份证号,手机号等,其它检测如PDF,图片(OCR)等可以自行扩展。互联网项目中,展示的数据中不能包含个人信息等敏感信息。判断word中是否包含手机号,word正文中是否包含身份证号等敏感信息,通过正则表达式判断匹配手机号,身份证号,以下做......
  • 手机号码
    这道题目要注意一个点,“是否出现连续\(3\)个相同的数字”这一维是必须的试想一下,如果我们设\(f[i][j][k][0/1][0/1]\)表示填到第\(i\)位,第\(i\)位数字是\(j\),第\(i\)位前面由\(k\)个数字与\(j\)相同(\(k\)的取值是\(0,1,2\),如果\(k\)取\(2\)的话,那么表示至少有\(2\)个相同),是否出现......
  • gmail.com谷歌邮箱修改手机号,辅助号码还显示老号码
    前言全局说明2023年谷歌强制要求开启两部验证,否则代收邮箱就不能正常使用了1、gmail.com谷歌邮箱修改手机号,辅助号码还显示老号码?根据网友的说法猜测,应该是你修改了手机号,gmail还不能完全判定你是邮箱主人。所以留着辅助号码,防止真正的邮箱主人找回用。2、多长时间更新......