Python 시뮬레이션 로그인 Taobao

인터넷에 시뮬레이션 된 로그인 Taobao가 많지만 기본적으로 로그인을 시뮬레이션하기 위해 scrapy, pyppeteer, 셀레늄 및 기타 라이브러리를 사용했지만 이러한 라이브러리에 대해서는 언급하지 않았으며 요청 라이브러리 만 사용하고 오늘 요청을 사용할 것입니다. 도서관 시뮬레이션 로그인 Taobao!

Taobao에 대한 시뮬레이션 로그인에 대해 이야기하기 전에 요청 라이브러리를 사용하여 Douban 및 Sina Weibo에 대한 로그인을 시뮬레이션하는 이전 프로세스를 검토해 보겠습니다.이 유형의 시뮬레이션 로그인은 비교적 간단한 로그인입니다. 로그인을 요청할 때 사용자 이름과 비밀번호 만 업로드하면됩니다. , 그것은 한 단계로 말하는 것입니다!

Taobao 로그인이 더 복잡합니다. 왜 복잡합니까? Taobao 로그인에는 많은 매개 변수와 요청이 두 번 이상 포함되기 때문입니다! 먼저 Taobao 로그인 프로세스에 대해 이야기하고 먼저 프로세스 원리를 이해 한 다음 코드를 입력하여 모든 사람이 쉽게 이해할 수 있도록합니다!

1. Taobao 로그인 프로세스

Taobao ua 매개 변수 : ua (사용자-에이전트), 따라서 이름 사용자 에이전트, Taobao의 ua 매개 변수는 브라우저, IP, 컴퓨터, 시간 등과 같은 정보를 추가 한 다음 암호화되고 생성되어 로그인뿐만 아니라 여러 곳에서 사용됩니다!

위의 그림은 좀 더 자세한 순서도 이며, 코드 레벨을 고려할 때 Taobao에 대한 시뮬레이션 로그인은 다음 4 단계로 나뉩니다.

사용자 이름을 입력하면 브라우저가 Taobao (taobao.com)에 게시 요청을 시작하여 슬라이더 확인이 있는지 확인합니다!
사용자가 암호를 입력하면 브라우저는 사용자 이름과 암호가 올바른지 확인하기 위해 Taobao (taobao.com)에 대한 또 다른 게시 요청을 시작하고 올바른 경우 토큰을 반환합니다.
브라우저는 토큰을 Alibaba (alibaba.com)로 가져와 st 코드를 교환합니다!
브라우저가 st 코드를 얻은 후 st 코드를 가져와 쿠키를 얻습니다. 로그인이 성공한 후
일부 학생들은 질문 할 수 있습니다. Taobao (taobao.com) 인증을 통과 한 후 토큰을 Alibaba (alibaba.com)와 st 코드로 교환해야하는 이유 뭐? 나중에 이것에 대해 이야기하겠습니다!
둘째, 시뮬레이션 된 로그인의 구현
위에서 우리는 대략적인 로그인 프로세스에 대해서만 이야기했습니다. 여기서 Brother Pig는 먼저 작업의 각 단계를 자세히 설명하고 구현 코드를 게시합니다!

1. 인증 코드 필요 여부 확인
현재 타오바오에 로그인 할 때 슬라이더 인증 코드는 대부분의 경우 나타나지 않습니다. 돼지 형제의 로그인과 로그 아웃을 여러 번 시도했지만 중간에 한 번만 나타났습니다. 컨트롤에 슬라이더 확인 코드가 필요합니까?

위의 그림에서 알 수 있듯이 Brother Pig가 사용자 이름 (휴대폰 번호 여야 함)을 입력하면 브라우저가 슬라이더 확인 코드가 필요한지 확인하기 위해 게시 요청을 시작합니다. true가 반환되면 슬라이더 확인 코드가 나타납니다. ! 그렇지 않으면 나타나지 않고 일반적으로 나타나지 않습니다!

그림에서 두 개의 매개 변수가이 게시물 요청에 업로드 된 것을 볼 수 있습니다. 사용자 이름과 ua!

