如何在Python中重现这段PHP代码?
我找到了一段PHP脚本,可以让我实现我在这个 StackOverflow问题中提到的功能。我可以顺利使用这个脚本,但出于好奇,我想用Python重新写一遍下面的代码。
当然,我可以用urllib2来获取网页,但我不知道怎么处理cookies,因为在Windows上用Python 2.5和2.6,以及在Ubuntu上用Python 2.5测试的mechanize似乎在这个页面上出现了问题。我该如何在Python中做到这一点呢?
require_once "HTTP/Request.php";
$req = &new HTTP_Request('https://steamcommunity.com');
$req->setMethod(HTTP_REQUEST_METHOD_POST);
$req->addPostData("action", "doLogin");
$req->addPostData("goto", "");
$req->addPostData("steamAccountName", ACC_NAME);
$req->addPostData("steamPassword", ACC_PASS);
echo "Login: ";
$res = $req->sendRequest();
if (PEAR::isError($res))
die($res->getMessage());
$cookies = $req->getResponseCookies();
if ( !$cookies )
die("fail\n");
echo "pass\n";
foreach($cookies as $cookie)
$req->addCookie($cookie['name'],$cookie['value']);
2 个回答
5
我对PHP不太熟悉,但这可能会帮你入门。这里我正在安装一个“打开器”,它会应用到urlopen这个方法上。如果你不想“安装”这个打开器,你可以直接使用打开器对象(opener.open(url, data))。
参考链接: http://docs.python.org/library/urllib2.html?highlight=urllib2#urllib2.install_opener
import urlib2
import urllib
# 1 create handlers
cookieHandler = urllib2.HTTPCookieProcessor() # Needed for cookie handling
redirectionHandler = urllib2.HTTPRedirectHandler() # needed for redirection
# 2 apply the handler to an opener
opener = urllib2.build_opener(cookieHandler, redirectionHandler)
# 3. Install the openers
urllib2.install_opener(opener)
# prep post data
datalist_tuples = [ ('action', 'doLogin'),
('goto', ''),
('steamAccountName', ACC_NAME),
('steamPassword', ACC_PASS)
]
url = 'https://steamcommunity.com'
post_data = urllib.urlencode(datalist_tuples)
resp_f = urllib2.urlopen(url, post_data)
6
这个回答和monkut的有点像,但更简洁一些。
import urllib, urllib2
def steam_login(username,password):
data = urllib.urlencode({
'action': 'doLogin',
'goto': '',
'steamAccountName': username,
'steamPassword': password,
})
request = urllib2.Request('https://steamcommunity.com/',data)
cookie_handler = urllib2.HTTPCookieProcessor()
opener = urllib2.build_opener(cookie_handler)
response = opener.open(request)
if not 200 <= response.code < 300:
raise Exception("HTTP error: %d %s" % (response.code,response.msg))
else:
return cookie_handler.cookiejar
它返回一个“饼干罐”,你可以在其他请求中使用这个“饼干罐”。只需要把它传给HTTPCookieProcessor
的构造函数就可以了。
monkut的回答是安装了一个全局的HTTPCookieProcessor
,这样可以在不同的请求之间保存饼干。而我的方法则没有改变全局的状态。