如何使用urllib对url进行编码

时间:2015-10-16 15:16:32

标签: php python urllib percent-encoding

我有这个PHP功能,我在python 2.7中开发相同的功能:

//PHP
$actionSLK = 'https://test.monsite.com/script.cgi';
$storeId = 'test';
$cartId = 'test2';
$totalAmountTx = '100';
$email = 'test@monsite.com';
$SLKSecretKey = 'secret';

$dataMD5=$actionSLK . $storeId . $cartId . $totalAmountTx . $email . $SLKSecretKey
$checksum=MD5(utf8entities(rawurlencode($dataMD5)));

#PYTHON:
from hashlib import md5
import urllib

actionSLK = 'https://test.monsite.com/script.cgi'
storeId = 'test'
cartId = 'test2'
totalAmountTx = '100'
email = 'test@monsite.com'
SLKSecretKey = 'secret'

dataMD5 = actionSLK + storeId + cartId + totalAmountTx + email + SLKSecretKey
checksum = md5(urllib.quote(dataMD5).encode('utf8')).hexdigest()

我发现的问题是计算的校验和不是MD5,然后我检查了编码的网址(生成一个:'https://test.monsite.com/script.cgitesttest100test@monsite.comsecret'),我们在这里:

//PHP
$checksum=MD5('https%3A%2F%2Ftest.monsite.com%2Fscript.cgitesttest100test%40monsite.comsecret');
#PYTHON
checksum = md5('https%3A//test.monsite.com/script.cgitesttest100test%40monsite.comsecret').hexdigest()

因此斜杠未编码,因此在生成差异校验和时会发生错误。

urllib中是否有另一个函数可以对详细信息中的url进行编码?

3 个答案:

答案 0 :(得分:3)

urllib.quote()通常用于编码包含路径的网址部分,因此默认情况下,/被视为安全字符。明确通过safe=''

>>> dataMD5
'https://test.monsite.com/script.cgitesttest2100test@monsite.comsecret'
>>> import urllib
>>> urllib.quote(dataMD5)
'https%3A//test.monsite.com/script.cgitesttest2100test%40monsite.comsecret'
>>> urllib.quote(dataMD5, safe='')
'https%3A%2F%2Ftest.monsite.com%2Fscript.cgitesttest2100test%40monsite.comsecret'

quote_plus()通常用于创建application/x-www-form-urlencoded数据,因此默认为safe=''

要了解您是否应使用quote_plus()quote(),请考虑使用空格数据:

>>> urllib.quote_plus('/ /')
'%2F+%2F'
>>> urllib.quote('/ /', safe='')
'%2F%20%2F'

PHP rawurlencode()生成后者,因此您应该使用quote(safe='')代替quote_plus()

答案 1 :(得分:2)

您可以使用urllib.quote_plus()

>>> encoded = urllib.quote_plus("https://test.monsite.com/script.cgitesttest100test@monsite.comsecret")
>>> encoded
'https%3A%2F%2Ftest.monsite.com%2Fscript.cgitesttest100test%40monsite.comsecret'

答案 2 :(得分:2)

使用urllib.quote_plus即可实现

actionSLK = "https://test.monsite.com/script.cgi"
urllib.quote_plus(actionSLK)
>>https%3A%2F%2Ftest.monsite.com%2Fscript.cgi