앞서 Pig 형제는 ua가 브라우저, IP, 장치 정보와 같은 여러 정보에 대한 매개 변수를 암호화한다고 말 했으므로 Pig 형제는 계정의 관점에서뿐만 아니라 IP 및 장비의 관점에서도 Taobao의 인증 코드가 나타나는지 여부를 추측했습니다!

예 : 장치에 로그인 된 계정이 많을 수 있습니다. 이때 Taobao는 ua 매개 변수에서 장치 번호를 얻은 다음 장치를 제한 할 수 있습니다!

2. 사용자 이름 및 비밀번호 확인

여기에있는 단계는 위의 시퀀스 다이어그램에서 다섯 번째 단계입니다. 로그인 요청, 여기에서는 사용자 이름, ua 매개 변수, 암호화 된 암호 등과 같은 30 개 이상의 매개 변수를 확인을 위해 Taobao (taobao.com)에 게시합니다. 코드를 사용하여 구현해 보겠습니다. 너무 많은 매개 변수에 놀라지 마십시오. 모두 브라우저에서 복사됩니다!

애플리케이션 코드 링크 뒤에 토큰이 있음을 알 수 있으며 나중에 특정 토큰을 분석 할 것입니다!

3. st 코드 신청

위의 Taobao (taobao.com)의 토큰을 이미 신청했으며,이 단계는 토큰을 st 코드로 교환하는 것입니다.

여기 많은 사람들이 질문을 할 수 있습니다. Taobao에 로그인하는 것이 왜 그렇게 번거로운가요? taobao.com에서 직접 로그인 할 수 있습니까? 먼저 Taobao에서 사용자 이름과 암호를 확인한 다음 alibaba.com으로 이동하여 st 코드 로그인으로 교환해야하는 이유는 무엇입니까?

모든 회사의 프레임 워크는 느린 진화의 결과이며 초기 Taobao 로그인은 확실히 그렇게 복잡하지 않다고 생각합니다. 하지만 알리바바의 성장과 함께 많은 비즈니스 라인이 나뉘어졌지만 이러한 비즈니스 라인은 관련이 있습니다. 예를 들어 사용자가 Taobao 계정에 로그인 한 후 Tmall이 다시 로그인 할 필요가 없습니까? (Taobao와 Tmall은 최상위 도메인이 다르기 때문에 cookis를 공유 할 수 없습니다.)이 문제를 해결하기 위해 싱글 사인온이 나타났습니다.

줄여서 SSO라고하는 단일 사인온 (Single Sign On)은 엔터프라이즈 비즈니스 통합을위한 가장 인기있는 솔루션 중 하나입니다. SSO의 정의는 여러 응용 프로그램 시스템에서 사용자가 한 번만 로그인하면 상호 신뢰할 수있는 모든 응용 프로그램 시스템에 액세스 할 수 있다는 것입니다. -바이두 백과 사전

거의 많은 대기업이 싱글 사인온을 수행하므로 Ali의 싱글 사인온 시스템은 모회사 Alibaba (alibaba.com)에서 수행해야하며 모든 자회사는 모회사 인터페이스를 호출합니다!

다시 돌아와서 Taobao 로그인이 왜 그렇게 복잡한 지 분석해 보겠습니다. 이해하기 쉽습니다. 사용자 데이터는 Taobao에 있으므로 Taobao (taobao.com)는 지금 사용자 이름과 비밀번호를 확인해야합니다. 확인 과정에서 토큰이 생성되고 브라우저는 알리에게 연락 할 토큰을 보유합니다. Baba (alibaba.com)는 싱글 사인온 코드 (st 코드)를 신청하고 Alibaba는 토큰 확인 요청을받은 후 st 코드를 반환하므로 토큰을 사용하여 st 코드를 변경하는 이유는 싱글 사인온입니다!

디자인 원칙을 이해하면 코드 구현이 매우 명확 해집니다!


4. st 코드로 로그인

st 코드를 성공적으로 획득 한 후 로그인 할 수 있습니다.이 단계는 st 코드를 통해 로그인 쿠키를 획득하는 것입니다.

이 시점에서 우리는 성공적으로 Taobao 로그인을 시뮬레이션했습니다!

5. Taobao 별명 얻기

