[python] Python의 요청 모듈을 사용하여 웹 사이트에 “로그인”하는 방법은 무엇입니까?

Python의 Requests 모듈을 사용하여 웹 사이트에 로그인하라는 요청을 게시하려고했지만 실제로는 작동하지 않습니다. 나는 이것에 익숙하지 않아 … 내 사용자 이름 및 암호 쿠키를 만들어야하는지 또는 내가 찾은 (??) 일부 유형의 HTTP 인증 항목을 만들어야하는지 알 수 없습니다.

from pyquery import PyQuery
import requests

url = 'http://www.locationary.com/home/index2.jsp'

그래서 지금은 “포스트”와 쿠키를 사용해야한다고 생각합니다 ..

ck = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}

r = requests.post(url, cookies=ck)

content = r.text

q = PyQuery(content)

title = q("title").text()

print title

쿠키를 잘못하고 있다는 느낌이 들어요 … 모르겠어요.

올바르게 로그인되지 않으면 홈 페이지 제목이 “Locationary.com”에 나와야하고 그렇지 않으면 “홈 페이지”가되어야합니다.

요청 및 쿠키에 대한 몇 가지 사항을 설명해 주시고 도움을 주시면 감사하겠습니다. :디

감사.

… 아직 작동하지 않았습니다. 좋아요 … 로그인하기 전에 홈페이지 HTML이 말하는 내용입니다.

</td><td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_email.gif">    </td>
<td><input class="Data_Entry_Field_Login" type="text" name="inUserName" id="inUserName"  size="25"></td>
<td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_password.gif"> </td>
<td><input  class="Data_Entry_Field_Login"  type="password" name="inUserPass"     id="inUserPass"></td>

그래서 제대로하고 있다고 생각하지만 출력은 여전히 ​​”Locationary.com”입니다.

두 번째 편집 :

오랫동안 로그인 상태를 유지하고 싶고 해당 도메인에서 페이지를 요청할 때마다 콘텐츠가 로그인 한 것처럼 표시되기를 원합니다.



답변

원하는 정보가 페이지에 있으면 로그인 후 바로 연결됩니다.

python-requests 문서 에서와 같이 대신 ck변수 payload를 호출 할 수 있습니다 .

payload = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
url = 'http://www.locationary.com/home/index2.jsp'
requests.post(url, data=payload)

그렇지 않으면…

아래 https://stackoverflow.com/a/17633072/111362를 참조 하십시오 .


답변

나는 당신이 다른 해결책을 찾았다는 것을 알고 있지만, 같은 질문을 찾는 저와 같은 사람들에게는 다음과 같은 요청을 통해 얻을 수 있습니다.

먼저 Marcus가 한 것처럼 로그인 양식의 소스를 확인하여 양식이 게시되는 URL과 사용자 이름 및 비밀번호 필드의 이름 속성이라는 세 가지 정보를 얻습니다. 그의 예에서는 inUserName 및 inUserPass입니다.

그런 다음 requests.Session()인스턴스를 사용 하여 로그인 세부 정보를 페이로드로 사용하여 로그인 URL에 게시 요청을 할 수 있습니다 . 세션 인스턴스에서 요청을 만드는 것은 일반적으로 요청을 사용하는 것과 본질적으로 동일하며 단순히 지속성을 추가하여 쿠키 등을 저장하고 사용할 수 있습니다.

로그인 시도가 성공했다고 가정하면 세션 인스턴스를 사용하여 사이트에 추가 요청을 할 수 있습니다. 귀하를 식별하는 쿠키는 요청을 승인하는 데 사용됩니다.

import requests

# Fill in your details here to be posted to the login form.
payload = {
    'inUserName': 'username',
    'inUserPass': 'password'
}

# Use 'with' to ensure the session context is closed after use.
with requests.Session() as s:
    p = s.post('LOGIN_URL', data=payload)
    # print the html returned or something more intelligent to see if it's a successful login page.
    print p.text

    # An authorised request.
    r = s.get('A protected web page url')
    print r.text
        # etc...


답변

간단하게 만들어 보겠습니다. 사이트의 URL이 http://example.com/ 이고 사용자 이름과 비밀번호를 입력하여 가입해야한다고 가정 해 보겠습니다. 그러면 http : // example 이라는 로그인 페이지로 이동합니다 . com / login.php 이제 소스 코드를보고 다음과 같은 형식 태그에있는 작업 URL을 검색합니다.

 <form name="loginform" method="post" action="userinfo.php">

이제 userinfo.php를 사용하여 ‘ http://example.com/userinfo.php ‘ 가 될 절대 URL을 만들고 이제 간단한 파이썬 스크립트를 실행하십시오.

import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
          'password': 'pass'}

r = requests.post(url, data=values)
print r.content

언젠가 누군가에게 도움이되기를 바랍니다.


답변

웹 사이트 양식에서 사용자 이름 <...name=username.../>과 비밀번호 에 사용 된 입력 이름을 찾아 <...name=password../>아래 스크립트에서 대체하십시오. 또한 로그인 할 사이트를 가리 키도록 URL을 바꿉니다.

login.py

#!/usr/bin/env python

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
payload = { 'username': 'user@email.com', 'password': 'blahblahsecretpassw0rd' }
url = 'https://website.com/login.html'
requests.post(url, data=payload, verify=False)

을 사용 disable_warnings(InsecureRequestWarning)하면 확인되지 않은 SSL 인증서가있는 사이트에 로그인하려고 할 때 스크립트의 출력이 모두 무음 으로 표시 됩니다.

특별한:

UNIX 기반 시스템의 명령 줄에서이 스크립트를 실행하려면 디렉토리에 배치합니다. 즉 home/scripts,이 디렉토리를 ~/.bash_profile터미널에서 사용하는 경로 또는 유사한 파일에 추가합니다.

# Custom scripts
export CUSTOM_SCRIPTS=home/scripts
export PATH=$CUSTOM_SCRIPTS:$PATH

그런 다음 내부 에이 파이썬 스크립트에 대한 링크를 만듭니다. home/scripts/login.py

ln -s ~/home/scripts/login.py ~/home/scripts/login

터미널을 닫고 새 터미널을 시작한 다음 실행 login


답변

requests.Session()솔루션은 CSRF 보호 (Flask-WTF 양식에서 사용됨)를 사용하여 양식에 로그인하는 데 도움이되었습니다. csrf_token숨겨진 필드로이 필요한지 확인 하고 사용자 이름과 비밀번호를 사용하여 페이로드에 추가합니다.

import requests
from bs4 import BeautifulSoup

payload = {
    'email': 'email@example.com',
    'password': 'passw0rd'
}

with requests.Session() as sess:
    res = sess.get(server_name + '/signin')
    signin = BeautifulSoup(res._content, 'html.parser')
    payload['csrf_token'] = signin.find('input', id='csrf_token')['value']
    res = sess.post(server_name + '/auth/login', data=payload)


답변