2014-06-17 3 views
3

내 의도는 사이트에 로그인 한 다음 파이썬 스크립트에서 보호 된 이미지에 액세스하는 것입니다. 브라우저에서 합법적으로 액세스하고 작업 할 수 있습니다.Python : Requests 세션 로그인 쿠키

이것은 내가 지금 가지고있는 것입니다.

import requests 

s = requests.Session() 

s.get('*domain*') 

r_login =s.post('*domain*/user.php', headers={'cmd': 'login', 'loginname': '***', 'password': '***' }) 

print (s.cookies) 
print (r_login.status_code) 

r_img = s.get('*domain*/*protectedimage*.jpg') 
print (r_img.status_code) 
print (r.cookies) 

print (s.cookies['PHPSESSID']) 

출력 :

<<class 'requests.cookies.RequestsCookieJar'>[<Cookie PHPSESSID=664b0842085b847a04d415a22e013ad8 for *domain*/>]> 
200 
403 
<<class 'requests.cookies.RequestsCookieJar'>[]> 
664b0842085b847a04d415a22e013ad8 

내가 한 번 이렇게 한 후 HTML 파일을 다운로드하고,이 기록되는 형태이기 때문에 내가 성공적으로 로그인 할 수 있습니다 확신하지만 내. 문제는 내 PHPSESSID 쿠키가 전달되지 않아서 403 오류가 발생하는 것 같습니다. 하지만 제 세션에서 분명히 가지고 있습니다. 쿠키를 수동으로 내 "r_img" 행에 추가하려고 시도했지만 별 차이가 없었습니다. 여전히 비어있는 CookieJar403 오류가 발생합니다. 요청 모듈에서만 가능하지 않습니까? 내가 간과 했니? HTTP 요청에 대해 잘 모르시는 경우 실례합니다.

나는 명확성을 기하기 위해 Python 3.4를 사용하고 있습니다.

+0

쿠키를 설정하지 말고 POST 데이터를 설정해야합니다. 쿠키는 귀하가 게시하는 서버에 의해 설정됩니다. 내 대답을 보라. – data

답변

4

. 게시물 로그인 양식 대신 data 매개 변수로 폼 요소를 보내야합니다 :

r_login = s.post('*domain*/user.php', 
       data={'cmd': 'login', 'loginname': '***', 'password': '***' }) 

반환 된 몸 아닌 상태 코드를 검사 마십시오. POST 요청이 서버 (200 OK)에 접수되었지만 로그인 정보가 게시되지 않았기 때문에 본문에 '로그인이 잘못되었습니다. 다시 시도하십시오'와 같은 메시지가 표시됩니다.

이미지를 요청할 때 유효한 로그인 세션이 아니기 때문에 서버가 쿠키를 다시 지 웠을 가능성이 큽니다. 403 응답에는 PHPSESSID에 대한 Set-Cookie 헤더가 포함되어있을 수 있으며 이전에이 날짜를 지울 수 있습니다.

+0

멋진 작품! 고맙습니다. 난 그 방법에 대해 몰랐다. 내가해야 할 일은 "헤더"라는 단어를 "데이터"로 바꾸는 것뿐입니다. :) 이제 이미지를 다운로드 할 수 있습니다. @file = open ('myimg.jpg', 'wb') file.write (r_img.content) file.close() _ – Tigris

+1

@Tigris : 이미지를 다운로드하려면 (큰 이미지) 다운로드를 스트리밍하는 것이 좋습니다. 먼저 전체 다운로드를 메모리에 저장합니다.[요청을 사용하여 이미지를 다운로드하는 방법] 참조 (http://stackoverflow.com/q/13137817) –

+0

다시 한번 감사드립니다. 다행히 나는 작은 이미지 만 가져야했습니다. :) – Tigris

2

과 같이 그 일을보십시오 :

python-requests 사항에 따라 문서 : 당신은 HTTP 헤더으로 당신의 폼 데이터를 전달하는

payload = {'cmd': 'login', 'loginname': '***', 'password': '***'} 
url = '*domain*/user.php' 
s.post(url, data=payload) 
+0

감사합니다. 더 엄격하게 문서를 고집하는 것이 한 가지 해결책이었을 것입니다. – Tigris

+0

@Tigris 왜 Martine의 대답을 받아 들였고 내 것이 아닌지 자세히 설명해 주시겠습니까? 우리는 똑같은 코드를 가지고 있으며 나는 그에게 5 분 전에 대답했다. – data

+3

예, 선택해야 할 시간을 고려하지 않아서 미안합니다. 나는 답변을 유용하다고 표시했지만 Martjin도 자세한 설명을 제공했습니다. POST 메서드가 "데이터"매개 변수로 전송되어야한다는 사실을 알 필요가있었습니다. 그 비트가 내 문제를 해결했습니다. – Tigris