Quét Toàn Bộ Bài Viết Fanpage - Trang Cá Nhân

Lấy Toàn Bộ Bài Viết Fanpage | Lấy Toàn Bộ Bài Viết Trang Cá Nhân Facebook

Trích xuất toàn bộ dữ liệu bài viết từ bất kỳ Fanpage Facebook nào một cách tự động và hiệu quả. Lưu trữ kết quả dưới dạng file JSON chi tiết. Tương tự như api từ facebook

Bắt Đầu Quét Fanpage

Nhập ID Fanpage và số lượng bài viết mong muốn.

Không biết ID Fanpage? Sử dụng công cụ tìm ID từ link của chúng tôi.
Để trống sẽ quét mặc định 50 bài. Nhập số lớn (ví dụ 200000) để cố gắng quét toàn bộ.

Tổng Quan Về Công Cụ

Công cụ "Quét Toàn Bộ Bài Viết Facebook" cho phép bạn tự động thu thập một lượng lớn hoặc toàn bộ các bài đăng công khai từ một trang Facebook (Fanpage) hoặc một trang cá nhân (Profile) cụ thể. Dữ liệu được trả về dưới dạng file JSON, chứa thông tin chi tiết về mỗi bài viết như nội dung, lượt tương tác, hình ảnh, video, thời gian đăng, và nhiều hơn nữa. Lưu ý: File dữ liệu được lưu trữ tối đa 7 ngày. Người dùng nên tải về sớm, xem lại liên kết json trong nhật ký credit

Lợi ích chính:

  • Nghiên cứu thị trường: Phân tích nội dung và chiến lược của đối thủ cạnh tranh.
  • Phân tích nội dung: Hiểu rõ loại nội dung nào hoạt động tốt nhất trên một Fanpage.
  • Sao lưu dữ liệu: Lưu trữ lại các bài viết quan trọng của Fanpage.
  • Nhân bản nội dung: Dựa vào nội dung đầu tạo để nhân bản nội dung của riêng bạn một cách nhanh nhất.
  • Xây dựng ứng dụng: Sử dụng dữ liệu bài viết để phát triển các công cụ hoặc dịch vụ của riêng bạn.

Chi Phí & Số Dư

Chúng tôi tính phí dựa trên số lượng bài viết dự kiến bạn muốn quét:

  • Chi phí ước tính: 30 Credits / bài viết.
  • Nếu không quét được bài nào (ví dụ ID sai, page không có bài): phí tối thiểu là 1 Credit cho nỗ lực xử lý.
  • Hệ thống sẽ hoàn lại credit nếu số bài viết thực tế quét được ít hơn số lượng bạn yêu cầu và đã trả phí ban đầu.

Lưu ý: Quá trình quét có thể mất thời gian tùy thuộc vào số lượng bài viết và tốc độ phản hồi từ Facebook. Hãy kiên nhẫn.

Hướng Dẫn Sử Dụng Chi Tiết

Sử Dụng Giao Diện Web của Tool Việt Nam (Tool.vn)

