1
0

test_og_meta.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #!/usr/bin/env python3
  2. """
  3. Script de diagnostic des métadonnées Open Graph
  4. Vérifie que les métadonnées sont correctes pour le partage LinkedIn
  5. """
  6. import os
  7. import sys
  8. import django
  9. # Configuration Django
  10. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'duhaz_blog.settings')
  11. django.setup()
  12. from blog.models import Blog
  13. from blog.seo_helpers import SEOMetadata
  14. from django.test import RequestFactory
  15. def test_og_metadata():
  16. """Teste les métadonnées Open Graph d'un article"""
  17. # Créer une fausse requête
  18. factory = RequestFactory()
  19. request = factory.get('/')
  20. # Récupérer le premier article publié
  21. article = Blog.objects.filter(b_publier=True).first()
  22. if not article:
  23. print("❌ Aucun article publié trouvé dans la base de données")
  24. return
  25. print("=" * 70)
  26. print("📊 DIAGNOSTIC DES MÉTADONNÉES OPEN GRAPH")
  27. print("=" * 70)
  28. print(f"\n📝 Article testé : {article.b_titre}")
  29. print(f"🔗 Slug : {article.b_titre_slugify}")
  30. print()
  31. # Générer les métadonnées
  32. seo_helper = SEOMetadata(request, article)
  33. metadata = seo_helper.get_blog_metadata(article)
  34. # Afficher les métadonnées principales
  35. print("=" * 70)
  36. print("🔍 MÉTADONNÉES GÉNÉRÉES")
  37. print("=" * 70)
  38. print(f"Titre : {metadata['og']['title']}")
  39. print(f"Description : {metadata['og']['description'][:80]}...")
  40. print(f"URL : {metadata['og']['url']}")
  41. print(f"Image URL : {metadata['og']['image']}")
  42. print(f"Image Alt : {metadata['og'].get('image_alt', 'N/A')}")
  43. print(f"Image Width : {metadata['og']['image_width']}px")
  44. print(f"Image Height : {metadata['og']['image_height']}px")
  45. print(f"Image Type : {metadata['og'].get('image_type', 'N/A')}")
  46. print(f"Site Name : {metadata['og']['site_name']}")
  47. print(f"Locale : {metadata['og']['locale']}")
  48. print()
  49. # Vérifications LinkedIn
  50. print("=" * 70)
  51. print("✅ VÉRIFICATIONS LINKEDIN")
  52. print("=" * 70)
  53. checks_passed = 0
  54. checks_total = 0
  55. # Check 1: URL absolue
  56. checks_total += 1
  57. if metadata['og']['image'].startswith('https://'):
  58. print("✅ Image URL est absolue (commence par https://)")
  59. checks_passed += 1
  60. else:
  61. print(f"❌ Image URL doit être absolue. Actuelle : {metadata['og']['image']}")
  62. # Check 2: Largeur minimale
  63. checks_total += 1
  64. width = int(metadata['og']['image_width'])
  65. if width >= 1200:
  66. print(f"✅ Largeur suffisante : {width}px (minimum 1200px)")
  67. checks_passed += 1
  68. else:
  69. print(f"❌ Largeur insuffisante : {width}px (minimum requis : 1200px)")
  70. # Check 3: Hauteur minimale
  71. checks_total += 1
  72. height = int(metadata['og']['image_height'])
  73. if height >= 627:
  74. print(f"✅ Hauteur suffisante : {height}px (minimum 627px)")
  75. checks_passed += 1
  76. else:
  77. print(f"❌ Hauteur insuffisante : {height}px (minimum requis : 627px)")
  78. # Check 4: Type d'image spécifié
  79. checks_total += 1
  80. if 'image_type' in metadata['og'] and metadata['og']['image_type']:
  81. print(f"✅ Type d'image spécifié : {metadata['og']['image_type']}")
  82. checks_passed += 1
  83. else:
  84. print("⚠️ Type d'image non spécifié (recommandé pour LinkedIn)")
  85. # Check 5: Alt text présent
  86. checks_total += 1
  87. if 'image_alt' in metadata['og'] and metadata['og']['image_alt']:
  88. print(f"✅ Texte alternatif présent")
  89. checks_passed += 1
  90. else:
  91. print("⚠️ Texte alternatif manquant (recommandé pour l'accessibilité)")
  92. # Check 6: Toutes les balises essentielles
  93. checks_total += 1
  94. required_fields = ['type', 'title', 'description', 'url', 'image']
  95. missing_fields = [f for f in required_fields if f not in metadata['og'] or not metadata['og'][f]]
  96. if not missing_fields:
  97. print("✅ Toutes les balises essentielles sont présentes")
  98. checks_passed += 1
  99. else:
  100. print(f"❌ Balises manquantes : {', '.join(missing_fields)}")
  101. # Résumé
  102. print()
  103. print("=" * 70)
  104. print("📈 RÉSUMÉ")
  105. print("=" * 70)
  106. print(f"Tests réussis : {checks_passed}/{checks_total}")
  107. if checks_passed == checks_total:
  108. print("\n🎉 Excellent ! Vos métadonnées sont optimales pour LinkedIn")
  109. elif checks_passed >= checks_total - 1:
  110. print("\n👍 Bon ! Quelques améliorations mineures possibles")
  111. else:
  112. print("\n⚠️ Attention ! Des corrections sont nécessaires pour LinkedIn")
  113. # Instructions de test
  114. print()
  115. print("=" * 70)
  116. print("🔧 PROCHAINES ÉTAPES")
  117. print("=" * 70)
  118. print("\n1. Démarrez le serveur :")
  119. print(" ./start.sh")
  120. print()
  121. print("2. Testez avec LinkedIn Post Inspector :")
  122. print(" https://www.linkedin.com/post-inspector/")
  123. print()
  124. print("3. URL à tester :")
  125. print(f" https://www.duhaz.fr/blog/{article.b_titre_slugify}")
  126. print()
  127. print("4. Si LinkedIn met en cache l'ancienne version :")
  128. print(" - Utilisez le Post Inspector pour forcer le rafraîchissement")
  129. print(" - Attendez quelques minutes et réessayez")
  130. print()
  131. # Informations supplémentaires sur l'image
  132. if article.b_description_img:
  133. print("=" * 70)
  134. print("🖼️ INFORMATIONS SUR L'IMAGE")
  135. print("=" * 70)
  136. print(f"URL de l'image dans la BDD : {article.b_description_img}")
  137. print()
  138. if not article.b_description_img.startswith(('http://', 'https://')):
  139. print("⚠️ L'URL de l'image est relative.")
  140. print(" Elle sera convertie en URL absolue par le helper SEO.")
  141. print()
  142. print("💡 Vérifiez que cette image :")
  143. print(" - Fait au moins 1200x630 pixels")
  144. print(" - Est accessible publiquement (pas de login requis)")
  145. print(" - Pèse moins de 5 MB")
  146. print(" - Est au format JPG ou PNG")
  147. else:
  148. print("=" * 70)
  149. print("⚠️ ATTENTION")
  150. print("=" * 70)
  151. print("Aucune image spécifiée pour cet article.")
  152. print("L'image par défaut sera utilisée.")
  153. print("\n" + "=" * 70)
  154. if __name__ == "__main__":
  155. try:
  156. test_og_metadata()
  157. except Exception as e:
  158. print(f"\n❌ Erreur lors du test : {e}")
  159. import traceback
  160. traceback.print_exc()
  161. sys.exit(1)