사실 위는 타오바오에 성공적으로 로그인 한 후 사용자 홈페이지 링크로 돌아 왔습니다. 성공적인 로그인 확인을 위해 타오바오 사용자 홈페이지를 요청하고 타오바오 닉네임을 추출합니다!

셋, 요약

전체 프레젠테이션이 끝나면 주로 코드 구조와 기존 문제의 두 가지 측면에서 요약 해 보겠습니다.

1. 코드 구조

모든 사람이 직관적으로 이해할 수 있도록 코드 구조 다이어그램을 릴리스하려면

이것은 앞서 언급 한 Taobao에 대한 시뮬레이션 된 로그인의 4 단계이지만 여기에서는 코드로 구현했습니다!

2. 문제가 있습니다

이 튜토리얼을 작성하기 전에 인터넷에서 학습 한 다음 브라우저와 패킷 캡처 도구 (Charles)를 사용하여 단계별로 연습해야합니다. 가장 중요한 것은 먼저 Taobao 로그인의 일반적인 흐름을 이해해야한다는 것입니다. 그렇지 않으면 실제 작업에 혼란 스러울 것입니다. 물, 현재 문제와 기존 문제에 대해 이야기합시다.

우선 첫 번째 문제는 Taobao의 슬라이더 잠금 해제입니다. 현재 요청을 크래킹 할 수있는 좋은 방법이 없습니다. 크롤러 프레임 워크를 도입 한 후 크래킹합시다!
Brother Pig는 로그인 및 로그 아웃을 여러 번 (50 회 이상) 시도했지만 슬라이더 확인 코드가 나타나지 않았습니다.
어떤 사람들은 인터넷에서 프록시 IP를 사용하고 있으며 Brother Pig는 여기에서 쓸모가 없습니다. 당신이 매우 빈번하지 않고 많은 데이터를 크롤링하지 않는 한 일반적으로 대규모 제조업체는 잘못된 부상 률이 있고 사용자의 영향이 너무 넓기 때문에 IP를 차단하지 않을 것입니다. 폐쇄는 전체 커뮤니티입니다.
사용자 이름과 비밀번호를 확인하는 두 번째 단계에서는 약 30 개의 매개 변수가 업로드되었습니다. 사용자 이름, ua 및 암호화 된 비밀번호를 확인에 복사하면 30 개의 매개 변수를 브라우저로 바꿀 수 있습니다!
세 번째와 네 번째 단계에서 가끔 오류가 발생합니다. 다시 시도하세요!
여기를 보면 Taobao 시뮬레이션 로그인이 훨씬 더 명확하고 관심이있는 학생들은 북마크하고 전달하고 주말에 사용해 볼 수 있습니다. Taobao 로그인 정복, 다른 로그인은 비교적 간단합니다!

아래는 소스 코드입니다

# -*- coding:utf-8 -*-
import re
import os
import json
import requests


s = requests.Session()
# cookies序列化文件
COOKIES_FILE_PATH = 'taobao_login_cookies.txt'


