web-dev-qa-db-ja.com

HTTP POSTおよびpython

私のIDとパスワードを使用して大学のサイトにログインするpythonプログラムを作成しようとしています。これは、ログイン用の正式なページです https:// webapp。 pucrs.br/consulta/

お気づきかもしれませんが、2つのフィールドの名前はpr1とpr2です。ページはPOST=を使用してデータを送信します。また、ページがロードされるときにダウンロードされるCookieがあります。これはランダム値を含むJSESSIONIDであり、私が理解しているように、ログインを認証するPOSTメソッドのヘッダー.

次のコードを書きましたが、GETメソッドの戻りページに「セッションが初期化されていません」と表示されているため、Cookieが正しく返されなかった可能性があります。

from urllib2 import Request, build_opener, HTTPCookieProcessor, HTTPHandler
import httplib, urllib, cookielib, Cookie, os

conn = httplib.HTTPConnection('webapp.pucrs.br')

#COOKIE Finder
cj = cookielib.CookieJar()
opener = build_opener(HTTPCookieProcessor(cj),HTTPHandler())
req = Request('http://webapp.pucrs.br/consulta/principal.jsp')
f = opener.open(req)
html = f.read()
for cookie in cj:
    c = cookie
#FIM COOKIE Finder

params = urllib.urlencode ({'pr1':111049631, 'pr2':<pass>})
headers = {"Content-type":"text/html",
           "Set-Cookie" : "JSESSIONID=70E78D6970373C07A81302C7CF800349"}
            # I couldn't set the value automaticaly here, the cookie object can't be converted to string, so I change this value on every session to the new cookie's value. Any solutions?

conn.request ("POST", "/consulta/servlet/consulta.aluno.ValidaAluno",params, headers) # Validation page
resp = conn.getresponse()

temp = conn.request("GET","/consulta/servlet/consulta.aluno.Publicacoes") # desired content page
resp = conn.getresponse()

print resp.read()

ログインが認証されるように、このCookieをどこに配置すればよいですか?

13
Lucas C. Feijo

requestsライブラリを使用してみます。 documentation は優れており、コードはurllib*よりもはるかにクリーンになります

$ pip install requests

単独でCookieを処理する session (Piotrによるコメントを参照)を使用すると、結果は次のようになります。

import requests
url_0 = "http://webapp.pucrs.br/consulta/principal.jsp"
url = "https://webapp.pucrs.br/consulta/servlet/consulta.aluno.ValidaAluno"
data = {"pr1": "123456789", "pr2": "1234"}

s = requests.session()
s.get(url_0)
r = s.post(url, data)

pr1 123456789と "Sehnainválida"にユーザー番号が記載された "Usuario inexistente"の通知が届いたため、問題なく動作しているようです。

20
jorgeca

すべてのリクエストに対して作成したのと同じ「オープナー」を使用する必要があり、それ自体がCookieをすべて処理します。

ここに私が最近書いたものの抜粋があります

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))

# then for all requests

if postData:     
    pData =  urllib.urlencode(postData)
else:
    pData = None

httpReq = urllib2.Request(url, pData, self._headers)
page =  opener.open(httpReq)
7
MatthieuW

MatthieuWの回答をPython 3に変換すると、3が得られます。

import urllib, http.cookiejar

opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()))
# then for all requests

if postData:     
    pData =  urllib.parse.urlencode(postData)
else:
    pData = None

httpReq = urllib.request.Request(url, pData)
page =  opener.open(httpReq)
5
PearsonArtPhoto

urllibは良くありません、リクエストを使用してください!

from requests import Request, Session

url = "https://webapp.pucrs.br/consulta/principal.jsp"
s = requests.Session()

p = dict(pb1 = 'dd', pb2 = 'cc')
r = s.get(url, params = p) 
# use the cert=/path/to/certificate.pem if you need it
# elsewhere use verify = False to bypass ssl verification

c = r.cookies

# Then send back a response using those same cookies

r = requests.get(other_url, cookies = c, verify = False)
1
TheEnglishMe

mechanize を使用することをお勧めします。これは、セッション/ cookies /ログインを自動的に処理し、さらにurllibのようなAPIを提供します。 form-fillingを使用すると、mechanizeによって構築されるため、正しいPOSTリクエストをいじる必要がありません。

1
dav1d