2014-04-24 154 views
1

民間, 試圖學習requests模塊爲python ...和一個簡單的項目,以拉任何未完成的停車票。python請求POST cookie會話

這是正確的方式來保存GETPOST請求之間的會話和Cookie?

#!/usr/bin/env python 

import requests 
import urllib 

session = requests.Session() 

tokenRequest = session.get('https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch') 
sessionToken = tokenRequest.cookies['__RequestVerificationToken'] 
sessionCookies = tokenRequest.cookies 
sessionHeaders = tokenRequest.headers 

payload = { 
    '__RequestVerificationToken': sessionToken, 
    'ItemSearchQuestionUserInput': 'myplate', 
    'Questions[0].IsRequired': 'True', 
    'Questions[0].Sequence': 1, 
    'Questions[0].Text': 'PlateNumber', 
    'Questions[0].Type': 'Text', 
    'ItemSearchQuestionUserInput[1].QuestionAnswer': 'NY', 
    'Questions[1].IsRequired': 'True', 
    'Questions[1].Sequence': 2, 
    'Questions[1].Text': 'State', 
    'Questions[1].Type': 'Text', 
    'Questions[2].IsRequired': 'False', 
    'Questions[2].Sequence': 3, 
    'Questions[2].Text': 'PlateType', 
    'Questions[2].Type': 'Text', 
    'SubmitButton': 'Continue' 
} 
raw = urllib.urlencode(payload) 
plateRequest = session.post('https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch/Submit', data=raw, headers=sessionHeaders, cookies=sessionCookies) 

print plateRequest.text 

似乎沒有工作...林肯定它的東西簡單我失蹤。他們的網址是:https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch

謝謝!

+0

也沒有,他們沒有一個公共API ... – Cmag

+1

有兩個__RequestVerificationToken:先在餅乾和第二的HTML代碼:<輸入名稱=‘__ RequestVerificationToken’類型=‘隱藏’值=」 some_value「/>」。並且來自html的這個令牌應該被放置在有效載荷= { '__RequestVerificationToken':token_from_html}中。但它仍然沒有幫助:(。 – NorthCat

+0

@NorthCat是的,它很爛。希望他們有一個簡單的休息api。反正,你認爲我們在哪裏犯了一個錯誤? – Cmag

回答

4

看起來服務器特別關於接收明確的Content-Type: application/x-www-form-urlencoded標頭,其中requests默認情況下不會發送。此外,如果您在表單中將其作爲__RequestVerificationToken提交,它將不會接受__RequestVerificationToken cookie的值 - 您需要解析https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch返回的表單中的實際值。您的表單數據也不會遵循原始表單中的實際輸入字段 - 您已省略其中的一部分,並且您通過ItemSearchQuestionUserInput而不是ItemSearchQuestionUserInput[0].QuestionAnswer。另一件事是,你實際上提供了響應從第一個請求接收到的標頭爲請求第二個標頭,這沒有多大意義 - 這兩個上下文不像您所設想的那樣可以互換。

我修改了您的代碼,直到收到「我們找不到任何匹配項,請檢查您的輸入並重試。」消息,我在瀏覽器中提交表單時也會收到這樣的消息 - 我沒有真正的美國車牌進行測試。請注意,我在lxml module上引入了一個額外的依賴關係,用於解析第一個請求返回的表單。

#!/usr/bin/env python 

import requests 
import urllib 
from lxml import etree 

session = requests.Session() 
session.headers.update({'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'}) 

tokenRequest = session.get('https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch') 

parser = etree.HTMLParser() 
tree = etree.fromstring(tokenRequest.text, parser) 
verificationToken = tree.xpath('//form//input[@name="__RequestVerificationToken"]/@value')[0] 

sessionCookies = tokenRequest.cookies 

payload = { 
    '__RequestVerificationToken': verificationToken, 
    'ItemSearchQuestionUserInput[0].QuestionAnswer': 'myplate', 
    'Questions[0].IsRequired': 'True', 
    'Questions[0].Options': '', 
    'Questions[0].DefaultAnswer': '', 
    'Questions[0].Sequence': 1, 
    'Questions[0].Text': 'PlateNumber', 
    'Questions[0].Type': 'Text', 
    'ItemSearchQuestionUserInput[1].QuestionAnswer': 'NY', 
    'Questions[1].IsRequired': 'True', 
    'Questions[1].Options': '', 
    'Questions[1].DefaultAnswer': '', 
    'Questions[1].Sequence': 2, 
    'Questions[1].Text': 'State', 
    'Questions[1].Type': 'Text', 
    'ItemSearchQuestionUserInput[2].QuestionAnswer': '', 
    'Questions[2].IsRequired': 'False', 
    'Questions[2].Options': '', 
    'Questions[2].DefaultAnswer': '', 
    'Questions[2].Sequence': 3, 
    'Questions[2].Text': 'PlateType', 
    'Questions[2].Type': 'Text', 
    'SubmitButton': 'Continue' 
} 

raw = urllib.urlencode(payload) 
headers = { 
    'Content-Type': 'application/x-www-form-urlencoded', 
} 
plateRequest = session.post('https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch/Submit', data=raw, cookies=sessionCookies, headers=headers) 

print plateRequest.text 
+0

完美,謝謝。當它允許我時,將獎賞賞金:) – Cmag

+1

如果你在字典中使用'params'請求'發送'application/x-www-form-urlencoded' POST精細。 –

+0

@MartijnPieters啊,那可能是真的。我只注意到它不會將內容類型標題與OP提供的代碼一起發送。 – lanzz