pyppeeter 解决淘宝的滑动验证码

最开始 我做淘宝的滑动验证码 是用的selenium 做的 但是 经常被检测 而且现在大多大型的网站都对selenium进行了反扒限制。

下面这个代码 就是建立 cookie池之后的出现滑块 获取 json数据中的 x5sec 从而达到 暂时避免滑块

import base64
import json
import os
import MySQLdb
import requests
import random
import time
from pyppeteer import launch, connect
import asyncio
from taobaos.IP_agency.change_ip import mians


def inquire_cookie(tao_tid_sums):
   global cookies_cookie
   global cookies_id
   global cookies_x5sec
   cursor_tobao_tfsid.execute('select id,cookie,x5sec from tobao_cookie WHERE id='+ str(tao_tid_sums))
   rows = cursor_tobao_tfsid.fetchone()
   cookies_id = rows[0]
   cookies_cookie = rows[1]
   cookies_x5sec = rows[2]
   print("x5secx5secx5secx5sec", cookies_x5sec)
   print(cookies_id, cookies_cookie)
   cursor_tobao_tfsid.execute("update tobao_cookie set flag='" + "1" + "' where id=" + str(cookies_id))
   conn_tobao_tfsid.commit()
   return cookies_cookie


async def tao_tid(ss, tao_tid_sums):
    global cursor_tobao_tfsid
    global conn_tobao_tfsid
    global cookie1
    conn_tobao_tfsid = MySQLdb.connect(host=host, port=3306, user='root', password='123456', database='tobao_tfsid',
                           charset='utf8')
    cursor_tobao_tfsid = conn_tobao_tfsid.cursor()
    print("#####################获取淘宝的json==name###########################")
    request_url = "https://s.taobao.com/image"
    times = str(time.time())
    timestamp = times.split(".", 1)
    head = {
        "apiVersion": "v1.0.0",
        "appVersion": "v1.0.0",
        "OS": "iOS",
        "OSVersion": "11.4.1",
        "language": "zh",
        "did": "NTIzOTIxNDYwMzMyM2NjZjk1OGM5NjBmYzNlNzg2OTYtZTkxNzg1MzYzNjA4NGM0Mjg4Njg3MmFhNzExMDE1YTgwMDAyLXIwWUtuK0MrS1Y2eDBteWs3WnhDYmQ2ZnovTT0=",
        "reqSeq": "eb144eed4639d36bb6a7b9aa2a563421",
        "timestamp": timestamp[0],
        "userToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJiaXpUeXBlIjoiTE9BTiIsInVzZXJSb2xlIjoyLCJleHAiOjE1NTQ2MTYwMjUsInVzZXJJZCI6MzAxMzkyNDUxNTc3Mzk3MjQ4LCJjaGVja0NvZGUiOiJiZTk1MDEwZjczN2Q0YTU2ODkxNTYyMDBlNDhhZDEyZCJ9.97Km63wUC6IaoSYE1Db8fAxYoW5N-ZQkbiw4kETN2cQ",
       }
    cookies = inquire_cookie(tao_tid_sums)
    if cookies == None:
        cookies ="11111111111111111111111"
        cookie1 = {
            "cookie": str(cookies) + ";x5sec=" + str(cookies_x5sec)
        }
    else:
        cookie1 = {
            "cookie": str(cookies) + ";x5sec=" + str(cookies_x5sec)
        }
    print("cookie111111111111111111111111111111111", cookie1)
    fl = open(ss, "rb")
    file = {"imgfile": (ss, fl, "image/jpeg")}
    proxies = mians()
    res = requests.post(request_url, proxies=proxies, headers=head, files=file, cookies=cookie1, timeout=20).text
    print(res)
    try:
        jsres = json.loads(res)
    except:print(res)
    else:
        try:
            tp_name = jsres["name"]
            return tp_name
        except:
            tb_url = jsres["url"]
            huakuai_url = "https://s.taobao.com"+str(tb_url)
            await reques_send(huakuai_url)


