2009-06-11 48 views
0

我发现了一个PHP脚本,可以让我做我在this SO问的问题。我可以使用这个很好,但出于好奇,我想在Python中重新创建下面的代码。如何在Python中重新创建这个PHP代码?

我当然可以使用urllib2来获取页面,但是我对如何处理cookie自从机械化(在Windows上使用Python 2.5和2.6进行测试以及在Ubuntu上使用Python 2.5进行测试...都是最新的机械化版本)似乎打破了页面。我如何在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']); 
+0

2.6呵?为什么不尝试3? – 2009-06-11 23:13:50

+0

@Beau Martinez引用freenode #python频道中的话题“现在使用python 3.x太早” – baudtack 2009-06-11 23:18:11

+0

Beau,3.x有很多不一致之处(比如看一下wsgiref)。从2.x移动到3.x(使用2to3)很容易,但无法轻易走向另一条路。 – 2009-06-11 23:20:12

回答

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 

它返回cookie jar,您可以在其他请求中使用它。只需将它传递给构造函数HTTPCookieProcessor即可。

monkut的答案安装了一个全球HTTPCookieProcessor,它在请求之间存储cookie。我的解决方案不会修改全局状态。

5

我不熟悉PHP,但这可能会让你开始。 我在这里安装opener,将它应用到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)