如何在Python中重现这段PHP代码?

0 投票
2 回答
550 浏览
提问于 2025-04-15 12:11

我找到了一段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,这样可以在不同的请求之间保存饼干。而我的方法则没有改变全局的状态。

撰写回答