Compare commits

...

7 Commits

Author SHA1 Message Date
Radek
f20a7f0c34 fix style 2024-12-17 12:41:23 +00:00
Radek
ca9de4592f sue secrets / urandom plus random.org 2024-12-17 12:28:49 +00:00
Radek
1f891c7d1f fix session / template 2024-12-17 12:19:12 +00:00
Radek
308c795cbe add sesion tracking 2024-12-17 12:14:43 +00:00
Radek
a72a20dd21 fix template 2024-12-17 12:11:39 +00:00
Radek
94afbe5053 add choice how many 2024-12-17 12:07:27 +00:00
Radek
97b07fa61a add requirements 2024-12-06 14:36:34 +00:00
4 changed files with 126 additions and 45 deletions

94
app.py
View File

@@ -1,31 +1,89 @@
from flask import Flask, render_template, request from flask import Flask, render_template, request, session
import secrets import secrets
import os
import requests
app = Flask(__name__) app = Flask(__name__)
app.secret_key = 'your_secret_key' # Secret key for session management
# Function to generate random numbers based on lottery rules # Function to combine secrets module and /dev/urandom for stronger randomness
def generate_lottery_numbers(game_type): def generate_secure_seed():
if game_type == 'euromillions': # Generate a random value using secrets and urandom
numbers = sorted(secrets.SystemRandom().sample(range(1, 51), 5)) urandom_value = int.from_bytes(os.urandom(8), 'big')
lucky_stars = sorted(secrets.SystemRandom().sample(range(1, 13), 2)) secure_value = secrets.randbits(64)
return {'numbers': numbers, 'lucky_stars': lucky_stars} combined_seed = urandom_value ^ secure_value # Combine randomness using XOR
elif game_type == 'lotto': return combined_seed
numbers = sorted(secrets.SystemRandom().sample(range(1, 48), 6))
return {'numbers': numbers} # Function to fetch random numbers from Random.org API
elif game_type == 'eurodreams': def fetch_random_org_numbers(count, min_value, max_value):
numbers = sorted(secrets.SystemRandom().sample(range(1, 41), 6)) try:
dream_number = secrets.SystemRandom().randint(1, 5) url = "https://www.random.org/integers/"
return {'numbers': numbers, 'dream_number': dream_number} params = {
else: 'num': count,
return {'error': 'Invalid game type'} 'min': min_value,
'max': max_value,
'col': 1,
'base': 10,
'format': 'plain',
'rnd': 'new'
}
response = requests.get(url, params=params)
if response.status_code == 200:
numbers = [int(num) for num in response.text.strip().split()]
return sorted(numbers)
except Exception as e:
print(f"Error fetching from Random.org: {e}")
return None
# Function to generate lottery numbers based on rules
def generate_lottery_numbers(game_type, lines):
results = []
random_org_failure = False
for _ in range(lines):
if game_type == 'euromillions':
numbers = fetch_random_org_numbers(5, 1, 50)
if numbers is None:
random_org_failure = True
numbers = sorted(secrets.SystemRandom().sample(range(1, 51), 5))
lucky_stars = fetch_random_org_numbers(2, 1, 12)
if lucky_stars is None:
random_org_failure = True
lucky_stars = sorted(secrets.SystemRandom().sample(range(1, 13), 2))
results.append({'numbers': numbers, 'lucky_stars': lucky_stars})
elif game_type == 'lotto':
numbers = fetch_random_org_numbers(6, 1, 47)
if numbers is None:
random_org_failure = True
numbers = sorted(secrets.SystemRandom().sample(range(1, 48), 6))
results.append({'numbers': numbers})
elif game_type == 'eurodreams':
numbers = fetch_random_org_numbers(6, 1, 40)
if numbers is None:
random_org_failure = True
numbers = sorted(secrets.SystemRandom().sample(range(1, 41), 6))
dream_number = fetch_random_org_numbers(1, 1, 5)
dream_number = dream_number[0] if dream_number else secrets.SystemRandom().randint(1, 5)
results.append({'numbers': numbers, 'dream_number': dream_number})
else:
return {'error': 'Invalid game type'}
return results, random_org_failure
@app.route('/', methods=['GET', 'POST']) @app.route('/', methods=['GET', 'POST'])
def index(): def index():
result = None result = None
random_org_failed = False
game_type = session.get('game_type', 'euromillions') # Default to EuroMillions
lines = session.get('lines', 1) # Default to 1 line
if request.method == 'POST': if request.method == 'POST':
game_type = request.form.get('game_type') game_type = request.form.get('game_type')
result = generate_lottery_numbers(game_type) lines = int(request.form.get('lines', 1))
return render_template('index.html', result=result) session['game_type'] = game_type
session['lines'] = lines
result, random_org_failed = generate_lottery_numbers(game_type, lines)
return render_template('index.html', result=result, game_type=game_type, lines=lines, random_org_failed=random_org_failed)
if __name__ == '__main__': if __name__ == '__main__':
app.run(debug=True) app.run(debug=True)

