#!/usr/bin/env python3
"""
Script de test avancé pour le scraping Instagram
"""

import requests
import re
import json
import gzip
import zlib
from bs4 import BeautifulSoup
import logging
import time

# Configuration du logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def test_instagram_advanced():
    """Test avancé du scraping Instagram"""
    
    # URL de test
    url = "https://www.instagram.com/reel/DMpc37-tJdF/"
    
    print(f"🔍 Test scraping Instagram avancé: {url}")
    
    # Headers plus complets pour simuler un vrai navigateur
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Language': 'fr-FR,fr;q=0.9,en;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Cache-Control': 'no-cache',
        'Pragma': 'no-cache',
        'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
        'Sec-Ch-Ua-Mobile': '?0',
        'Sec-Ch-Ua-Platform': '"Linux"',
        'Sec-Fetch-Dest': 'document',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'none',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'Connection': 'keep-alive'
    }
    
    session = requests.Session()
    session.headers.update(headers)
    
    # Ajouter un délai pour éviter d'être détecté comme bot
    time.sleep(2)
    
    try:
        # Test 1: URL normale avec gestion de la compression
        print("\n📡 Test 1: URL normale avec gestion compression")
        response = session.get(url, timeout=30)
        print(f"Status: {response.status_code}")
        print(f"Content-Encoding: {response.headers.get('content-encoding', 'none')}")
        print(f"Content length: {len(response.content)}")
        
        # Décompresser si nécessaire
        if response.headers.get('content-encoding') == 'gzip':
            try:
                content = gzip.decompress(response.content).decode('utf-8')
                print("✅ Contenu décompressé avec gzip")
            except:
                content = response.text
                print("⚠️ Erreur décompression gzip, utilisation du texte brut")
        elif response.headers.get('content-encoding') == 'br':
            try:
                content = zlib.decompress(response.content, wbits=16+zlib.MAX_WBITS).decode('utf-8')
                print("✅ Contenu décompressé avec brotli")
            except:
                content = response.text
                print("⚠️ Erreur décompression brotli, utilisation du texte brut")
        else:
            content = response.text
            print("✅ Contenu non compressé")
        
        print(f"Contenu final length: {len(content)}")
        
        # Sauvegarder le contenu décompressé
        with open('instagram_decompressed.html', 'w', encoding='utf-8') as f:
            f.write(content)
        print("✅ Contenu décompressé sauvegardé")
        
        # Analyser avec BeautifulSoup
        soup = BeautifulSoup(content, 'html.parser')
        
        # Chercher les métadonnées
        print("\n🔍 Recherche des métadonnées:")
        
        # Meta tags
        meta_tags = soup.find_all('meta')
        for meta in meta_tags:
            property_attr = meta.get('property', '')
            content_attr = meta.get('content', '')
            if 'description' in property_attr.lower():
                print(f"✅ Meta description: {content_attr[:100]}...")
            elif 'duration' in property_attr.lower():
                print(f"✅ Meta duration: {content_attr}")
            elif 'title' in property_attr.lower():
                print(f"✅ Meta title: {content_attr[:100]}...")
        
        # Script tags avec JSON
        print("\n🔍 Recherche des scripts JSON:")
        script_tags = soup.find_all('script')
        for i, script in enumerate(script_tags):
            script_content = script.string
            if script_content and ('window._sharedData' in script_content or 'application/ld+json' in script_content):
                print(f"✅ Script {i+1} trouvé: {script_content[:200]}...")
                
                # Essayer de parser le JSON
                try:
                    if 'window._sharedData' in script_content:
                        json_match = re.search(r'window\._sharedData\s*=\s*({.*?});', script_content, re.DOTALL)
                        if json_match:
                            json_str = json_match.group(1)
                            json_data = json.loads(json_str)
                            print(f"  JSON parsé avec succès: {str(json_data)[:200]}...")
                except Exception as e:
                    print(f"  Erreur parsing JSON: {e}")
        
        # Recherche de patterns spécifiques
        print("\n🔍 Recherche de patterns spécifiques:")
        
        # Patterns pour la durée
        duration_patterns = [
            r'"duration":\s*"?(\d+)"?',
            r'"timeRequired":\s*"?(\d+)"?',
            r'"lengthSeconds":\s*"?(\d+)"?',
            r'"videoDuration":\s*"?(\d+)"?',
            r'"durationSeconds":\s*"?(\d+)"?',
            r'"length":\s*"?(\d+)"?',
            r'"time":\s*"?(\d+)"?',
            r'"video_duration":\s*"?(\d+)"?',
            r'"media_duration":\s*"?(\d+)"?'
        ]
        
        for pattern in duration_patterns:
            matches = re.findall(pattern, content, re.IGNORECASE)
            if matches:
                print(f"✅ Durée trouvée avec pattern '{pattern}': {matches[0]} secondes")
                break
        else:
            print("❌ Aucune durée trouvée")
        
        # Patterns pour la description
        desc_patterns = [
            r'"description":\s*"([^"]*)"',
            r'"caption":\s*"([^"]*)"',
            r'"text":\s*"([^"]*)"',
            r'"title":\s*"([^"]*)"',
            r'<meta[^>]*property="og:description"[^>]*content="([^"]*)"',
            r'<meta[^>]*name="description"[^>]*content="([^"]*)"'
        ]
        
        for pattern in desc_patterns:
            matches = re.findall(pattern, content, re.IGNORECASE)
            if matches:
                print(f"✅ Description trouvée avec pattern '{pattern}': {matches[0][:100]}...")
                break
        else:
            print("❌ Aucune description trouvée")
        
        # Test 2: URL embed
        print("\n📡 Test 2: URL embed")
        embed_url = url.replace('/reel/', '/reel/embed/')
        time.sleep(1)  # Délai entre les requêtes
        
        response_embed = session.get(embed_url, timeout=30)
        print(f"Status: {response_embed.status_code}")
        
        if response_embed.status_code == 200:
            # Décompresser l'embed
            if response_embed.headers.get('content-encoding') == 'gzip':
                content_embed = gzip.decompress(response_embed.content).decode('utf-8')
            elif response_embed.headers.get('content-encoding') == 'br':
                content_embed = zlib.decompress(response_embed.content, wbits=16+zlib.MAX_WBITS).decode('utf-8')
            else:
                content_embed = response_embed.text
            
            print(f"Contenu embed length: {len(content_embed)}")
            
            # Sauvegarder l'embed
            with open('instagram_embed.html', 'w', encoding='utf-8') as f:
                f.write(content_embed)
            print("✅ Embed sauvegardé")
            
            # Analyser l'embed
            soup_embed = BeautifulSoup(content_embed, 'html.parser')
            
            # Chercher les métadonnées dans l'embed
            meta_embed = soup_embed.find_all('meta')
            for meta in meta_embed:
                property_attr = meta.get('property', '')
                content_attr = meta.get('content', '')
                if 'description' in property_attr.lower():
                    print(f"✅ Embed description: {content_attr[:100]}...")
                elif 'duration' in property_attr.lower():
                    print(f"✅ Embed duration: {content_attr}")
        
        # Test 3: Analyser les fichiers sauvegardés
        print("\n📊 Test 3: Analyse des fichiers sauvegardés")
        
        try:
            with open('instagram_decompressed.html', 'r', encoding='utf-8') as f:
                content_analysis = f.read()
            
            # Chercher des patterns plus spécifiques
            print("Recherche de patterns dans le fichier décompressé:")
            
            # Patterns pour Instagram spécifiquement
            instagram_patterns = [
                r'"edge_media_to_caption":\s*\{\s*"edges":\s*\[\s*\{\s*"node":\s*\{\s*"text":\s*"([^"]*)"',
                r'"caption":\s*"([^"]*)"',
                r'"text":\s*"([^"]*)"',
                r'"shortcode":\s*"([^"]*)"',
                r'"video_duration":\s*"?(\d+)"?',
                r'"duration":\s*"?(\d+)"?',
                r'"video_url":\s*"([^"]*)"',
                r'"display_url":\s*"([^"]*)"'
            ]
            
            for pattern in instagram_patterns:
                matches = re.findall(pattern, content_analysis, re.IGNORECASE | re.DOTALL)
                if matches:
                    print(f"✅ Pattern '{pattern}' trouvé: {matches[0][:100]}...")
            
        except Exception as e:
            print(f"❌ Erreur analyse fichier: {e}")
        
    except Exception as e:
        print(f"❌ Erreur générale: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    test_instagram_advanced() 