如何在Python中重新创建这个PHP代码?

Dus*_*att 0 php python forms automation http

我找到了一个PHP脚本,让我做什么,我问这个太问题.我可以很好地使用它,但出于好奇,我想在Python中重新创建以下代码.

我当然可以使用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']);
Run Code Online (Sandbox Code Playgroud)

Mar*_*rot 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
Run Code Online (Sandbox Code Playgroud)

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

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


mon*_*kut 5

我不熟悉PHP,但这可能会让你开始.我正在这里安装opener,它将把它应用到urlopen方法.如果您不想"安装"开启者,可以直接使用开启者对象.(opener.open(url,data)).

请参阅:http: //docs.python.org/library/urllib2.html?highlightlight = 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)
Run Code Online (Sandbox Code Playgroud)