Как кодировать URL с помощью urllib

У меня есть эта функция PHP, что я нахожусь перед разработкой же в Python 2.7:

//PHP
$actionSLK = 'https://test.monsite.com/script.cgi';
$storeId = 'test';
$cartId = 'test2';
$totalAmountTx = '100';
$email = '[email protected]';
$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 = '[email protected]'
SLKSecretKey = 'secret'

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

Проблема, которую я нашел, состоит в том, что вычисленная контрольная сумма не совпадает MD5, а затем я проверил закодированный URL (сгенерированный один: 'https://test.monsite.com/[email protected]') и вот мы здесь:

//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 другая функция, которая подробно описывает этот код?

1

Решение

urllib.quote() часто используется для кодирования частей URL, включая путь, и поэтому по умолчанию / считается безопасным персонажем. Проходить safe='' в явном виде:

>>> dataMD5
'https://test.monsite.com/[email protected]'
>>> 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'

РНР rawurlencode() производит последний, и поэтому вы должны использовать quote(safe='') вместо quote_plus(),

3

Другие решения

Ты можешь использовать urllib.quote_plus ():

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

С помощью urllib.quote_plus Вы можете достичь этого

actionSLK = "https://test.monsite.com/script.cgi"urllib.quote_plus(actionSLK)
>>https%3A%2F%2Ftest.monsite.com%2Fscript.cgi
2
По вопросам рекламы [email protected]