12306 自动登录 + 自动链

# 1 生成一个动作练对象
action=ActionChains(bro)

# 2 点击并夯住某个控件
action.click_and_hold(div)

# 3 移动(三种方式)
# action.move_by_offset() # 通过坐标
# action.move_to_element() # 到另一个标签
# action.move_to_element_with_offset() # 到另一个标签,再偏移一部分

# 4 真正的移动
action.perform()

# 5 释放控件(松开鼠标)
action.release()

chaojiying.py

#!/usr/bin/env python
# coding:utf-8

import requests
from hashlib import md5


class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password = password.encode('utf8')

        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }


    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
                          headers=self.headers)
        return r.json()


    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()


if __name__ == '__main__':
    chaojiying = Chaojiying_Client('306334678', 'lqz123', '903641')  # 用户中心>>软件ID 生成一个替换 96001
    im = open('a.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print(chaojiying.PostPic(im, 1902)) # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()

12306.py

# 自动登录12306

# pip3 install pillow

from PIL import Image
from chaojiying import Chaojiying_Client
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
import json
import requests
bro =webdriver.Chrome()
bro.get('https://kyfw.12306.cn/otn/login/init')

bro.implicitly_wait(10)

# 因为selenium没有直接截取某个元素的功能,现在需要截取全图,然后通过图形软件,再把小图扣出来
# bro.minimize_window()  #最小化
# bro.maximize_window() #最大化
# save_screenshot 截取整个屏幕
bro.save_screenshot('main.png')
tag_code =bro.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')

# 查看控件的位置和大小
size =tag_code.size
location =tag_code.location
print('size', size)
print('location', location)

img_tu = (int(location['x']) ,int(location['y']) ,int(location['x' ] +size['width']) ,int(location['y' ] +size['height']))
# # 抠出验证码
# #打开
img =Image.open('./main.png')
# 抠图
fram =img.crop(img_tu)
# 截出来的小图
fram.save('code.png')

# 调用超级鹰,破解

def get_result():
    chaojiying = Chaojiying_Client('306334678', 'lqz123', '903641')  # 用户中心>>软件ID 生成一个替换 96001
    im = open('code.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print(chaojiying.PostPic(im, 9004)) # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    return chaojiying.PostPic(im, 9004)['pic_str']


# 返回结果如果有多个 260,133|123,233,处理这种格式[[260,133],[123,233]]
result=get_result()
all_list=[]
if '|' in result:
    list_1 = result.split('|')
    count_1 = len(list_1)
    for i in range(count_1):
        xy_list = []
        x = int(list_1[i].split(',')[0])
        y = int(list_1[i].split(',')[1])
        xy_list.append(x)
        xy_list.append(y)
        all_list.append(xy_list)
else:
    x = int(result.split(',')[0])
    y = int(result.split(',')[1])
    xy_list = []
    xy_list.append(x)
    xy_list.append(y)
    all_list.append(xy_list)
print(all_list)

# 用动作链,点击图片
# [[260,133],[123,233]]
for a in all_list:
    x = a[0]
    y = a[1]
    ActionChains(bro).move_to_element_with_offset(tag_code, x, y).click().perform()
    time.sleep(1)
username=bro.find_element_by_id('username')
username.send_keys("user")
pwd=bro.find_element_by_id('password')
pwd.send_keys('pwd')
submit=bro.find_element_by_id('loginSub')
submit.click()

#获取cookie
# 使用requests模块,携带cookie朝某个接口发请求
time.sleep(3)
c = bro.get_cookies()
print(c)
with open('xxx.json', 'w') as f:
    json.dump(c, f)


# cookies = {}
# # 获取cookie中的name和value,转化成requests可以使用的形式
# for cookie in c:
#     cookies[cookie['name']] = cookie['value']
#
# print(cookies)
#
with open('xxx.json', 'r') as f:
    di = json.load(f)
cookies = {}
# 获取cookie中的name和value,转化成requests可以使用的形式
for cookie in di:
    cookies[cookie['name']] = cookie['value']

print('---------')
print(cookies)
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36',
    'Referer': 'https://kyfw.12306.cn/otn/view/information.html',
    'Origin': 'https://kyfw.12306.cn',
    'Host': 'kyfw.12306.cn',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'X-Requested-With': 'XMLHttpRequest',
    # 'Cookie':'JSESSIONID=5E0ADB0562F67D12821C1031B4C0D6C5; tk=h8F7smXhBU8PH3aIYHxCu5fR86HnywJ7BNF8sAets1s0; route=9036359bb8a8a461c164a04f8f50b252; BIGipServerpool_passport=233636362.50215.0000; RAIL_EXPIRATION=1586657272770; RAIL_DEVICEID=mWh29ziIiHHcSeSRm2Lp4kpamkdA3c6Cpi9gDQQN_rTcgI5UPn_FyMY8mdO5Vinhk4vyn_zW-rP2bmqeO8WKSzsuhOMhGru6qIQCIVDIYPEJtIF7PfoQkSD8koFHdQ9pLaUH5jwoYeYqxM6bA0GRghJELkd2zvHs; BIGipServerpassport=971505930.50215.0000; BIGipServerotn=1105723658.24610.0000'
    # 'Cookie':json.dumps(cookies)
}
#https://kyfw.12306.cn/otn/modifyUser/initQueryUserInfoApi
res = requests.post('https://kyfw.12306.cn/otn/modifyUser/initQueryUserInfoApi',headers=headers,
                  cookies=cookies )
print(res.cookies.get_dict())
print(res.text)


原文地址:https://www.cnblogs.com/kai-/p/12700279.html