from selenium import webdriver
from chaojiying import Chaojiying_Client
import time
from lxml import etree
from urllib.request import urlretrieve
import requests

# 1、把验证码图片下载下来
# 2、交给打码平台进行打码

# 在请求的时候自动保存cookie
seession = requests.Session()

def get_img(url):
    """
    下载验证码图片
    :return:
    """
    # 打开浏览器
    driver = webdriver.Chrome()
    # 自动输入网址
    time.sleep(5)
    # 打开指定的url地址
    driver.get(url)
    # selenium  智能等待方式:显性等待   隐性等待  30
    time.sleep(2)
    # 获取网站内的html源码
    res = driver.page_source
    # 进行数据转换  注意:res就是页面html源码   不是对象  所以不用再调用text方法
    html = etree.HTML(res)
    # xpath匹配验证码图片  xpath返回的是一个列表
    img_code = html.xpath('//img[@id="verifyimg"]/@src')[0]
    # print(img_code)
    # 下载验证码图片   第一个参数应该是一个字符串
    urlretrieve(img_code,"code.jpg")

def get_code():
    """
    处理验证码
    :return:
    """
    chaojiying2 = Chaojiying_Client('ipython', 'qq6218346', '4004')  # 用户中心>>软件ID 生成一个替换 96001
    im = open("code.jpg", 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    code = chaojiying2.PostPic(im, 1902)
    return code["pic_str"]

def login(url,new_url,headers,code):
    """
    登陆个人中心
    :return:
    """
    data = {
        "next":"",
        "kf5_return_to":"",
        "username":"18632229371",
        "passwd": "qq123456",
        "code": code
     }
    # 当我们请求url这个地址的时候   会生成一个cookie
    # 所以当我们在请求的时候要顺便把cookie保存下来
    seession.post(url=url,data=data,headers=headers)
    # 带着cookie去请求个人中心
    response = seession.get(url=new_url,headers=headers)
    res = response.text
    return res

if __name__ == '__main__':
    url = "https://www.kuaidaili.com/login/"
    new_url = "https://www.kuaidaili.com/usercenter/"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
    }
    get_img(url)
    time.sleep(5)
    # code 就是我们解析出来的验证码内容
    code = get_code()
    time.sleep(3)
    html = login(url=url,new_url=new_url,headers=headers,code=code)
    with open("daili.html","w",encoding="utf-8") as f:
        f.write(html)