From 18b177a58de6f6a7feeaf6352b595020f9f6afc3 Mon Sep 17 00:00:00 2001 From: Czechman Date: Sun, 16 Feb 2025 13:15:30 +0100 Subject: [PATCH] chatgpt initial mit Versionierung --- bundle_checker.py | 183 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 bundle_checker.py diff --git a/bundle_checker.py b/bundle_checker.py new file mode 100644 index 0000000..310e17b --- /dev/null +++ b/bundle_checker.py @@ -0,0 +1,183 @@ +#!/usr/bin/env python3 +import requests +import json +import hashlib +from datetime import datetime +from bs4 import BeautifulSoup + +from sqlalchemy import create_engine, Column, Integer, String, Float, DateTime, ForeignKey, Text +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker, relationship + +# Basis-Klasse für SQLAlchemy-Modelle +Base = declarative_base() + +# Tabelle für das Bundle (statische Identifikation) +class Bundle(Base): + __tablename__ = 'bundles' + id = Column(Integer, primary_key=True) + machine_name = Column(String, unique=True) # z. B. "linuxfrombeginnertoprofessionaloreilly_bookbundle" + human_name = Column(String) + current_version_id = Column(Integer, ForeignKey('bundle_versions.id')) + + # Beziehung zur aktuellen Version + current_version = relationship("BundleVersion", uselist=False, foreign_keys=[current_version_id]) + # Alle Versionen (historisch) + versions = relationship("BundleVersion", back_populates="bundle", foreign_keys='BundleVersion.bundle_id') + # Verkaufshistorie + sales_history = relationship("BundleSalesHistory", back_populates="bundle") + +# Tabelle für Versionen eines Bundles +class BundleVersion(Base): + __tablename__ = 'bundle_versions' + id = Column(Integer, primary_key=True) + bundle_id = Column(Integer, ForeignKey('bundles.id')) + version_hash = Column(String) # SHA-256 Hash der relevanten Daten + version_data = Column(Text) # Alle relevanten Bundle-Daten als JSON-String + timestamp = Column(DateTime, default=datetime.utcnow) + + bundle = relationship("Bundle", back_populates="versions") + +# Tabelle für Verkaufshistorie (zur zeitlichen Analyse der Verkaufszahlen) +class BundleSalesHistory(Base): + __tablename__ = 'bundle_sales_history' + id = Column(Integer, primary_key=True) + bundle_id = Column(Integer, ForeignKey('bundles.id')) + bundles_sold = Column(Float) + timestamp = Column(DateTime, default=datetime.utcnow) + + bundle = relationship("Bundle", back_populates="sales_history") + +def calculate_hash(data: dict) -> str: + """ + Berechnet einen SHA-256 Hash aus dem JSON-String der relevanten Daten. + """ + json_string = json.dumps(data, sort_keys=True, ensure_ascii=False) + return hashlib.sha256(json_string.encode('utf-8')).hexdigest() + +def fetch_bundle_data(url: str) -> dict: + """ + Ruft die Bundle-Detailseite ab und extrahiert den JSON-Inhalt aus dem