import requests import json import logging from time import sleep from requests.auth import HTTPBasicAuth logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" ) BASE_URL = "https://livetse.ir/wp-json/wp/v2/" USERNAME = "your_username" APP_PASSWORD = "your_application_password" def fetch_comments(post_id=None, per_page=100): all_comments = [] page = 1 total_pages = 1 COMMENTS_URL = f"{BASE_URL}comments" while page <= total_pages: params = { "per_page": per_page, "page": page } if post_id: params["post"] = post_id try: response = requests.get( COMMENTS_URL, params=params, auth=HTTPBasicAuth(USERNAME, APP_PASSWORD), timeout=10 ) if response.status_code == 200: comments = response.json() if page == 1: total_pages = int(response.headers.get("X-WP-TotalPages", 1)) logging.info(f"Total pages: {total_pages}") if not comments: logging.warning("No more comments.") break all_comments.extend(comments) logging.info(f"Fetched page {page}/{total_pages} ({len(comments)} comments)") page += 1 sleep(0.5) elif response.status_code == 401: logging.error("Authentication failed") break elif response.status_code == 403: logging.error("Access forbidden") break elif response.status_code == 400: logging.error(f"Bad request: {response.text}") break else: logging.error(f"Error: {response.status_code} - {response.text}") break except requests.exceptions.RequestException as e: logging.exception(f"Request failed: {e}") break return all_comments def save_to_json(data, filename="comments.json"): with open(filename, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) def main(): post_id = None comments = fetch_comments(post_id=post_id) logging.info(f"Total comments fetched: {len(comments)}") for c in comments[:3]: logging.info("-" * 40) logging.info(f"Author: {c.get('author_name')}") logging.info(f"Content: {c.get('content', {}).get('rendered')}") save_to_json(comments) if __name__ == "__main__": main()