Graphe des relations d'ajout au groupe entre les membres du Million Project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import json
  2. import os
  3. import re
  4. from typing import Any
  5. from million.model.facebook_schema import FacebookExport
  6. def parse_facebook_exports_from_folder(folder_path: str) -> FacebookExport | None:
  7. """
  8. Parcourt un dossier, lit chaque fichier JSON et les fusionne dans un seul objet FacebookExport.
  9. :param folder_path: Chemin vers le dossier contenant les fichiers JSON
  10. :return: Un objet FacebookExport ou None si aucun résultat trouvé
  11. """
  12. merged_facebook_export = None
  13. with os.scandir(folder_path) as it:
  14. for entry in it:
  15. if not (entry.is_file() and entry.name.endswith('.json')): continue
  16. facebook_export = parse_facebook_export(entry.path)
  17. if merged_facebook_export is None:
  18. merged_facebook_export = facebook_export
  19. else:
  20. merged_facebook_export.messages.extend(facebook_export.messages)
  21. if merged_facebook_export is None: return None
  22. merged_facebook_export.messages = sorted(merged_facebook_export.messages, key=lambda m: m.date_time)
  23. merged_facebook_export.participants = sorted(merged_facebook_export.participants, key=lambda m: m.name)
  24. return merged_facebook_export
  25. def parse_facebook_export(file_path: str) -> FacebookExport:
  26. """
  27. Parse un fichier JSON en instance de la classe FacebookExport
  28. :param file_path: Le chemin du fichier à ouvrir
  29. :return: Une instance de FacebookExport initialisée avec les données du fichier JSON
  30. """
  31. if not file_path.lower().endswith('.json') or not os.path.exists(file_path):
  32. raise ValueError(f"Le fichier {file_path} n'existe pas ou n'est pas un fichier JSON.")
  33. try:
  34. json_data = read_broken_fb_json(file_path)
  35. return FacebookExport.from_dict(json_data)
  36. except Exception as e:
  37. raise Exception(f"Erreur lors de la conversion du JSON en FacebookExport: {str(e)}")
  38. def read_broken_fb_json(file_path: str) -> Any:
  39. """
  40. Lit un fichier JSON issu de Facebook et renvoie le contenu après correction de l'encodage
  41. :param file_path: Le chemin du fichier à ouvrir
  42. :return: Le contenu du fichier JSON sous forme d'objet
  43. """
  44. # https://stackoverflow.com/questions/50008296/facebook-json-badly-encoded
  45. with open(file_path, 'rb') as f:
  46. binary_data = f.read()
  47. repaired = re.sub(
  48. rb'\\u00([\da-f]{2})',
  49. lambda m: bytes.fromhex(m.group(1).decode()),
  50. binary_data
  51. )
  52. return json.loads(repaired.decode('utf8'))