어떻게 Python 의 Requests 패 키 지 를 사용 하여 아 날로 그 로그 인 을 실현 합 니까?

얼마 전에 python 으로 페이지 를 잡 고 노 는 것 을 좋아 했 지만 대체적으로 get 으로 페이지 를 요청 한 다음 에 정규 로 걸 러 냈 습 니 다.
오늘 시험 해 봤 는데 개인 홈 페이지 에 모 의 접속 을 했 어 요.발견 도 간단 하 다.본 고 를 읽 으 려 면 http 프로 토 콜 과 http 세 션 에 대해 어느 정도 이해 해 야 합 니 다.
설명:아 날로 그 로그 인 은 제 개인 사이트 이기 때문에 다음 코드 는 개인 사이트 와 계 정 비밀 번 호 를 처리 합 니 다.
사이트 분석
파충류 의 필수 첫걸음,목표 사이트 분석.이곳 은 구 글 브 라 우 저의 개발 자 도구 분석 을 사용한다.
로그 인 캡 처 를 통 해 이러한 요청 을 볼 수 있 습 니 다.
상단 부분 은 요청 헤드 이 고,아래 부분 은 요청 이 전 달 된 매개 변수 입 니 다.그림 을 통 해 알 수 있 듯 이 페이지 는 폼 을 통 해 세 개의 인 자 를 제출 했다.각각csrf,usermane,password。
그 중에서 csrf 는 크로스 스 크 립 트 위 조 를 예방 하기 위해 서 입 니 다.원 리 는 간단 하 다.모든 요청 에 서버 가 암호 화 문자열 을 만 드 는 것 이다.숨겨 진 input 폼 에 넣 습 니 다.다시 한 번 요청 할 때 이 문자열 을 함께 보 냅 니 다.같은 사용자 의 요청 인지 확인 하기 위해 서 입 니 다.

그래서 우리 의 코드 논리 가 생 겼 다.우선 로그 인 페이지 를 요청 합 니 다.그리고 페이지 를 분석 하여 csrf 문자열 을 가 져 옵 니 다.마지막 으로 이 문자열 을 계 정 비밀번호 와 함께 서버 에 전송 하여 로그 인 합 니 다.
첫 번 째 코드

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

import requests
import re

#     
headers = {
 'Host':"localhost",
 'Accept-Language':"zh-CN,zh;q=0.8",
 'Accept-Encoding':"gzip, deflate",
 'Content-Type':"application/x-www-form-urlencoded",
 'Connection':"keep-alive",
 'Referer':"http://localhost/login",
 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
}

#     
def login(url,csrf):
 data = {
 "_csrf" : csrf,
 "username": "xiedj",
 "password": "***"
 }

 response = requests.post(url, data=data, headers=headers)
 return response.content


#        csrf 
def get_login_web(url):
 page = requests.get('http://localhost/login')
 reg = r'<meta name="csrf-token" content="(.+)">'
 csrf = re.findall(reg,page.content)[0]
 login_page = login(url,csrf)
 print login_page


if __name__ == "__main__":
 url = "http://localhost/login/checklogin"
 get_login_web(url)
코드 에 문제 가 없 는 것 같 습 니 다.실행 중 에 오류 가 발생 했 습 니 다.확인 해 보 니 잘못된 이 유 는 csrf 인증 이 실 패 했 기 때 문 입 니 다!
가 져 온 csrf 와 로그 인 을 요청 한 csrf 문자열 이 문제 가 없 음 을 여러 번 확인 한 후에 문제 가 생각 났 습 니 다.
잘못된 이 유 를 아직 모 르 신다 면 여기 서 한 가지 생각 을 잠시 멈 출 수 있 습 니 다.""서버 는 첫 번 째 csrf 요청 과 두 번 째 post 로그 인 요청 이 같은 사용자 라 는 것 을 어떻게 알 았 습 니까?"
로그 인 에 성공 하려 면 두 번 의 요청 이 같은 사용자 라 고 믿 게 하 는 방법 을 해결 해 야 한 다 는 것 을 잘 알 고 있 을 것 입 니 다.http 세 션 을 사용 해 야 합 니 다.
http 프로 토 콜 은 무상 태 프로 토 콜 입 니 다.이런 무 상 태 를 상태 있 게 만 들 기 위해 세 션 을 도입 했다.쉽게 말 하면 세 션 을 통 해 이 상 태 를 기록 합 니 다.사용자 가 웹 서 비 스 를 처음 요청 할 때 서버 는 이 사용자 의 정 보 를 저장 하기 위해 session 을 생 성 합 니 다.또한 사용자 측 에 되 돌아 갈 때 이 session ID 를 cookies 에 저장 합 니 다.사용자 가 다시 요청 할 때 브 라 우 저 는 이 cookies 를 가 져 옵 니 다.따라서 서버 에서 같은 사용자 인지 여러 번 요청 할 수 있 습 니 다.
따라서 저희 코드 는 첫 번 째 요청 때 이 session ID 를 받 아야 합 니 다.두 번 째 요청 때 이 session ID 를 같이 보 내 주세요.그리고 requests 가 대단한 점 은 간단 한 requests.Session()한 마디 로 이 세 션 대상 을 사용 할 수 있다 는 것 이다.
두 번 째 코드

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

import requests
import re

#     
headers = {
 'Host':"localhost",
 'Accept-Language':"zh-CN,zh;q=0.8",
 'Accept-Encoding':"gzip, deflate",
 'Content-Type':"application/x-www-form-urlencoded",
 'Connection':"keep-alive",
 'Referer':"http://localhost/login",
 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
}

#     
def login(url,csrf,r_session):
 data = {
 "_csrf" : csrf,
 "username": "xiedj",
 "password": "***"
 }

 response = r_session.post(url, data=data, headers=headers)
 return response.content


#        csrf 
def get_login_web(url):
 r_session = requests.Session()
 page = r_session.get('http://localhost/login')
 reg = r'<meta name="csrf-token" content="(.+)">'
 csrf = re.findall(reg,page.content)[0]


 login_page = login(url,csrf,r_session)
 print login_page


if __name__ == "__main__":
 url = "http://localhost/login/checklogin"
 get_login_web(url)
로그 인 한 페이지 를 성공 적 으로 가 져 왔 습 니 다.

코드 를 통 해 알 수 있 듯 이 requests.Session()이 세 션 대상 을 시작 하면 두 번 째 요청 은 자동 으로 지난번 session ID 를 함께 전달 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기