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

1

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

Теги:
urllib
percent-encoding

3 ответа

3
Лучший ответ

urllib.quote() часто используется для кодирования частей URL-адресов, включая путь, и, следовательно, по умолчанию / считается безопасным символом. Pass 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'

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

2

Вы можете использовать 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
  • 0
    Неверно, если входные данные содержат пробелы: rawurlencode() выдает %20 , а не + ; используйте вместо этого quote(safe='')
  • 0
    Да, вы правы, я просто подумал о его примере, я должен удалить свой ответ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню