Optimisation des flux de travail : 10 scripts Python pour l'automatisation système et web

Extraction et analyse de données HTML

L'analyse du DOM est fondamentale pour le web scraping. L'utilisation de requests couplée à BeautifulSoup permet de récupérer et de parser efficacement le contenu HTML d'une page, offrant une alternative robuste aux parseurs natifs.

import requests
from bs4 import BeautifulSoup

def fetch_and_parse(target_url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
    response = requests.get(target_url, headers=headers)
    response.raise_for_status()
    
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # Extraction d'un élément unique
    main_title = soup.find('h1').get_text(strip=True) if soup.find('h1') else None
    
    # Extraction de multiples éléments
    paragraphs = [p.get_text(strip=True) for p in soup.find_all('p')]
    
    # Recherche par attributs CSS
    specific_div = soup.find('div', class_='content-wrapper')
    
    return {
        'title': main_title,
        'paragraphs': paragraphs,
        'has_target_div': specific_div is not None
    }

Décodage de codes QR par programme

Pour traiter des images contenant des codes QR, la bibliothèque pyzbar combinée à Pillow offre une solution performante pour décoder les données encodées directement depuis des fichiers image.

from pyzbar.pyzbar import decode
from PIL import Image

def extract_qr_data(image_path):
    try:
        img = Image.open(image_path)
        decoded_objects = decode(img)
        
        if not decoded_objects:
            return "Aucun code QR détecté dans l'image."
            
        return [obj.data.decode('utf-8') for obj in decoded_objects]
    except Exception as e:
        return f"Erreur lors de la lecture : {str(e)}"

Capture d'écran programmatique et optimisée

La bibliothèque mss est nettement plus rapide que les alternatives classiques pour la capture d'écran. Elle permet de saisir l'intégralité de l'écran ou des zones spécifiques avec une latence minimale, ce qui est idéal pour l'automatisation.

import mss
import mss.tools
import time

def capture_full_screen(output_file):
    with mss.mss() as sct:
        monitor = sct.monitors[1]
        sct_img = sct.grab(monitor)
        mss.tools.to_png(sct_img.rgb, sct_img.size, output=output_file)

def capture_region(output_file, top, left, width, height, delay=0):
    time.sleep(delay)
    region = {"top": top, "left": left, "width": width, "height": height}
    with mss.mss() as sct:
        sct_img = sct.grab(region)
        mss.tools.to_png(sct_img.rgb, sct_img.size, output=output_file)

Conversion de documents PDF en livres audio

Il est possible de transformer des documents textuels en fichiers audio en extrayant le contenu avec pypdf et en synthétisant la voix via gTTS (Google Text-to-Speech).

from pypdf import PdfReader
from gtts import gTTS
import os

def pdf_to_audiobook(pdf_path, output_dir, lang='fr'):
    os.makedirs(output_dir, exist_ok=True)
    reader = PdfReader(pdf_path)
    
    for i, page in enumerate(reader.pages):
        text = page.extract_text()
        if text and text.strip():
            tts = gTTS(text=text, lang=lang, slow=False)
            tts.save(os.path.join(output_dir, f'page_{i+1}.mp3'))

Manipulation et édition de fcihiers PDF

La gestion programmatique des PDF (fusion, rotation, suppression de pages) est grandement facilitée par la bibliothèque moderne pypdf. Voici des fonctions utilitaires pour les opérations les plus courantes.

from pypdf import PdfReader, PdfWriter

def merge_pdf_documents(file_list, output_path):
    writer = PdfWriter()
    for pdf_file in file_list:
        reader = PdfReader(pdf_file)
        for page in reader.pages:
            writer.add_page(page)
            
    with open(output_path, 'wb') as out:
        writer.write(out)

def rotate_pdf_pages(input_path, output_path, angle=90):
    reader = PdfReader(input_path)
    writer = PdfWriter()
    
    for page in reader.pages:
        page.rotate(angle)
        writer.add_page(page)
        
    with open(output_path, 'wb') as out:
        writer.write(out)

def remove_pdf_pages(input_path, output_path, pages_to_remove):
    reader = PdfReader(input_path)
    writer = PdfWriter()
    
    for i, page in enumerate(reader.pages):
        if i not in pages_to_remove:
            writer.add_page(page)
            
    with open(output_path, 'wb') as out:
        writer.write(out)

Accès direct aux solutions techniques via le terminal

L'outil en ligne de commande howdoi permet de récupérer des solutions directement depuis Stack Overflow sans quitter le terminal. Il peut être facilement intégré dans des scripts d'automatisation.

import subprocess

def query_stackoverflow(question):
    cmd = ['howdoi', '-c', '-n', '3', question]
    try:
        result = subprocess.run(cmd, capture_output=True, text=True, check=True)
        return result.stdout
    except subprocess.CalledProcessError as e:
        return f"Erreur lors de la requête : {e.stderr}"

# Exemple d'utilisation
# print(query_stackoverflow("python merge dictionaries"))

Contrôle d'appareils Android via ADB

Android Debug Bridge (ADB) permet d'interagir avec un appareil Android. En encapsluant les commandes ADB dans des fonctions Python via le module subprocess, on peut automatiser des interactions tactiles et système complexes.

import subprocess

def execute_adb_command(command):
    full_cmd = f"adb {command}"
    process = subprocess.Popen(full_cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    return stdout.decode('utf-8').strip()

def perform_swipe(start_x, start_y, end_x, end_y, duration_ms=300):
    return execute_adb_command(f"shell input swipe {start_x} {start_y} {end_x} {end_y} {duration_ms}")

def initiate_call(phone_number):
    return execute_adb_command(f"shell am start -a android.intent.action.CALL -d tel:{phone_number}")

def capture_device_screen(output_file):
    execute_adb_command("shell screencap -p /sdcard/screen.png")
    execute_adb_command(f"pull /sdcard/screen.png {output_file}")
    execute_adb_command("shell rm /sdcard/screen.png")

Surveillance thermique du processeur et du GPU

Pour monitorer les températures des composants matériels, l'utilisation de psutil pour le CPU et GPUtil pour le GPU offre une approche fiable, évitant les dépendances complexes et obsolètes liées à WMI ou .NET.

import psutil
import GPUtil
import time

def monitor_hardware_temperatures(interval=2):
    try:
        while True:
            # Température CPU
            temps = psutil.sensors_temperatures()
            if 'coretemp' in temps:
                cpu_temp = temps['coretemp'][0].current
                print(f"Température CPU (Core 0): {cpu_temp}°C")
                
            # Température GPU
            gpus = GPUtil.getGPUs()
            for gpu in gpus:
                print(f"GPU {gpu.name} - Temp: {gpu.temperature}°C | Charge: {gpu.load * 100:.1f}%")
                
            time.sleep(interval)
            print("-" * 40)
    except KeyboardInterrupt:
        print("Surveillance arrêtée par l'utilisateur.")

Publication automatisée sur les réseaux sociaux

L'API non officielle instagrapi permet d'automatiser les publications de médias sur Instagram de manière fiable, en gérant l'authentification, les uploads de photos et les vidéos (Reels).

from instagrapi import Client

def publish_media_to_instagram(username, password, media_path, caption):
    cl = Client()
    try:
        cl.login(username, password)
        
        if media_path.lower().endswith(('.mp4', '.mov')):
            cl.clip_upload(media_path, caption)
            print("Vidéo (Reel) publiée avec succès.")
        else:
            cl.photo_upload(media_path, caption)
            print("Photo publiée avec succès.")
            
    except Exception as e:
        print(f"Échec de la publication : {str(e)}")
    finally:
        cl.logout()

Ajout de filigrane textuel sur des vidéos

La bibliothèque moviepy est idéale pour le montage vidéo programmatique. Voici comment superposer un filigrane textuel dynamique avec une opacité ajustée sur une vidéo existante.

from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip

def add_dynamic_watermark(input_video, output_video, watermark_text):
    clip = VideoFileClip(input_video)
    
    # Création du clip texte
    txt_clip = (TextClip(watermark_text, fontsize=40, color='white', 
                         font='Arial-Bold', stroke_color='black', stroke_width=2)
                .set_position(('right', 'bottom'))
                .set_duration(clip.duration))
                
    # Application d'une légère transparence et positionnement
    txt_clip = txt_clip.margin(right=20, bottom=20, opacity=0).set_opacity(0.7)
    
    # Composition finale
    final_clip = CompositeVideoClip([clip, txt_clip])
    
    # Export
    final_clip.write_videofile(output_video, codec='libx264', audio_codec='aac')

Étiquettes: Python automation web-scraping pdf-manipulation Computer-Vision

Publié le 4 juillet à 00h37