создание промо-кода с использованием Python - PullRequest
3 голосов
/ 21 января 2010

Используя язык Python, это был бы умный / эффективный способ создания промо-кодов. Как и для создания специальных номеров для купонов на скидку. как: 1027828-1

Спасибо

Ответы [ 4 ]

7 голосов
/ 21 января 2010

Следующее не особенно питонно и не особенно эффективно, но может быть достаточно:

 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
5 голосов
/ 21 января 2010

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, который должен быть достаточно большим.

1 голос
/ 21 января 2010

если вам нужен 6-значный #, вы можете делать это, пока не найдете уникальное значение:

import random
print str(random.randint(100000, 999999))

или идти последовательно ...

0 голосов
/ 11 декабря 2014

Я нашел ответ на этот вопрос, который, на мой взгляд, довольно умен, но опирается на пару предположений, которые могут не соответствовать вашей ситуации.

  • Полученный код является чисто числовым.
  • Полученный код технически переменной длины; [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'
...