+Warwagon MVC Posted October 24, 2023 MVC Share Posted October 24, 2023 Recently downloaded all my posts off Facebook. I did the HMTL first which worked, but it was just a single HTML file which was a single page with all my posts. Then I downloaded the file in JSON format. I wanted to save the text of each individual post as their own file. So with the help of ChatGPT, I had it code me this app. Which opens the Posts JSON file. and lists them all on the left. When you click it, it shows you the post text on the right. You can search at the top of keywords. You can also export Individually checked posts or everything, each in their own TXT file to a directory of your choosing. Not sure if anyone else will find it useful. You can also sort by name import sys import json from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QListWidget, QTextBrowser, QVBoxLayout, QPushButton, QFileDialog, QSplitter, QLineEdit, QListWidgetItem from PyQt5.QtGui import QFont from PyQt5.QtCore import Qt, QSettings import os import re class FacebookProfileViewer(QMainWindow): def __init__(self): super().__init__(None) self.setWindowTitle("Facebook Profile Viewer") self.setGeometry(100, 100, 800, 600) self.central_widget = QSplitter() self.setCentralWidget(self.central_widget) self.post_list = QListWidget() self.post_list.itemClicked.connect(self.display_post) self.post_text_browser = QTextBrowser() self.load_button = QPushButton("Load JSON File") self.load_button.clicked.connect(self.load_data) self.sort_button = QPushButton("Sort by Name") self.sort_button.clicked.connect(self.sort_by_name) self.search_box = QLineEdit() self.search_box.textChanged.connect(self.filter_articles) self.select_all_button = QPushButton("Select All") self.select_all_button.clicked.connect(self.select_all) self.deselect_all_button = QPushButton("Deselect All") self.deselect_all_button.clicked.connect(self.deselect_all) self.save_button = QPushButton("Save Selected") self.save_button.clicked.connect(self.save_selected) self.save_all_button = QPushButton("Save All") self.save_all_button.clicked.connect(self.save_all) self.left_widget = QWidget() left_layout = QVBoxLayout() left_layout.addWidget(self.load_button) left_layout.addWidget(self.sort_button) left_layout.addWidget(self.search_box) left_layout.addWidget(self.select_all_button) left_layout.addWidget(self.deselect_all_button) left_layout.addWidget(self.save_button) left_layout.addWidget(self.save_all_button) left_layout.addWidget(self.post_list) self.left_widget.setLayout(left_layout) self.central_widget.addWidget(self.left_widget) self.central_widget.addWidget(self.post_text_browser) self.data = [] self.post_data_dict = {} self.filtered_articles = [] # Initialize QSettings for storing last save location self.settings = QSettings("MyCompany", "MyApp") def load_data(self): options = QFileDialog.Options() options |= QFileDialog.ReadOnly last_opened_folder = self.settings.value("last_opened_folder", os.path.expanduser("~")) file_dialog = QFileDialog.getOpenFileName(self, "Open JSON File", last_opened_folder, "JSON Files (*.json);;All Files (*)", options=options) if file_dialog[0]: json_file = file_dialog[0] with open(json_file, 'r', encoding='utf-8') as file: self.data = json.load(file) self.post_list.clear() self.post_data_dict.clear() seen_paragraphs = set() for entry in self.data: if "data" in entry and entry["data"]: for post in entry["data"]: if "post" in post: post_text = post["post"] post_text = post_text.replace("\u00e2\u0080\u0099", "'") post_text = post_text.replace("\u00e2\u0080\u009c", '"').replace("\u00e2\u0080\u009d", '"') post_paragraph = post_text.split('\n')[0] if post_paragraph not in seen_paragraphs: seen_paragraphs.add(post_paragraph) self.post_data_dict[post_paragraph] = post_text item = QListWidgetItem(post_paragraph) item.setFlags(item.flags() | Qt.ItemIsUserCheckable) item.setCheckState(Qt.Unchecked) self.post_list.addItem(item) self.filtered_articles = list(self.post_data_dict.keys()) def display_post(self, item): post_paragraph = item.text() post_text = self.post_data_dict.get(post_paragraph, "") self.post_text_browser.setPlainText(post_text) font = QFont() font.setPointSize(16) self.post_text_browser.setFont(font) def sort_by_name(self): sorted_paragraphs = sorted(self.post_data_dict.keys()) self.post_list.clear() for paragraph in sorted_paragraphs: item = QListWidgetItem(paragraph) item.setFlags(item.flags() | Qt.ItemIsUserCheckable) item.setCheckState(Qt.Unchecked) self.post_list.addItem(item) def filter_articles(self): search_text = self.search_box.text() self.post_list.clear() for article in self.filtered_articles: if search_text.lower() in article.lower(): item = QListWidgetItem(article) item.setFlags(item.flags() | Qt.ItemIsUserCheckable) item.setCheckState(Qt.Unchecked) self.post_list.addItem(item) def select_all(self): for i in range(self.post_list.count()): item = self.post_list.item(i) item.setCheckState(Qt.Checked) def deselect_all(self): for i in range(self.post_list.count()): item = self.post_list.item(i) item.setCheckState(Qt.Unchecked) def sanitize_filename(self, filename): # Remove special characters sanitized_name = re.sub(r'[^\w\d]+', '_', filename) # Limit filename length return sanitized_name[:50] # You can adjust the length as needed def save_selected(self): selected_items = [self.post_list.item(i) for i in range(self.post_list.count()) if self.post_list.item(i).checkState() == Qt.Checked] last_save_folder = self.settings.value("last_save_folder", os.path.expanduser("~")) folder_path = QFileDialog.getExistingDirectory(self, "Choose Folder to Save Files", last_save_folder) if folder_path: self.settings.setValue("last_save_folder", folder_path) # Save the last save folder for item in selected_items: post_paragraph = item.text() post_text = self.post_data_dict.get(post_paragraph, "") if post_text: # Extract the first 6 words as the file name words = post_paragraph.split()[:9] file_name = "_".join(words) file_name = self.sanitize_filename(file_name) file_name = os.path.join(folder_path, file_name + ".txt") with open(file_name, 'w', encoding='utf-8') as file: file.write(post_text) def save_all(self): last_save_folder = self.settings.value("last_save_folder", os.path.expanduser("~")) folder_path = QFileDialog.getExistingDirectory(self, "Choose Folder to Save Files", last_save_folder) if folder_path: self.settings.setValue("last_save_folder", folder_path) # Save the last save folder for article, text in self.post_data_dict.items(): sanitized_filename = self.sanitize_filename(article) file_path = os.path.join(folder_path, sanitized_filename + ".txt") with open(file_path, 'w', encoding='utf-8') as file: file.write(text) if __name__ == "__main__": app = QApplication(sys.argv) viewer = FacebookProfileViewer() viewer.show() sys.exit(app.exec_()) goretsky, xrobwx71 and +Zlip792 3 Share Link to comment https://www.neowin.net/forum/topic/1434857-facebook-business-page-json-parser-for-posts/ Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now