class UsernameLogin:

    def __init__(self, username, ua, TPL_password2):
        """
        账号登录对象
        :param username: 用户名
        :param ua: 淘宝的ua参数
        :param TPL_password2: 加密后的密码
        """
        # 检测是否需要验证码的URL
        self.user_check_url = 'https://login.taobao.com/member/request_nick_check.do?_input_charset=utf-8'
        # 验证淘宝用户名密码URL
        self.verify_password_url = "https://login.taobao.com/member/login.jhtml"
        # 访问st码URL
        self.vst_url = 'https://login.taobao.com/member/vst.htm?st={}'
        # 淘宝个人 主页
        self.my_taobao_url = 'https://i.taobao.com/my_taobao.htm'

        # 淘宝用户名
        self.username = "手机号"
        # 淘宝关键参数,包含用户浏览器等一些信息,很多地方会使用,从浏览器或抓包工具中复制,可重复使用
        self.ua = ""
        # 加密后的密码,从浏览器或抓包工具中复制,可重复使用
        self.TPL_password2 = ""

        # 请求超时时间
        self.timeout = 3

    def _user_check(self):
        """
        检测账号是否需要验证码
        :return:
        """
        data = {
            'username': self.username,
            'ua': self.ua
        }
        try:
            response = s.post(self.user_check_url, data=data, timeout=self.timeout)
            response.raise_for_status()
        except Exception as e:
            print('检测是否需要验证码请求失败,原因:')
            raise e
        needcode = response.json()['needcode']
        print('是否需要滑块验证:{}'.format(needcode))
        return needcode

    def _verify_password(self):
        """
        验证用户名密码,并获取st码申请URL
        :return: 验证成功返回st码申请地址
        """
        verify_password_headers = {
redirectURL=https%3A%2F%2Fi.taobao.com%2Fmy_taobao.htm%3Fspm%3Da2d00.7723416.754894437.1.61531fc917M0p9%26ad_id%3D%26am_id%3D%26cm_id%3D%26pm_id%3D1501036000a02c5c3739',
            # ':scheme': 'https',
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
            'accept-encoding': 'gzip, deflate, br',
            'accept-language': 'zh-CN,zh;q=0.9',
            'cache-control': 'max-age=0',
            'content-length': '2858',
            'content-type': 'application/x-www-form-urlencoded',
            'sec-fetch-mode': 'navigate',
            'sec-fetch-site': 'same-origin',
            'sec-fetch-user': '?1',
            'Cache-Control': 'max-age=0',
            'Origin': 'https://login.taobao.com',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Referer': 'https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fi.taobao.com%2Fmy_taobao.htm%3Fspm%3Da2d00.7723416.754894437.1.61531fc917M0p9%26ad_id%3D%26am_id%3D%26cm_id%3D%26pm_id%3D1501036000a02c5c3739',
        }
        # 登录toabao.com提交的数据,如果登录失败,可以从浏览器复制你的form data
        verify_password_data = {
            'TPL_username': self.username,
            'ncoToken': '1f1389fac2a670101d8a09de4c99795e8023b341',
            'slideCodeShow': 'false',
            'useMobile': 'false',
            'lang': 'zh_CN',
            'loginsite': 0,
            'newlogin': 0,
            'TPL_redirect_url': 'https://i.taobao.com/my_taobao.htm?spm=a2d00.7723416.754894437.1.61531fc917M0p9&ad_id=&am_id=&cm_id=&pm_id=1501036000a02c5c3739',
            'from': 'tb',
            'fc': 'default',
            'style': 'default',
            'keyLogin': 'false',
            'qrLogin': 'true',
            'newMini': 'false',
            'newMini2': 'false',
            'loginType': '3',
            'gvfdcname': '10',
            # 'gvfdcre': '68747470733A2F2F6C6F67696E2E74616F62616F2E636F6D2F6D656D6265722F6C6F676F75742E6A68746D6C3F73706D3D613231626F2E323031372E3735343839343433372E372E356166393131643970714B52693126663D746F70266F75743D7472756526726564697265637455524C3D68747470732533412532462532467777772E74616F62616F2E636F6D253246',
            'TPL_password_2': self.TPL_password2,
            'loginASR': '1',
            'loginASRSuc': '1',
            'oslanguage': 'zh-CN',
            'sr': '1920*1080',
            # 'osVer': 'macos|10.145',
            'naviVer': 'chrome|78.039047',
            'osACN': 'Mozilla',
            'osAV': '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
            'osPF': 'Win32',
            'appkey': '00000000',
            'mobileLoginLink': 'https://login.taobao.com/member/login.jhtml?redirectURL=https://i.taobao.com/my_taobao.htm?spm=a2d00.7723416.754894437.1.61531fc917M0p9&ad_id=&am_id=&cm_id=&pm_id=1501036000a02c5c3739&useMobile=true',
            'showAssistantLink': 'false',
            'um_token': 'T274D86E0BEB4F2F2F527C889BADD92868CE10177BeFF895DE627CFE2D52A',
            'ua': self.ua
        }
        try:
            response = s.post(self.verify_password_url, headers=verify_password_headers, data=verify_password_data,
                              timeout=self.timeout)
            response.raise_for_status()
            # 从返回的页面中提取申请st码地址
        except Exception as e:
            print('验证用户名和密码请求失败,原因:')
            raise e
        # 提取申请st码url
        apply_st_url_match = re.search(r'<script src="(.*?)"></script>', response.text)
        # 存在则返回
        if apply_st_url_match:
            print('验证用户名密码成功,st码申请地址:{}'.format(apply_st_url_match.group(1)))
            return apply_st_url_match.group(1)
        else:
            raise RuntimeError('用户名密码验证失败!response:{}'.format(response.text))

    def _apply_st(self):
        """
        申请st码
        :return: st码
        """
        apply_st_url = self._verify_password()
        try:
            response = s.get(apply_st_url)
            # response.raise_for_status()
        except Exception as e:
            print('申请st码请求失败,原因:')
            raise e
        st_match = re.search(r'"data":{"st":"(.*?)"}', response.text)
        if st_match:
            print('获取st码成功,st码:{}'.format(st_match.group(1)))
            return st_match.group(1)
        else:
            raise RuntimeError('获取st码失败!response:{}'.format(response.text))
            # raise RuntimeError('获取st码失败!')

    def login(self):
        """
        使用st码登录
        :return:
        """
        # 加载cookies文件
        if self._load_cookies():
            return True
        # 判断是否需要滑块验证
        self._user_check()
        st = self._apply_st()
        headers = {
            'Host': 'login.taobao.com',
            'Connection': 'Keep-Alive',
            'User-Agent': '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
        }
        try:
            response = s.get(self.vst_url.format(st), headers=headers)
            response.raise_for_status()
        except Exception as e:
            print('st码登录请求,原因:')
            raise e
        # 登录成功,提取跳转淘宝用户主页url
        my_taobao_match = re.search(r'top.location.href = "(.*?)"', response.text)
        if my_taobao_match:
            print('登录淘宝成功,跳转链接:{}'.format(my_taobao_match.group(1)))
            self._serialization_cookies()
            return True
        else:
            raise RuntimeError('登录失败!response:{}'.format(response.text))

    def _load_cookies(self):
        # 1、判断cookies序列化文件是否存在
        if not os.path.exists(COOKIES_FILE_PATH):
            return False
        # 2、加载cookies
        s.cookies = self._deserialization_cookies()
        # 3、判断cookies是否过期
        try:
            self.get_taobao_nick_name()
        except Exception as e:
            os.remove(COOKIES_FILE_PATH)
            print('cookies过期,删除cookies文件!')
            return False
        print('加载淘宝登录cookies成功!!!')
        return True

    def _serialization_cookies(self):
        """
        序列化cookies
        :return:
        """
        cookies_dict = requests.utils.dict_from_cookiejar(s.cookies)
        with open(COOKIES_FILE_PATH, 'w+', encoding='utf-8') as file:
            json.dump(cookies_dict, file)
            print('保存cookies文件成功!')

    def _deserialization_cookies(self):
        """
        反序列化cookies
        :return:
        """
        with open(COOKIES_FILE_PATH, 'r+', encoding='utf-8') as file:
            cookies_dict = json.load(file)
            cookies = requests.utils.cookiejar_from_dict(cookies_dict)
            return cookies

    def get_taobao_nick_name(self):
        """
        获取淘宝昵称
        :return: 淘宝昵称
        """
        headers = {
            'User-Agent': '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
        }
        try:
            response = s.get(self.my_taobao_url, headers=headers)
            response.raise_for_status()
        except Exception as e:
            print('获取淘宝主页请求失败!原因:')
            raise e
        # 提取淘宝昵称
        nick_name_match = re.search(r'<input id="mtb-nickname" type="hidden" value="(.*?)"/>', response.text)
        if nick_name_match:
            print('登录淘宝成功,你的用户名是:{}'.format(nick_name_match.group(1)))
            return nick_name_match.group(1)
        else:
            raise RuntimeError('获取淘宝昵称失败!response:{}'.format(response.text))


if __name__ == '__main__':
    # 淘宝用户名
    username = '手机号'
    # 淘宝重要参数,从浏览器或抓包工具中复制,可重复使用
    ua = ''
    # 加密后的密码,从浏览器或抓包工具中复制,可重复使用
    TPL_password2 = ''
    ul = UsernameLogin(username, ua, TPL_password2)
    ul.login()

 

추천

출처blog.csdn.net/weixin_43407092/article/details/102975955