sábado, 24 de março de 2007

Gerador de PINS (Python)

Olá irmãos,

Hoje vou postar aqui sobre este script que fiz na altura para me gerar um PIN do cartão de multibanco, esta foi uma das aplicações em que pensei enquanto ia dormir, e aí levantei-me da cama e vim programar.

Tive apenas duas dificuldades: - Gerar valores aleatórios e fazer com que os números tivessem zeros antes (ex: 0001, 0199, 0012).

Primeiro comecei por ir ao Google e o Python já tem uma biblioteca que o faz (chamada random), bastou fazer um

Import random

para a poder utilizar.

A ideia geral para o script funcionar foi ele primeiro gerar os números de 0000 ate 9999, escrever num ficheiro. Após escrito ele irá abrir novamente o ficheiro para apenas leitura e aí com a biblioteca random pegar num valor aleatório, por exemplo: 6273.

Acima falei de um problema que tive, que foi nos zeros. Andei em vários sítios à procura de como o fazer (pois 000 como inteiro ficava apenas 0). É aí que me vem a ideia: Bem, se não preciso de inteiros, porque não utilizar estes valores como string? Aí já não haveria problemas, e assim o fiz.

Mas agora levanta-se outra questão: - Quando é que o script vai saber em que altura será 000 ou 0 ou 00? É aí que atribuo a três variáveis vários zeros como string:

val1 = '000'

val2 = '00'

val3 = '0'

Após esta atribuição é altura de indicar ao script quando usar o val1, val2 e val3. Para isto recorri ao while, visto enquanto x (variável contador que irá de 0 até 9999) for menor que 10 terá o val1 (três zeros), menor que 100 terá val2, e menor que 1000 terá val3.

while x < 10:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val1) + str(x) + " ")

    ficheiro.close()

    x = x + 1

    

while x < 100:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val2) + str(x) + " ")

    ficheiro.close()

    x = x + 1


 

while x < 1000:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val3) + str(x) + " ")

    ficheiro.close()

    x = x + 1

    

while x < 10000:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(x) + " ")

    ficheiro.close()

    x = x + 1

Se repararem na altura de escrever no ficheiro existe um str(val1) + str(x), e isto porquê? Bem, segundo se aprende no início da programação apenas se pode fazer operações com dados do mesmo tipo (inteiro com inteiro, string com string), e como x é um dado do tipo inteiro, tenho de na altura o "converter" para string para o poder utilizar com a respectiva string (val1, val2, val3).

Temos os dados escritos no ficheiro gerado.txt, agora teremos de o abrir novamente como leitura. Após abrirmos como leitura teremos de separar os seus dados numa lista, para isto recorri ao split()

gerado = ficheiro.read().split()

Agora já temos uma variável (gerado) com os valores gerados (0000 ate 9999) todos separados como lista.

Falta escolher um valor aleatório para aparecer no ecrã, para resolver isto usei o random.sample(), passando como argumento a string com o conteúdo (gerado) e quantos valores queria (1). Após escolher o valor aleatório é armazenado numa variável (gerados) e é mostrado no ecrã o valor:

gerados = random.sample(gerado, 1)

print "PIN: " + str(gerados).strip("[' ']")

Recorri ao strip() para remover o [' '] que iria aparecer nos números gerados, visto estar a trabalhar com uma lista.

Aqui se segue o código completo:

#!/usr/bin/env python


 

# Mon Oct 23 22:46:00 2006 AZOST

# Gerador de PINS

# (c) 2006 - Alexandre Garcia <alexmgarcia@tux-linux.net>


 

import random

ficheiro = open('gerado.txt','w')

ficheiro.close()

val1 = '000'

val2 = '00'

val3 = '0'

x = 0


 

while x < 10:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val1) + str(x) + " ")

    ficheiro.close()

    x = x + 1

    

while x < 100:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val2) + str(x) + " ")

    ficheiro.close()

    x = x + 1


 

while x < 1000:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(val3) + str(x) + " ")

    ficheiro.close()

    x = x + 1

    

while x < 10000:

    ficheiro = open('gerado.txt','a')

    ficheiro.write(str(x) + " ")

    ficheiro.close()

    x = x + 1


 

ficheiro = open('gerado.txt','r')

gerado = ficheiro.read().split()

gerados = random.sample(gerado, 1)

print "PIN: " + str(gerados).strip("[' ']")

ficheiro.close()

11 comentários:

Anónimo disse...

aff

Gustavo Ale disse...

aff, é pra quem é idiota...

Unknown disse...

ele e maluco esplicou tudo isso pra porra ninhuma

Anónimo disse...

tem como porra ninhuma

Unknown disse...

TOMA NO SEU CU POSTA PARADA DIREITO AE FD.P

Unknown disse...

Ta Certinho oque ele explicou!

vcs que são NBs

Unknown disse...

entao como e ?

Kaique disse...

Faala Aee Porra !

Unknown disse...

velho vai tomar no seu cu mano ti ezplico expilico e num dianto nada cara so te falo isso
vc e um fdp mano ''IDIOTA''

Unknown disse...

o canbada de noobs

Anónimo disse...

fica fazendo putaria