Graphe des relations d'ajout au groupe entre les membres du Million Project
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

facebook_parser.py 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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:
  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
  11. """
  12. if not os.path.isdir(folder_path):
  13. raise FileNotFoundError(f"Le dossier {folder_path} n'existe pas.")
  14. json_files = [f for f in os.listdir(folder_path) if f.endswith('.json')]
  15. if not json_files:
  16. raise FileNotFoundError(f"Aucun fichier JSON trouvé dans le dossier {folder_path}.")
  17. merged_facebook_export = None
  18. for file_name in json_files:
  19. #file_path = os.path.join(folder_path, file_name)
  20. facebook_export = parse_facebook_export(file_name)
  21. if merged_facebook_export is None:
  22. merged_facebook_export = facebook_export
  23. else:
  24. merged_facebook_export.messages.extend(facebook_export.messages)
  25. merged_facebook_export.participants.update(facebook_export.participants)
  26. if merged_facebook_export is None:
  27. raise ValueError(f"Aucun fichier valide n'a été trouvé ou parsé dans le dossier {folder_path}.")
  28. return merged_facebook_export
  29. def parse_facebook_export(file_name: str) -> FacebookExport:
  30. """
  31. Parse un fichier JSON en instance de la classe model.FacebookExport
  32. :param file_name: Le chemin du fichier à ouvrir
  33. :return: Une instance de FacebookExport initialisée avec les données du fichier JSON
  34. """
  35. if not file_name.lower().endswith('.json') or not os.path.exists(file_name):
  36. raise ValueError(f"Le fichier {file_name} n'existe pas ou n'est pas un fichier JSON.")
  37. try:
  38. json_data = read_broken_fb_json(file_name)
  39. return FacebookExport.from_dict(json_data)
  40. except Exception as e:
  41. raise Exception(f"Erreur lors de la conversion du JSON en FacebookExport: {str(e)}")
  42. def read_broken_fb_json(file_name: str) -> Any:
  43. """
  44. Lit un fichier JSON issu de Facebook et renvoie le contenu après correction de l'encodage
  45. :param file_name: Le chemin du fichier à ouvrir
  46. :return: Le contenu du fichier JSON sous forme d'objet
  47. """
  48. # https://stackoverflow.com/questions/50008296/facebook-json-badly-encoded
  49. with open(file_name, 'rb') as f:
  50. binary_data = f.read()
  51. repaired = re.sub(
  52. rb'\\u00([\da-f]{2})',
  53. lambda m: bytes.fromhex(m.group(1).decode()),
  54. binary_data
  55. )
  56. return json.loads(repaired.decode('utf8'))