Graphe des relations d'ajout au groupe entre les membres du Million Project
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

facebook_parser.py 2.5KB

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