1
requirements.txt Normal file
View File

@@ -0,0 +1 @@
Flask==3.0.0

View File

@@ -1,19 +1,17 @@
body { body {
font-family: Arial, sans-serif; font-family: Arial, sans-serif;
background-color: #f0f8ff; background-color: #f4f4f9;
color: #333; color: #333;
text-align: center; text-align: center;
margin: 0;
padding: 0;
} }
.container { .container {
max-width: 600px;
margin: 50px auto; margin: 50px auto;
max-width: 600px;
padding: 20px; padding: 20px;
background-color: #ffffff; background: #fff;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.1); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
} }
h1 { h1 {
@@ -21,24 +19,27 @@ h1 {
} }
form { form {
margin-top: 20px; display: flex;
flex-direction: column;
align-items: center;
} }
label { label {
font-weight: bold; font-weight: bold;
margin-top: 10px;
} }
select, button { select, input, button {
padding: 10px;
margin-top: 10px; margin-top: 10px;
padding: 10px;
width: 80%;
border-radius: 5px; border-radius: 5px;
border: 1px solid #ccc; border: 1px solid #ccc;
width: 100%;
} }
button { button {
background-color: #0073e6; background-color: #0073e6;
color: #fff; color: white;
cursor: pointer; cursor: pointer;
} }
@@ -46,9 +47,20 @@ button:hover {
background-color: #005bb5; background-color: #005bb5;
} }
.result { .results {
margin-top: 30px; margin-top: 20px;
padding: 20px; padding: 15px;
background-color: #f9f9f9; background-color: #f9f9f9;
border-radius: 8px; border-radius: 5px;
}
.line {
margin: 5px 0;
font-size: 16px;
}
.error {
color: red;
font-weight: bold;
margin-top: 10px;
} }

View File

@@ -10,25 +10,35 @@
<div class="container"> <div class="container">
<h1>Lottery Number Generator</h1> <h1>Lottery Number Generator</h1>
<form method="POST"> <form method="POST">
<!-- Retain selected game_type -->
<label for="game_type">Select Game:</label> <label for="game_type">Select Game:</label>
<select name="game_type" id="game_type" required> <select name="game_type" id="game_type" required>
<option value="euromillions">EuroMillions</option> <option value="euromillions" {% if game_type == 'euromillions' %}selected{% endif %}>EuroMillions</option>
<option value="lotto">Lotto</option> <option value="lotto" {% if game_type == 'lotto' %}selected{% endif %}>Lotto</option>
<option value="eurodreams">EuroDreams</option> <option value="eurodreams" {% if game_type == 'eurodreams' %}selected{% endif %}>EuroDreams</option>
</select> </select>
<!-- Retain selected lines -->
<label for="lines">Number of Lines:</label>
<input type="number" name="lines" id="lines" min="1" max="10" value="{{ lines }}" required>
<button type="submit">Generate Numbers</button> <button type="submit">Generate Numbers</button>
</form> </form>
{% if result %} {% if result %}
<div class="result"> <div class="results">
<h2>Generated Numbers:</h2> <h2>Generated Numbers:</h2>
<p>Numbers: {{ result.numbers }}</p> {% for line in result %}
{% if result.lucky_stars %} <div class="line">
<p>Lucky Stars: {{ result.lucky_stars }}</p> Numbers: {{ line.numbers }}
{% endif %} {% if line.lucky_stars %}
{% if result.dream_number %} | Lucky Stars: {{ line.lucky_stars }}
<p>Dream Number: {{ result.dream_number }}</p> {% endif %}
{% endif %} {% if line.dream_number %}
| Dream Number: {{ line.dream_number }}
{% endif %}
</div>
{% endfor %}
</div> </div>
{% endif %} {% endif %}
</div> </div>