打码工具V1.0

# !/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@author  : v_jiaohaicheng@baidu.com
@des     :头条打码工具 V1.0 pyppeteer实现

"""
import hashlib
import os
import asyncio
import time
import requests
from pyppeteer import launch
from queue import Queue
import config
from threading import Thread
import copy

SUCCESS_UPLOAD_COOKIE_NUM = config.SUCCESS_UPLOAD_COOKIE_NUM
NOW_NUM = copy.deepcopy(SUCCESS_UPLOAD_COOKIE_NUM)
wait_verify_cookies_queue = Queue()


async def handle(browser, url, s_v_web_id, username):
    """
    清理cookie,对页面请求,检查弹框,关闭页面
    :param browser:
    :param url:
    :param s_v_web_id:
    :param username:
    :return:
    """
    try:
        page = await browser.newPage()
        # await page.addScriptTag(path='./stealth.min.js')
        await page.setViewport(viewport={'width': 1365, 'height': 768})
        await page.setJavaScriptEnabled(enabled=True)
        # 删掉cookie
        await page.deleteCookie()
        # 设置不含s_v_web_id的cookie
        await page.setCookie({"name": "s_v_web_id", "value": "{}".format(s_v_web_id), "domain": "www.toutiao.com"})
        await page.goto(url)
        await asyncio.sleep(1)
        # 检查弹框
        await check_verify(page, url, username)
        # 关闭当前页面
        await page.close()
    except Exception as e:
        print(e, e.__traceback__.tb_lineno)
        config.BROWSER_ERROR = True


async def check(page, times, status_code,username,url):
    """
    30s内间隔1s循环检查验证码状态
    :param page:
    :param times:
    :param status_code:
    :param username:
    :param url:
    :return:
    """
    while times > 0:
        status_lis = await page.Jeval("div#captcha_container",'node => node.getAttribute("style")')
        # print("status_lis",status_lis)
        if "none" in status_lis:
            status_code = True
            cookie = await get_cookie(page)
            print("打码后的 cookie:{}".format(cookie))
            cookie_status = await verify_code_cookie(url, cookie, page)
            if cookie_status == True:
                print("本次验证码有效")
                global NOW_NUM
                NOW_NUM += 1
                wait_verify_cookies_queue.put(cookie)
                if wait_verify_cookies_queue.qsize() == config.UPLOAD_SIZE:
                    print(
                        "有效验证码已达到{}个,正在上传".format(
                            config.UPLOAD_SIZE))
                    await upload_cookie(username)
                else:
                    print(
                        "本次验证码已保存 ({}/5),待上传,当前已成功打码 {}".format(wait_verify_cookies_queue.qsize(),NOW_NUM))
            else:
                print("本次验证码无效")


            return status_code
                # elif "display: display" in status_lis[0]:
        else:
            # print("页面元素获取失败")
            times -= 1
        time.sleep(1)
    print("超时未打码")
    return status_code


async def check_verify(page, url, username):
    """
    检测请求页面中是否存在验证码
    :param page:
    :param url:
    :param username:
    :return:
    """
    flag = True
    while flag:
        try:
            verify1 = await page.Jx("//div[@id='captcha_container']")
            if len(verify1) > 0:
                status_code = False
                print("检查到验证码,请{}s内完成打码".format(config.REFRESH_TIME))
                # 循环等待检测
                await check(page=page, times=config.REFRESH_TIME, status_code=status_code,username=username,url=url)
                break
            else:
                flag = False
        except Exception as e:
            flag = False
            print(e, "\n", e.__traceback__.tb_lineno)


async def verify_code_cookie(url, cookie, page):
    """
    验证打码后的cookie有效性
    :param url:
    :param cookie:
    :param page:
    :return:
    """
    await page.deleteCookie()
    # 设置不含s_v_web_id的cookie
    await page.setCookie({"name": "s_v_web_id", "value": "{}".format(cookie), "domain": "www.toutiao.com"})
    await page.goto(url, {'waitUntil': ['load', 'networkidle0']}, timeout=100000)
    await asyncio.sleep(1)
    verify1 = await page.Jx("//div[@id='captcha_container']")
    verify2 = await page.Jx("//div[@class='profile-tab-feed']")
    if len(verify1) > 0:
        # print("False1")
        return False
    else:
        if len(verify2) > 0:
            return True
        else:
            # print("False2")
            return False
    # return True


async def upload_cookie(username, retry_times=config.RETRY_TIMES, timeout=config.TIMEOUT):
    """
    上传有效的cookie,上传失败将保存在本地
    :param username:
    :param retry_times:
    :param timeout:
    :return:
    """
    pass


async def get_cookie(page):
    """
    获取cookie中的 s_v_web_id
    :param page:
    :return:
    """
    cookie = await page.cookies()
    for i in cookie:
        if i.get("name") == "s_v_web_id":
            return i["value"]
    return None


async def save_cookie(lis):
    """
    保存一场cookie
    :param lis:
    :return:
    """
    save_path = R"./result"
    os.makedirs(save_path, exist_ok=True)
    with open(os.path.join(save_path, "upload_fail_cookie.txt"), "w", encoding="utf-8")as fp:
        for text in lis:
            fp.write(str(text))
        print("本次上传异常的cookie已保存在本地")


async def close():
    """
    关闭程序(浏览器出现异常情况好使)
    :return:
    """
    cmd = "taskkill /f /t /im Chromium.exe"
    cmd2 = "taskkill /f /t /im 头条打码工具.exe"
    os.system(cmd)
    os.system(cmd2)


async def main():
    """
    程序入口
    :return:
    """
    username = input("请输入百度用户名:")
    while username == "":
        username = input("请输入百度用户名:")

    browser = await launch({'headless': False, 'dumpio': True, 'args': ['--disable-infobars', '--ignore-certificate-errors']})
    for num, url in enumerate(config.URL_LIST):
        if not config.BROWSER_ERROR:
            if num > 0 and num % 10 == 0:
                print("成功发起请求:{}次".format(num))
            else:
                pass
            try:
                # s_v_web_id = input("输入s_v_web_id:")
                s_v_web_id = ""
                await handle(browser, url, s_v_web_id, username)
            except Exception as e:
                print(e)
        else:
            if wait_verify_cookies_queue.qsize() > 0:
                print(
                    "检测到还有{}个cookie未上传".format(
                        wait_verify_cookies_queue.qsize()))
                await upload_cookie(username)
            else:
                pass

            print("请按回车键关闭程序后,重启程序")
            input()
            await close()
            break

def run():
    """
    启动
    :return:
    """
    asyncio.get_event_loop().run_until_complete(main())


if __name__ == '__main__':
    Thread(target=run).run()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值