генерация промо-кода с использованием python
-
22-09-2019 - |
Вопрос
Используя язык python, что было бы умным / эффективным способом генерации рекламных кодов.Нравится, когда его используют для генерации специальных номеров для купонов на скидку.Нравится:1027828-1
Спасибо
Решение
1027828-1 чрезвычайно мал.Злоумышленник может сделать ~ миллион догадок, используя всего пару строк кода и, возможно, несколько дней.
Это хороший способ получить труднопрогнозируемое число с помощью python, он работает под Linux и Windows.Он использует base64 для двоичной безопасности, в зависимости от того, что вы с ним делаете, вы можете захотеть использовать urllib.urlencode(), но я бы избегал base10, потому что он не хранит столько информации.
import os
import base64
def secure_rand(len=8):
token=os.urandom(len)
return base64.b64encode(token)
print(secure_rand())
В качестве дополнительного примечания это генерирует полный байт, который является base256.256 ^ 8 - это 18446744073709551616, который должен быть достаточно большим.
Как уже было отмечено, base64 - не очень хороший токен для использования людьми.Рассмотрите альтернативную кодировку, такую как url-safe base64 или, возможно человеческий удар поскольку их было бы легче ввести.
Другие советы
Следующее не является особенно питоническим или особенно эффективным, но этого может быть достаточно:
import random
def get_promo_code(num_chars):
code_chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
code = ''
for i in range(0, num_chars):
slice_start = random.randint(0, len(code_chars) - 1)
code += code_chars[slice_start: slice_start + 1]
return code
если вам нужен 6-значный #, вы можете делать это до тех пор, пока не найдете уникальное значение:
import random
print str(random.randint(100000, 999999))
или идите последовательно...
Я придумал ответ на этот вопрос, который, на мой взгляд, довольно умный, но опирается на пару предположений, которые могут оказаться неверными для вашей ситуации.
- Результирующий код является чисто числовым.
- Результирующий код технически имеет переменную длину;[10, 20].
Если это работает для вас, то таким же может быть и это решение:
def code(seed = None):
if (not seed) or (type(seed) != str) or (len(seed) < 10):
seed = str(uuid.uuid4())[:10]
code = ""
for character in seed:
value = str(ord(character))
code += value
return code[:20]
В этой функции начальное значение, набранное в виде строки, используется в качестве основы кода.Для каждого символа в строке преобразуйте его в его ASCII-представление, затем добавьте его в код.
По умолчанию функция выдает коды, подобные этому: '97534957569756524557'
, и может быть вызван с любым произвольным начальным значением.Например...
code("pcperini's answer") == '11299112101114105110'
code(str(time.time())) == '49524956514950505257'