Compare commits

5 Commits

Author SHA1 Message Date
b38e2d2614 Merge pull request 'refactor(script.py): improve logging, base URL structure, and API params' (#1) from mm_ghasemi-patch-1 into wordpress_api_app
Reviewed-on: http://git.inferj.ir/MM_Ghasemi/fast_api_livetse/pulls/1
2026-05-04 09:08:27 +03:30
6b14fa1bac refactor(script.py): improve logging, base URL structure, and API params
- replace print statements with logging module
- refactor BASE_URL to be reusable and construct endpoint via f-string
- remove hardcoded comment status filter to rely on WordPress defaults
- improve error handling messages
- minor code cleanup and readability improvements
2026-05-04 09:06:47 +03:30
73f6015393 feat: add requirements.txt 2026-05-03 13:54:51 +03:30
5bdc2e1b04 feat: add comments.json and gitignore 2026-05-03 13:48:13 +03:30
a366c0619d feat: add WordPress project files 2026-05-03 13:22:01 +03:30
4 changed files with 94242 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
venv/

94112
comments.json Normal file

File diff suppressed because one or more lines are too long

23
requirements.txt Normal file
View File

@@ -0,0 +1,23 @@
attrs==25.3.0
certifi==2025.1.31
cffi==2.0.0
charset-normalizer==3.4.7
cryptography==46.0.7
h11==0.14.0
h2==4.3.0
hpack==4.1.0
hyperframe==6.1.0
idna==3.10
outcome==1.3.0.post0
pycparser==2.22
PySocks==1.7.1
requests==2.33.1
selenium==4.31.0
sniffio==1.3.1
sortedcontainers==2.4.0
trio==0.29.0
trio-websocket==0.12.2
typing_extensions==4.13.2
urllib3==2.4.0
websocket-client==1.8.0
wsproto==1.2.0

106
script.py Normal file
View File

@@ -0,0 +1,106 @@
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()