openpanel/services/screenshots/app.py
2025-04-03 11:05:52 +02:00

89 lines
3.5 KiB
Python

from flask import Flask, jsonify, send_file
import os
from playwright.sync_api import sync_playwright
from hashlib import md5
import time
from apscheduler.schedulers.background import BackgroundScheduler
app = Flask(__name__)
CACHE_DIR = '/home/screenshot/screenshot_cache'
def capture_screenshot(domain):
url = f'http://{domain}'
screenshot_filename = f'{md5(url.encode()).hexdigest()}.png'
screenshot_path = os.path.join(CACHE_DIR, screenshot_filename)
if not os.path.exists(screenshot_path):
try:
print(f"Starting playwright for {url}")
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
print(f"Navigating to {url}")
page.goto(url)
time.sleep(2)
print(f"Taking screenshot and saving to {screenshot_path}")
page.screenshot(path=screenshot_path)
browser.close()
print(f"Browser closed")
if os.path.exists(screenshot_path):
print(f"Screenshot successfully saved at {screenshot_path}")
else:
print(f"Screenshot file not found at {screenshot_path} after saving")
return None
except Exception as e:
print(f"Error capturing screenshot: {e}")
return None
else:
print(f"Using cached screenshot at {screenshot_path}")
return screenshot_path
def delete_old_screenshots():
for filename in os.listdir(CACHE_DIR):
filepath = os.path.join(CACHE_DIR, filename)
# Check if the file hasn't been accessed in 24 hours (86400 seconds)
if os.path.getatime(filepath) < time.time() - 86400:
os.remove(filepath)
print(f"Deleted old screenshot: {filepath}")
# Create a scheduler that runs in the background
scheduler = BackgroundScheduler()
scheduler.add_job(delete_old_screenshots, 'interval', days=1, start_date='2023-09-30 01:00:00') # Runs daily at 1 AM
scheduler.start()
@app.route('/screenshot/<path:domain>', methods=['GET', 'DELETE'])
def handle_screenshot(domain):
screenshot_filename = f'{md5(domain.encode()).hexdigest()}.png'
screenshot_path = os.path.join(CACHE_DIR, screenshot_filename)
if request.method == 'GET':
screenshot_path = capture_screenshot(domain)
if screenshot_path and os.path.exists(screenshot_path):
try:
os.utime(screenshot_path, None) # Update access time
print(f"Sending screenshot file: {screenshot_path}")
return send_file(screenshot_path, mimetype='image/png')
except Exception as e:
print(f"Error sending file: {e}")
return jsonify({'error': 'Failed to send screenshot', 'details': str(e)}), 500
else:
return jsonify({'error': 'Failed to capture screenshot'}), 500
elif request.method == 'DELETE':
if os.path.exists(screenshot_path):
try:
os.remove(screenshot_path)
print(f"Deleted screenshot: {screenshot_path}")
return jsonify({'message': 'Screenshot deleted successfully'}), 200
except Exception as e:
print(f"Error deleting screenshot: {e}")
return jsonify({'error': 'Failed to delete screenshot', 'details': str(e)}), 500
else:
return jsonify({'error': 'Screenshot not found'}), 404
if __name__ == '__main__':
app.run(debug=True)