Giao diện web của Tool Việt Nam cung cấp một cách trực quan để bạn khởi tạo và theo dõi quá trình quét toàn bộ bài viết từ một Fanpage Facebook.

  1. Đăng Nhập (Nếu Chưa):

    Để sử dụng công cụ và quản lý credit, bạn cần đăng nhập vào tài khoản Tool Việt Nam của mình.

  2. Nhập ID Fanpage:

    Trong ô "ID Fanpage Facebook", hãy điền ID dạng số của Fanpage bạn muốn quét. Ví dụ: 61565985206441. Nếu bạn chỉ có link Fanpage (ví dụ: https://www.facebook.com/ToolvnOfficial), hãy sử dụng công cụ tìm ID từ link của chúng tôi để lấy ID số trước.

  3. Thiết Lập Số Lượng Bài Viết:
    • Trong ô "Số Lượng Bài Viết Tối Đa Cần Quét", nhập số lượng bài bạn muốn hệ thống cố gắng lấy.
    • Để quét một lượng nhỏ (ví dụ, vài trăm bài mới nhất): Nhập 100, 500.
    • Để quét toàn bộ (hoặc nhiều nhất có thể): Nhập một số rất lớn, ví dụ: 200000. Hệ thống sẽ cố gắng lấy hết các bài viết công khai cho đến khi đạt giới hạn này hoặc không còn bài nào nữa.
    • Nếu để trống, hệ thống sẽ quét mặc định 50 bài viết.
  4. Kiểm Tra Chi Phí Ước Tính:

    Khi bạn thay đổi "Số Lượng Bài Viết", dòng chữ "Chi phí dự kiến..." bên dưới sẽ tự động cập nhật, cho bạn biết số credit sẽ bị trừ ban đầu. Hệ thống sẽ hoàn lại credit tự động nếu số bài viết thực tế quét được ít hơn số lượng đã trừ phí.

  5. Bắt Đầu Quá Trình Quét:

    Nhấn nút "Bắt Đầu Quét".

    • Hệ thống sẽ xác nhận yêu cầu, trừ credit và tạo một Scan Session Token (mã phiên quét) duy nhất. Mã này sẽ hiển thị trong khu vực tiến trình. Bạn nên sao chép và lưu lại mã này.
    • Một thông báo sẽ xuất hiện cho biết yêu cầu của bạn đã được đưa vào hàng đợi và quá trình quét sẽ chạy ngầm. Bạn không cần phải treo tab trình duyệt.
    • Khu vực "Tiến Trình Quét" sẽ tự động cập nhật định kỳ để hiển thị trạng thái (Đang chờ, Đang xử lý, Hoàn tất, Thất bại), số bài đã quét được, và thanh tiến trình.
  6. Theo Dõi và Nhận Kết Quả:
    • Bạn có thể rời khỏi trang và quay lại sau. Nếu bạn đã lưu Scan Session Token, bạn có thể (trong tương lai, nếu có chức năng) nhập token đó để xem lại tiến trình. Hiện tại, nếu bạn làm mới trang hoặc truy cập lại, tiến trình sẽ không tự động hiển thị lại trừ khi bạn khởi tạo lại (hệ thống có thể resume nếu phiên cũ chưa xong và trùng ID/limit).
    • Khi trạng thái chuyển thành "completed" (hoàn tất), một đường dẫn để Tải Xuống File JSON Kết Quả sẽ xuất hiện. File này chứa toàn bộ dữ liệu các bài viết đã quét được.
    • Đường dẫn file JSON cũng sẽ được hiển thị để bạn có thể copy và sử dụng nếu cần.
Mẹo Quan Trọng:

Quét toàn bộ: Để quét nhiều bài viết nhất, hãy nhập một giá trị "Số Lượng Bài Viết" lớn (ví dụ: 200000). Quá trình này có thể mất nhiều thời gian (vài phút đến vài giờ) tùy thuộc vào số lượng bài viết của Fanpage.

Không cần treo máy: Sau khi khởi tạo thành công và nhận được Scan Session Token, bạn có thể đóng trình duyệt. Hệ thống của chúng tôi sẽ tự động xử lý ngầm.

Kiểm tra định kỳ: Quay lại trang này và sử dụng chức năng kiểm tra trạng thái (nếu có) với Scan Session Token của bạn, hoặc đơn giản là đợi thông báo (nếu có) hoặc kiểm tra file log đã được thông báo khi bạn khởi tạo.

Tài Liệu API Cho Nhà Phát Triển

Tích hợp chức năng quét toàn bộ bài viết Fanpage vào ứng dụng hoặc quy trình tự động hóa của bạn bằng API của Tool Việt Nam. Cơ chế hoạt động bao gồm việc khởi tạo một phiên quét, sau đó polling để kiểm tra trạng thái và nhận kết quả.

Luồng Hoạt Động Chính Của API

  1. Bước 1: Khởi Tạo Phiên Quét
    • Client gửi một request POST (khuyến nghị) hoặc GET đến endpoint chính.
    • Request này phải chứa: key (API Key), id (Fanpage ID), và (tùy chọn) limit (số lượng bài viết). Nên thêm ajax_reload=1 để đảm bảo nhận JSON.
    • Server (Tool.vn API) sẽ:
      • Xác thực API Key và các tham số.
      • Trừ credit ban đầu dựa trên `limit`.
      • Tạo một scan_session_token duy nhất.
      • Lưu thông tin phiên quét vào cơ sở dữ liệu với trạng thái ban đầu là queued.
      • **Phản hồi ngay lập tức (HTTP 202 Accepted)** cho client với JSON chứa scan_session_token, trạng thái queued, và các thông tin ban đầu.
    • Client cần lưu lại scan_session_token này để sử dụng ở các bước sau.
  2. Bước 2: Kiểm Tra Trạng Thái Phiên Quét (Polling)
    • Sau khi có scan_session_token, client gửi request GET đến cùng endpoint.
    • Request này phải chứa: key (API Key) và scan_token đã nhận được. Nên request kiểm tra trạng thái tải file để cập nhật file nhanh nhất
    • Server sẽ truy vấn cơ sở dữ liệu và trả về trạng thái hiện tại của phiên quét:
      • Nếu status: "queued": Phiên quét đang chờ xử lý. Client nên đợi và request lại sau delay_seconds.
      • Nếu status: "processing": Phiên quét đang được xử lý. Phản hồi sẽ chứa total_posts_fetched_so_far.
      • Nếu status: "completed": Phiên quét đã hoàn tất. Phản hồi sẽ chứa fetched_count_total và đường dẫn log_file (URL HTTP) đến file JSON kết quả.
      • Nếu status: "failed": Phiên quét đã thất bại. Phản hồi sẽ chứa last_error_message.
    • Client lặp lại việc polling này cho đến khi nhận được trạng thái completed hoặc failed.
  3. Bước 3: Tải File Kết Quả

    Khi trạng thái là completed và có đường dẫn log_file, client có thể sử dụng URL đó để tải trực tiếp file JSON chứa toàn bộ dữ liệu bài viết đã được quét.

Endpoint Chính

POST (khuyến nghị cho khởi tạo) hoặc GET: https://tool.vn/api/facebook/scan-all-posts-fanpage

Xác Thực (Authentication)

Mọi yêu cầu đến API đều cần được xác thực bằng API Key của bạn. Truyền API Key qua tham số URL key=YOUR_API_KEY.

Bạn có thể tạo và quản lý API Key tại Khu vực Quản lý API Key.

Tham Số Yêu Cầu (Request Parameters)

1. Khởi Tạo Phiên Quét Mới (action=init hoặc không có `scan_token`):
Tham SốBắt Buộc?Mô TảVí Dụ
keyAPI Key của bạn.TOOLVN-V1-XXXX
idID dạng số của Fanpage Facebook.61565985206441
limitKhôngSố lượng bài viết tối đa muốn quét. Mặc định: 50. Tối đa: 200000.1000

Ví dụ URL Khởi tạo (GET):

https://tool.vn/api/facebook/scan-all-posts-fanpage?key=YOUR_API_KEY&id=1000PAGEID&limit=500

Ví dụ Body (POST - application/x-www-form-urlencoded):

key=YOUR_API_KEY&id=1000PAGEID&limit=500
2. Kiểm Tra Trạng Thái Phiên Quét (action=status hoặc có `scan_token`):
Tham SốBắt Buộc?Mô TảVí Dụ
keyAPI Key của bạn.TOOLVN-V1-XXXX
scan_tokenScan Session Token nhận được từ request khởi tạo.ssapi_xxxxxxxxxx

Ví dụ URL Kiểm Tra Trạng Thái:

https://tool.vn/api/facebook/scan-all-posts-fanpage?key=YOUR_API_KEY&scan_token=ssapi_xxxxxxxxxxxxxx

Phản Hồi (API Responses)

Tất cả phản hồi từ API đều ở định dạng JSON được sử dụng.

Response Khi Khởi Tạo Phiên Quét Thành Công (HTTP 202 Accepted):
{
    "status": "success", // Trạng thái của API call này
    "message": "Yêu cầu quét đã được tiếp nhận và đưa vào hàng đợi xử lý.",
    "data": {
        "scan_session_token": "ssapi_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // Lưu lại token này
        "page_id": "1000PAGEID",
        "target_limit": 500,
        "status": "queued", // Trạng thái của PHIÊN QUÉT
        "message_from_api": "Sử dụng Scan Session Token này để kiểm tra tiến trình.",
        "log_file_path_pattern": "https://tool.vn/api/facebook/log_scan_post/1000PAGEID_xxxxxxxxxxxxxx.json", // Đường dẫn liên kết dự kiến
        "delay_seconds": 20 // Thời gian (giây) gợi ý client đợi trước khi poll lại
    }
}
Response Khi Kiểm Tra Tiến Trình (Đang Xử Lý - `status: "processing"` trong `data`):
{
    "status": "success", // Trạng thái của API call này
    "message": "Lấy thông tin phiên quét thành công.",
    "data": {
        "scan_session_token": "ssapi_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "page_id": "1000PAGEID",
        "target_limit": 500,
        "total_posts_fetched_so_far": 75, // Số bài đã quét được
        "status": "processing", // Trạng thái của PHIÊN QUÉT
        "created_at": "2025-06-17 10:00:00",
        "processing_started_at": "2025-06-17 10:00:05", // Thời điểm bắt đầu
        "last_progress_update_at": "2025-06-17 10:05:30", // Thời điểm cập nhật tiến độ lần cuối
        "completed_at": null,
        "message_from_api": "Đang xử lý... Bài viết đã lấy: 75/500.",
        "log_file": null, // Chưa có file log cuối cùng
        "delay_seconds": 15 // Thời gian (giây) gợi ý client đợi trước khi poll lại
    }
}
Response Khi Hoàn Tất Quét Thành Công (`status: "completed"` trong `data`):
{
    "status": "success", // Trạng thái của API call này
    "message": "Lấy thông tin phiên quét thành công.",
    "data": {
        "scan_session_token": "ssapi_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "page_id": "1000PAGEID",
        "target_limit": 500,
        "total_posts_fetched_so_far": 500, // Hoặc số lượng thực tế nếu ít hơn limit
        "status": "completed", // Trạng thái của PHIÊN QUÉT
        "created_at": "2025-06-17 10:00:00",
        "processing_started_at": "2025-06-17 10:00:05",
        "last_progress_update_at": "2025-06-17 10:25:00",
        "completed_at": "2025-06-17 10:25:00", // Thời điểm hoàn tất
        "message_from_api": "Hoàn tất. Tổng bài viết: 500.",
        "log_file": "https://tool.vn/api/facebook/log_scan_post/1000PAGEID_xxxxxxxxxxxxxx.json", // URL để tải file
        "delay_seconds": 3600 // Có thể poll ít thường xuyên hơn hoặc không cần thiết. Giữ lại session token để lấy thông tin file
    }
}

Đường dẫn log_file là URL HTTP đầy đủ để bạn có thể tải file JSON chứa kết quả quét.

Response Khi Phiên Quét Thất Bại (`status: "failed"` trong `data`):
{
    "status": "success", // Trạng thái của API call này (vẫn lấy được thông tin phiên)
    "message": "Lấy thông tin phiên quét thành công.",
    "data": {
        "scan_session_token": "ssapi_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "page_id": "1000PAGEID",
        "target_limit": 500,
        "total_posts_fetched_so_far": 150, // Số bài quét được trước khi lỗi
        "status": "failed", // Trạng thái của PHIÊN QUÉT
        "created_at": "2025-06-17 10:00:00",
        "processing_started_at": "2025-06-17 10:00:05",
        "last_progress_update_at": "2025-06-17 10:15:00",
        "completed_at": "2025-06-17 10:15:00", // Thời điểm thất bại
        "message_from_api": "Thất bại. Lỗi phát sinh từ hệ thống vui lòng liên hệ với chúng tôi.", // Lý do lỗi từ worker
        "log_file": "https://tool.vn/api/facebook/log_scan_post/1000PAGEID_xxxxxxxxxxxxxx.json", // Có thể có file log chứa dữ liệu đã quét được một phần
        "delay_seconds": 3600
    }
}

Các Mã Lỗi HTTP Thường Gặp (API Endpoint Call)

Mã LỗiTên LỗiMô Tả & Cách Xử Lý
400 Bad RequestLỗi Tham SốThiếu tham số bắt buộc (key, id khi khởi tạo; key, scan_token khi kiểm tra trạng thái), hoặc giá trị tham số không hợp lệ. Kiểm tra lại các tham số bạn gửi.
401 UnauthorizedXác Thực Thất BạiAPI Key (key) không hợp lệ, đã bị vô hiệu hóa, hoặc không có quyền truy cập.
402 Payment RequiredYêu Cầu Thanh ToánKhông đủ credit để khởi tạo phiên quét mới. Vui lòng nạp thêm credit.
403 ForbiddenTruy Cập Bị Từ ChốiAPI Key của request kiểm tra trạng thái không khớp với API Key đã khởi tạo phiên quét (hoặc không thuộc cùng người dùng).
404 Not FoundKhông Tìm Thấyscan_token không tồn tại trong hệ thống. Hoặc, trong một số trường hợp, Fanpage ID không tồn tại trên Facebook (lỗi này thường sẽ được báo trong last_error_message của phiên quét).
500 Internal Server ErrorLỗi Máy Chủ (API Endpoint)Lỗi không mong muốn từ phía máy chủ của Tool.vn khi xử lý request của bạn (ví dụ: lỗi kết nối DB tạm thời tại API endpoint). Vui lòng thử lại sau. Nếu lỗi kéo dài, liên hệ hỗ trợ.
503 Service UnavailableDịch Vụ Không Khả Dụng (Thường là lỗi từ Worker hoặc Facebook)Worker xử lý ngầm có thể đang gặp sự cố (ví dụ: lỗi nghiêm trọng khi tương tác với Facebook API, rate limit). Kiểm tra trạng thái phiên quét để xem chi tiết lỗi trong last_error_message.

Lưu ý: Ngay cả khi API Endpoint trả về HTTP 200/202, phiên quét thực tế vẫn có thể gặp lỗi (status: "failed"). Luôn kiểm tra trường status trong dữ liệu phản hồi của phiên quét.

Tích Hợp Với Công Cụ Tự Động Hóa (n8n, Make, etc.)

Với cơ chế polling và Scan Session Token, bạn có thể dễ dàng tích hợp API này vào các nền tảng No-Code/Low-Code. Dưới đây là hướng dẫn chi tiết cho n8n, bạn có thể áp dụng tương tự cho Make.com (Integromat) hoặc các công cụ khác.

n8n Logo

Quy Trình Mẫu Với n8n

  1. 1. Trigger Node: Bắt đầu workflow. Có thể là "Manual", "Schedule", "Webhook", hoặc từ một ứng dụng khác (ví dụ: Google Sheets).
  2. 2. Set Node (SetInitialParams): Thiết lập các thông số ban đầu.

    Output của node này (ví dụ):

    {
      "apiKey": "YOUR_API_KEY",
      "fanpageId": "123456789012345", // Lấy từ Trigger hoặc đặt cố định
      "limit": 250 // Số lượng bài viết mong muốn
    }
  3. 3. HTTP Request Node (InitScanSession): Khởi tạo phiên quét.
    • Request Method: POST (khuyến nghị) hoặc GET.
    • URL: https://tool.vn/api/facebook/scan-all-posts-fanpage
    • Send Query Parameters: Yes
      • key: {{ $('SetInitialParams').item.json.apiKey }}
      • id: {{ $('SetInitialParams').item.json.fanpageId }}
      • limit: {{ $('SetInitialParams').item.json.limit }}
      • ajax_reload: 1
    • Options: Bật "Continue on Fail" để có thể xử lý lỗi API.
    • Lưu ý: Node này sẽ trả về scan_session_token trong {{ $json.data.scan_session_token }}.
  4. 4. Set Node (SetScanToken): Trích xuất và lưu scan_token.

    Đặt một biến, ví dụ currentScanToken, với giá trị: {{ $('InitScanSession').item.json.data.scan_session_token }}.

  5. 5. Loop Over Items Node (PollingLoop): Tạo vòng lặp để poll trạng thái.
    • Mode: "Run Fixed Number of Times" (ví dụ: 240 lần, tương đương 2 giờ nếu mỗi lần chờ 30s) hoặc bạn có thể xây dựng logic phức tạp hơn với "Run Until True/False".
    • Iterations: Đặt một số lần lặp tối đa hợp lý.
  6. 6. HTTP Request Node (CheckStatus - bên trong PollingLoop): Kiểm tra trạng thái.
    • Request Method: GET.
    • URL: https://tool.vn/api/facebook/scan-all-posts-fanpage
    • Send Query Parameters: Yes
      • key: {{ $('SetInitialParams').item.json.apiKey }}
      • scan_token: {{ $('SetScanToken').item.json.currentScanToken }}
      • ajax_reload: 1
    • Options: Bật "Continue on Fail".
    • Output của node này sẽ chứa trạng thái hiện tại (ví dụ: {{ $json.data.status }}, {{ $json.data.log_file }}).
  7. 7. If Node (IsScanComplete - bên trong PollingLoop): Kiểm tra xem quét đã xong chưa.
    • Condition 1: {{ $('CheckStatus').item.json.data.status }} - String - Equals - completed
    • Condition 2 (OR): {{ $('CheckStatus').item.json.data.status }} - String - Equals - failed
    • Nếu một trong hai điều kiện đúng, đi đến output "true" (để dừng vòng lặp). Ngược lại, đi đến output "false".
  8. 8. Wait Node (PollingDelay - nối từ output "false" của IsScanComplete):
    • Wait Time: {{ $('CheckStatus').item.json.data.delay_seconds || 30 }} giây (Lấy thời gian chờ từ API, hoặc mặc định 30 giây).
    • Node này sẽ nối lại vào đầu PollingLoop hoặc vào CheckStatus của lần lặp tiếp theo.
  9. 9. Break Loop Node (Nối từ output "true" của IsScanComplete): Để thoát khỏi vòng lặp polling khi hoàn tất hoặc thất bại.
  10. 10. Set Node (FinalStatus - sau PollingLoop): Lấy kết quả cuối cùng từ lần CheckStatus cuối cùng.

    Ví dụ: finalStatus = {{ $('CheckStatus').item.json.data.status }}, logFileUrl = {{ $('CheckStatus').item.json.data.log_file }}.

  11. 11. If Node (ProcessResult): Xử lý kết quả cuối cùng.
    • Nếu finalStatus == 'completed'logFileUrl tồn tại:
      • HTTP Request Node (DownloadFile): Tải file từ logFileUrl. Lưu ý đặt "Response Format" là "File".
      • Sau đó, bạn có thể dùng các node khác để đọc JSON từ file (Read Binary File -> Move Binary Data -> JSON), xử lý dữ liệu, lưu vào Google Sheets, database, etc.
    • Nếu finalStatus == 'failed':
      • Error Handling Node: Gửi thông báo lỗi (Email, Slack, Discord).

Lưu ý quan trọng: Trong n8n, để tham chiếu dữ liệu từ các node trước đó trong một vòng lặp, bạn có thể cần sử dụng "Merge Node" hoặc cách tiếp cận "Split in Batches" nếu vòng lặp xử lý nhiều item. Với polling một session duy nhất, việc tham chiếu trực tiếp thường hoạt động, nhưng hãy kiểm tra kỹ cú pháp biểu thức của n8n.

Tương tự, bạn có thể áp dụng logic polling này cho Make.com (Integromat) sử dụng module "HTTP > Make a request", "Router" để kiểm tra điều kiện, "Sleep" để chờ, và các module lặp (Repeater hoặc Iterator kết hợp với Array Aggregator nếu cần xử lý nhiều session).

Ví Dụ Code Tích Hợp (PHP cURL)

Dưới đây là ví dụ cơ bản bằng PHP để minh họa cách gọi API, khởi tạo phiên quét và thực hiện polling để lấy kết quả.

<?php

$apiKey = 'YOUR_API_KEY'; // Thay bằng API Key của bạn
$fanpageId = '1000PAGEID';   // Thay bằng ID Fanpage thực tế
$limit = 100;                // Số lượng bài viết mong muốn

$baseUrl = 'https://tool.vn/api/facebook/scan-all-posts-fanpage';
$maxPolls = 240; // Tối đa 240 lần poll (ví dụ: 240 * 30s = 2 giờ, thông thường chúng tôi có thể lấy dữ liệu của 1000 bài viết trong khoản 10-15 phút)
$defaultPollDelay = 30; // Giây

function callScanApi(string $url, array $params = []) {
    $queryString = http_build_query($params);
    $finalUrl = $url . (strpos($url, '?') === false ? '?' : '&') . $queryString;

    $ch = curl_init($finalUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 60); // Timeout cho mỗi cURL call
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    $responseJson = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError = curl_error($ch);
    curl_close($ch);

    if ($curlError) {
        echo "cURL Error: " . $curlError . "\n";
        return null;
    }
    
    $responseData = json_decode($responseJson, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        echo "JSON Decode Error: " . json_last_error_msg() . "\nRaw Response: {$responseJson}\n";
        return null;
    }
    
    echo "API Call to {$finalUrl}\nHTTP Status: {$httpCode}\n";
    // echo "API Response: " . json_encode($responseData, JSON_PRETTY_PRINT) . "\n";

    if (!in_array($httpCode, [200, 202])) {
        echo "API Error (HTTP {$httpCode}): " . ($responseData['message'] ?? 'Unknown error') . "\n";
        return null;
    }
    return $responseData;
}

// 1. Khởi tạo phiên quét
echo "--- Bước 1: Khởi tạo phiên quét ---\n";
$initParams = [
    'key' => $apiKey,
    'id' => $fanpageId,
    'limit' => $limit,
    'ajax_reload' => 1
];
$initResponse = callScanApi($baseUrl, $initParams);

if (!$initResponse || !isset($initResponse['data']['scan_session_token'])) {
    echo "Lỗi nghiêm trọng: Không thể khởi tạo phiên quét hoặc không nhận được scan_session_token.\n";
    exit;
}

$scanToken = $initResponse['data']['scan_session_token'];
echo "Phiên quét đã được tạo: {$scanToken}\n";
echo "Trạng thái ban đầu: " . ($initResponse['data']['status'] ?? 'N/A') . "\n";
echo "Thông điệp: " . ($initResponse['data']['message_from_api'] ?? $initResponse['message'] ?? 'N/A') . "\n\n";


// 2. Polling để kiểm tra tiến trình
echo "--- Bước 2: Bắt đầu Polling kiểm tra tiến trình ---\n";
$isCompleted = false;
$pollCount = 0;
$logFileUrl = null;
$currentPollDelay = $initResponse['data']['delay_seconds'] ?? $defaultPollDelay;

while (!$isCompleted && $pollCount < $maxPolls) {
    $pollCount++;
    
    echo "Đang chờ {$currentPollDelay} giây trước khi poll lần #{$pollCount}...\n";
    sleep($currentPollDelay);

    $statusParams = [
        'key' => $apiKey,
        'scan_token' => $scanToken,
        'ajax_reload' => 1
    ];
    $statusResponse = callScanApi($baseUrl, $statusParams);

    if (!$statusResponse || !isset($statusResponse['data'])) {
        echo "Lỗi khi poll trạng thái, dừng lại.\n";
        break; 
    }
    
    $sessionData = $statusResponse['data'];
    $sessionStatus = $sessionData['status'] ?? 'unknown';
    $currentPollDelay = $sessionData['delay_seconds'] ?? $defaultPollDelay;


    echo "-------------------------------------\n";
    echo "Kết quả poll lần {$pollCount}:\n";
    echo "Thông điệp API: " . ($statusResponse['message'] ?? 'N/A') . "\n";
    echo "Trạng thái phiên: " . strtoupper($sessionStatus) . "\n";
    echo "Bài viết đã xử lý: " . ($sessionData['total_posts_fetched_so_far'] ?? 'N/A') . " / " . ($sessionData['target_limit'] ?? 'N/A') . "\n";
    if (isset($sessionData['last_progress_update_at'])) {
        echo "Cập nhật tiến độ lần cuối: " . $sessionData['last_progress_update_at'] . "\n";
    }
    
    if ($sessionStatus === 'completed') {
        echo "Quá trình quét đã HOÀN TẤT!\n";
        $logFileUrl = $sessionData['log_file'] ?? null;
        $isCompleted = true;
    } elseif ($sessionStatus === 'failed') {
        echo "Quá trình quét đã THẤT BẠI.\n";
        if (isset($sessionData['message_from_api'])) echo "Lý do: " . $sessionData['message_from_api'] . "\n";
        else if (isset($sessionData['last_error_message'])) echo "Lý do: " . $sessionData['last_error_message'] . "\n";
        $logFileUrl = $sessionData['log_file'] ?? null; // Có thể có file log lỗi hoặc dữ liệu một phần
        $isCompleted = true; 
    } else if ($sessionStatus === 'queued' || $sessionStatus === 'processing') {
        echo "Trạng thái: Đang chờ hoặc đang xử lý...\n";
    } else {
        echo "Trạng thái không xác định: {$sessionStatus}. Dừng polling.\n";
        $isCompleted = true;
    }
     echo "-------------------------------------\n\n";
}

// 3. Xử lý kết quả cuối cùng
echo "--- Bước 3: Kết thúc Polling ---\n";
if ($pollCount >= $maxPolls && !$isCompleted) {
    echo "Đã đạt giới hạn số lần poll ({$maxPolls} lần). Phiên quét có thể vẫn đang chạy nhưng do số lượng file lớn nên dữ liệu chưa cập nhật chính xác.\n";
    echo "Vui lòng kiểm tra lại sau bằng Scan Token: {$scanToken}\n";
}

if ($logFileUrl) {
    echo "Đường dẫn file kết quả JSON: " . $logFileUrl . "\n";
    echo "Bạn có thể sử dụng URL này để tải file dữ liệu.\n";
    // Ví dụ:
    // $jsonData = file_get_contents($logFileUrl);
    // if ($jsonData) {
    //     file_put_contents('downloaded_fanpage_posts_' . $fanpageId . '.json', $jsonData);
    //     echo "Đã tải file kết quả về downloaded_fanpage_posts_{$fanpageId}.json\n";
    // } else {
    //     echo "Không thể tải file từ URL.\n";
    // }
} else {
    echo "Không tìm thấy đường dẫn file kết quả cuối cùng.\n";
}

echo "Script kết thúc.\n";

?>

Cài đặt

Chủ đề
Hướng chủ đề
Màu sắc chủ đề
Kiểu bố cục
Tùy chọn khung
Kiểu thanh bên
Thiết kế thẻ
Giỏ hàng
0 Sản Phẩm
Thuế & phí
Tổng cộng
Tiếp tục thanh toán