Guida CC checker

laiser

Utente Iron
18 Giugno 2021
12
4
5
10
Ultima modifica:
Ho appena iniziato a imparare Python, quindi per favore non rimproveratemi troppo.

La prima cosa da fare è prendere l'algoritmo lunare dal wiki per controllare che CC sia corretto.

Python:
from functools import reduce

def luhn(code):
    LOOKUP = (0, 2, 4, 6, 8, 1, 3, 5, 7, 9)
    code = reduce(str.__add__, filter(str.isdigit, code))
    evens = sum(int(i) for i in code[-1::-2])
    odds = sum(LOOKUP[int(i)] for i in code[-2::-2])
    return ((evens + odds) % 10 == 0)

Se tutto funziona, bisogna controllare a quale banca appartiene la carta. Andate su Google, trovate il link e fatene uno regolare. O semplicemente copiare da Github ))))

Python:
dig = {
    'Amex Card'             : '^3[47][0-9]{13}$',
    'BCGlobal'              : '^(6541|6556)[0-9]{12}$',
    'Carte Blanche Card'    : '^389[0-9]{11}$',
    'Diners Club Card'      : '^3(?:0[0-5]|[68][0-9])[0-9]{11}$',
    'Discover Card'         : '6(?:011|5[0-9]{2})[0-9]{12}$',
    'Insta Payment Card'    : '^63[7-9][0-9]{13}$',
    'JCB Card'              : '^(?:2131|1800|35\\d{3})\\d{11}$',
    'KoreanLocalCard'       : '^9[0-9]{15}$',
    'Laser Card'            : '^(6304|6706|6709|6771)[0-9]{12,15}$',
    'Maestro Card'          : '^(5018|5020|5038|6304|6759|6761|6763)[0-9]{8,15}$',
    'Mastercard'            : '5[1-5][0-9]{14}$',
    'Solo Card'             : '^(6334|6767)[0-9]{12}|(6334|6767)[0-9]{14}|(6334|6767)[0-9]{15}$',
    'Switch Card'           : '^(4903|4905|4911|4936|6333|6759)[0-9]{12}|(4903|4905|4911|4936|6333|6759)[0-9]{14}|(4903|4905|4911|4936|6333|6759)[0-9]{15}|564182[0-9]{10}|564182[0-9]{12}|564182[0-9]{13}|633110[0-9]{10}|633110[0-9]{12}|633110[0-9]{13}$',
    'Union Pay Card'        : '^(62[0-9]{14,17})$',
    'Visa Card'             : '4[0-9]{12}(?:[0-9]{3})?$',
    'Visa Master Card'      : '^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14})$',
    'Express Card'          : '3[47][0-9]{13}$'
}


Se tutto funziona, bisogna controllare a quale banca appartiene la carta. Vai su google, trova un bel link e fai un semplice ... O semplicemente copiare da Github))))


Python:
code = '4561 2612 1234 5467'
codeFormatter = re.sub(' ', '', code.strip())

if luhn(code):
    for regex in dig:
        if re.search(dig[regex], codeFormatter):
            print(f'{code} - {regex}')
            break

Fatto. Ora abbiamo un codice completo con un controllo per il CC e un controllo per la banca a cui appartiene.

Python:
import re

cardNo = '4561 2612 1234 5467'
code = ''.join(filter(str.isdigit, cardNo))

dig = {
    'Amex Card'             : '^3[47][0-9]{13}$',
    'BCGlobal'              : '^(6541|6556)[0-9]{12}$',
    'Carte Blanche Card'    : '^389[0-9]{11}$',
    'Diners Club Card'      : '^3(?:0[0-5]|[68][0-9])[0-9]{11}$',
    'Discover Card'         : '6(?:011|5[0-9]{2})[0-9]{12}$',
    'Insta Payment Card'    : '^63[7-9][0-9]{13}$',
    'JCB Card'              : '^(?:2131|1800|35\\d{3})\\d{11}$',
    'KoreanLocalCard'       : '^9[0-9]{15}$',
    'Laser Card'            : '^(6304|6706|6709|6771)[0-9]{12,15}$',
    'Maestro Card'          : '^(5018|5020|5038|6304|6759|6761|6763)[0-9]{8,15}$',
    'Mastercard'            : '5[1-5][0-9]{14}$',
    'Solo Card'             : '^(6334|6767)[0-9]{12}|(6334|6767)[0-9]{14}|(6334|6767)[0-9]{15}$',
    'Switch Card'           : '^(4903|4905|4911|4936|6333|6759)[0-9]{12}|(4903|4905|4911|4936|6333|6759)[0-9]{14}|(4903|4905|4911|4936|6333|6759)[0-9]{15}|564182[0-9]{10}|564182[0-9]{12}|564182[0-9]{13}|633110[0-9]{10}|633110[0-9]{12}|633110[0-9]{13}$',
    'Union Pay Card'        : '^(62[0-9]{14,17})$',
    'Visa Card'             : '4[0-9]{12}(?:[0-9]{3})?$',
    'Visa Master Card'      : '^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14})$',
    'Express Card'          : '3[47][0-9]{13}$'
}

def luhn(code):
    LOOKUP = (0, 2, 4, 6, 8, 1, 3, 5, 7, 9)
    evens = sum(int(i) for i in code[-1::-2])
    odds = sum(LOOKUP[int(i)] for i in code[-2::-2])
    return ((evens + odds) % 10 == 0)

if luhn(code):
    for regex in dig:
        if re.search(dig[regex], code):
            print(f'{code} - {regex}')
            break

Mi dispiace, non parlo molto bene l'italiano.
 
  • Mi piace
Reazioni: driverfury