#!/usr/bin/env python3 import cv2 import hashlib import secrets import time import argparse def fetch_frame_opencv(url): cap = cv2.VideoCapture(url) ret, frame = cap.read() cap.release() if not ret: raise ValueError("Failed to fetch frame.") return frame def generate_random_numbers(frame, bit_lengths): _, img_encoded = cv2.imencode('.jpg', frame) img_bytes = img_encoded.tobytes() entropy = hashlib.sha256(img_bytes).digest() return {length: secrets.randbits(length) for length in bit_lengths} def main(): parser = argparse.ArgumentParser(description="Generate random numbers from camera entropy.") parser.add_argument("--url", default="http://192.168.0.200/mjpg/video.mjpg", help="Camera MJPEG stream URL") parser.add_argument("--single", type=int, default=1, help="Generate N random numbers and exit (default: 1)") parser.add_argument("--bit", type=int, default=256, help="Bit length of each random number (default: 256)") args = parser.parse_args() for i in range(args.single): try: frame = fetch_frame_opencv(args.url) random_numbers = generate_random_numbers(frame, [args.bit]) for number in random_numbers.values(): print(f"{number:x}") # Print as hex without '0x' prefix except Exception as e: print(f"Error: {e}", file=sys.stderr) return 1 if args.single > 1 and i < args.single - 1: time.sleep(1) # Small delay between frames in single mode if __name__ == "__main__": import sys main()