Graphe des relations d'ajout au groupe entre les membres du Million Project
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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'))