2009-06-11 6 views
0

私はthisで質問したことを私にさせるPHPスクリプトを見つけました。私はこれをうまく使うことができますが、私はPythonで次のコードを作り直したいと思います。このPHPコードをPythonで再作成するには?

もちろん、urllib2を使ってページを取得することはできますが、機械化してからCookieを処理する方法が失われています(WindowsとPython 2.5でUbuntuでテストされています...最新機械化版)がページ上で壊れているようです。どのように私はこれを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 huh?なぜ3を試してみませんか? –

+0

@Beau Martinez freenode #pythonチャンネルのトピックを引用するには "python 3.xを使用するには早すぎます" – baudtack

+0

Beau、3.xには多くの矛盾があります(例えばwsgirefを見てください)。 2.xから3.x(2to3を使用)に移行するのは簡単ですが、他の方法に簡単に移行する方法はありません。 –

答えて

6

、もう少し簡潔な。

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がインストールされます。私のソリューションはグローバルな状態を変更しません。

+0

+1とあなたのモンクットの答え...彼らは完璧な組み合わせになります:-) –

+0

ニース、私はよく知りませんでしたurllib2.Requestオブジェクトを使用します。これは、Therms PHPによく似ています。 – monkut

5

私はPHPに精通していませんが、これが始まる可能性があります。 私はここにオープナーをインストールしています。これはurlopenメソッドに適用されます。オープナーをインストールしたくない場合は、オープナーオブジェクトを直接使用することができます。 (opener.open(url、data))。

はを参照してください: monkutの答えと同様に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) 
+0

+1とあなたとMizardXの両方の答え...彼らは完璧に結びついているでしょう:-) –

関連する問題