4

このコード スニペットを PHP から Python (プログラミング初心者) に変換しようとしていますが、そうするのが難しいと感じています。

変換しようとしているPHPは次のとおりです。

$fp = fsockopen($whmcsurl, 80, $errno, $errstr, 5);
if ($fp) {
$querystring = "";
foreach ($postfields AS $k=>$v) {
$querystring .= "$k=".urlencode($v)."&";
}
$header="POST ".$whmcsurl."modules/servers/licensing/verify.php HTTP/1.0\r\n";
$header.="Host: ".$whmcsurl."\r\n";
$header.="Content-type: application/x-www-form-urlencoded\r\n";
$header.="Content-length: ".@strlen($querystring)."\r\n";
$header.="Connection: close\r\n\r\n";
$header.=$querystring;
$data="";
@stream_set_timeout($fp, 20);
@fputs($fp, $header);
$status = @socket_get_status($fp);
while (!@feof($fp)&&$status) {
$data .= @fgets($fp, 1024);
$status = @socket_get_status($fp);
}
@fclose ($fp);
}

私が書いた対応するPythonコードは次のとおりです。

fp = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                fp.connect(("my ip", 80))
                if (fp):
                        querystring = ""
                        #print postfields
                        for key in postfields:
                                querystring = querystring+key+"="+urllib.quote(str(postfields[key]))+"&"
                header = "POST "+whmcsurl+"modules/servers/licensing/verify.php HTTP/1.0\r\n"
                header+="Content-type: application/x-www-form-urlencoded\r\n"
                header+="Content-length: "+str(len(querystring))+"\r\n"
                header+="Connection: close\r\n\r\n"
                #header+=querystring
                data=""
                request = urllib2.Request(whmcsurl,querystring,header)
                response = urllib2.urlopen(request)
                data = response.read()

ここで、次のエラーに直面しています。

request = urllib2.Request(whmcsurl,querystring,header)
  File "/usr/lib64/python2.6/urllib2.py", line 200, in __init__
    for key, value in headers.items():
AttributeError: 'str' object has no attribute 'items'

したがって、Python はヘッダーの辞書を期待していると推測しています。しかし、PHP はそれを文字列として送信します。

この問題を解決する方法を教えてください。

前もって感謝します

4

2 に答える 2

7

あなたはかなりの距離で、物事を過度に複雑にしています。Python がこのほとんどを処理します。自分でソケットを開く必要も、ヘッダーと HTTP 開始行を作成する必要もありません。

urllib.requestおよびモジュールを使用urllib.parseして作業を行います。

from urllib.parse import urlopen
from urllib.request import urlopen

params = urlencode(postfields)
url = whmcsurl + 'modules/servers/licensing/verify.php'
response = urlopen(url, params)
data = response.read()

urlopen()POST2 番目のパラメーター (要求で送信されるデータ) を取ります。ライブラリは本文の長さを計算し、適切なヘッダーを設定します。何よりも、内部では別のライブラリ を使用しhttplibてソケット接続を処理し、有効なヘッダーと HTTP 要求行を生成します。

POST 本文は を使用してエンコードされurllib.parse.urlencode()、適切な引用も処理されます。

また、より使いやすい API を提供する外部requestsライブラリを調べることもできます。

import requests

response = requests.post(whmcsurl + 'modules/servers/licensing/verify.php', params=params)
data = response.content  # or response.text for decoded content, or response.json(), etc.
于 2013-08-06T08:04:27.607 に答える
2

ヘッダーは次のようになります

headers = { "Content-type" : "application/x-www-form-urlencoded" };
于 2013-08-06T08:01:28.783 に答える