async def mouse_slide(page=None):
    await asyncio.sleep(1)
    await page.evaluate('window.scrollBy(400,0)')
    try:
        # 鼠标移动到滑块,按下,滑动到头(然后延时处理),松开按键
        await page.hover('#nc_1_n1z')  # 不同场景的验证码模块能名字不同。
    except:return 1, page
    try:
        await page.mouse.down()
        steps = random.randint(58, 80)
        print("steps:{}".format(steps))
        await page.mouse.move(2000, 0, {'steps':steps})
        await page.mouse.up()
    except Exception as e:
        print('{}:验证失败'.format(e))
        return None, page
    else:
        # 判断是否通过
        slider_again = await page.querySelector('.nc_iconfont.icon_warn')
        if slider_again!=None:
            print("验证失败")
            return None, page
        else:
            # await page.screenshot({'path': './headless-slide-result.png'}) # 截图测试
            print('验证通过')
            return 1, page


async def reques_send(url):
    proxies_url = "http://http-dyn.abuyun.com:9020"
    executablePath = r"C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe"
    browser = await launch({'ignoreHTTPSErrors': True, 'headless': False, 'dumpio': True, 'userDataDir': './data', '--enable-automation': False,'executablePath': executablePath,
                            'args': ['--no-sandbox', '--disable-infobars', '–window-size=2500,4877', '--disable-gpu']})
    # 创建页面
    page = await browser.newPage()
    # 设置页面大小
    proxyUser = "HU0UX3L04OEK853D"
    proxyPass = "7252DB6D989819C6"
    # await page.setExtraHTTPHeaders({'Proxy-Authorization': 'Basic ' + ('{"H56R2946P953B99D"}:{"8ADE908B093EFBB9"}').toString('base64')})
    # await page.setExtraHTTPHeaders({'Proxy-Authorization': 'Basic ' + proxyUser + ':' + proxyPass.toString('base64')})
    await page.setExtraHTTPHeaders({'Proxy-Authorization': 'Basic' + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii")).decode("utf8")})
    await page.setViewport({'width': 2500, 'height': 4877})  # 这个是你屏幕大小的宽高
    await page.setUserAgent('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36')
    await page.goto(url, {'timeout': 1000 * 50})
    await page.evaluate('''() =>{Object.defineProperties(navigator,{webdriver:{get: () => false}})}''')
    await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }')
    await page.evaluate('''() =>{ window.navigator.chrome = { runtime: {},  }; }''')
    await page.evaluate('''() =>{ Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] }); }''')
    await page.evaluate('''() =>{ Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5,6], }); }''')
    wsEndpoint = browser.wsEndpoint
    # 验证码破解
    jud_i = 0
    try:
        slider = await page.querySelector('#nc_1_n1z')
        if slider:
            print('当前页面出现滑块')
            # await page.screenshot({'path': './headless-login-slide.png'}) # 截图测试
            try:
                flag, page = await mouse_slide(page=page)  # js拉动滑块过去。
            except:
                flag = 1
            while True:
                if jud_i > 5:
                    break
                if flag:
                    print("验证成功")
                    await page.reload()
                    await asyncio.sleep(2)
                    cookie = await page.cookies()
                    print("taobao_tpid++++++++++++++++++++++++++++++++++",cookie)
                    await db_cookie(cookie)  # 获取滑动后的x5
                    break
                    print("================cookiecookie=========================")
                else:
                    jud_i += 1
                    await page.reload()
                    print("再次验证!!")
                    flag, page = await mouse_slide(page=page)
        else:
            print("无验证码")
    except Exception as e:
        print("验证码破解验证码破解验证码破解验证码破解验证码破解验证码破解",e)
    await browser.disconnect()
    browser = await connect({"browserWSEndpoint": wsEndpoint})
    pages = await browser.pages()
    page = pages[-1]
    await browser.close()


async def writecookie(cookie):
    with open('mycookie.json', 'w', encoding='utf8')as f:
        f.write(json.dumps(cookie))

async def db_cookie(cookies):
    cookie = {}
    for i in cookies:
        cookie[i["name"]] = i["value"]
    x5sec_sss = cookie["x5sec"]
    print("获取x5sec保存到数据库", x5sec_sss)
    cursor_tobao_tfsid.execute("update tobao_cookie set x5sec='" + x5sec_sss + "'where id=" + str(cookies_id))
    conn_tobao_tfsid.commit()
    # conn.close()
    await writecookie(cookie)  # 获取cookie 放入文件


async def main():
        ss = "C:/Users/Administrator/Desktop/11.jpg"
        await tao_tid(ss)


if __name__ == '__main__':
    while 1:
        asyncio.get_event_loop().run_until_complete(main())

我还有 淘宝以图搜图的接口 !! 如果有需要 大家可以加我QQ 657589436 互相学习 共同进步

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱笑的林羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值