MinerU 4.0.12 实战笔记:从PDF到可用的Markdown – weiwei22844

MinerU 4.0.12 实战笔记:从PDF到可用的Markdown – weiwei22844


#!/usr/bin/env python3
"""MinerU 4.0.12 V1 API 的三种 PDF 解析调用方式。

用法:
    python mineru_api_examples.py uploads  doc.pdf   # 标准链路: /v1/uploads -> /v1/parse/jobs -> /v1/files
    python mineru_api_examples.py tasks    doc.pdf   # 便捷异步: /v1/tasks -> /v1/tasks/{id}/result
    python mineru_api_examples.py sync     doc.pdf   # 同步包装: /v1/file_parse

环境变量:
    MINERU_API_URL  服务地址,默认 
    MINERU_API_KEY  API key;未设置时读取 /root/zww/minerU/.mineru_api_key

依赖: requests (pip install requests)
"""

from __future__ import annotations

import argparse
import hashlib
import json
import os
import sys
import time
from pathlib import Path
from urllib.parse import urljoin, urlparse

import requests

DEFAULT_BASE_URL = ""
DEFAULT_KEY_FILE = Path("/root/zww/minerU/.mineru_api_key")
TERMINAL_STATUSES = {"completed", "partial", "failed", "canceled"}
OUTPUT_SUFFIX = {
    "markdown": ".md",
    "middle_json": ".middle.json",
    "structured_content": ".structured_content.json",
    "zip": ".zip",
}


def load_api_key() -> str:
    key = os.environ.get("MINERU_API_KEY", "").strip()
    if key:
        return key
    if DEFAULT_KEY_FILE.is_file():
        return DEFAULT_KEY_FILE.read_text(encoding="utf-8").strip()
    return ""


class Client:
    """所有请求都显式带上 Bearer Token;上传/下载的跨源场景单独处理。"""
    def __init__(self, base_url: str, api_key: str) -> None:
        self.base_url = base_url.rstrip("/")
        self.api_key = api_key
        self.session = requests.Session()

    def headers(self, extra: dict[str, str] | None = None) -> dict[str, str]:
        headers = {"Authorization": f"Bearer {self.api_key}"} if self.api_key else {}
        if extra:
            headers.update(extra)
        return headers

    def call(self, method: str, path: str, *, headers: dict[str, str] | None = None, **kwargs) -> requests.Response:
        response = self.session.request(method, f"{self.base_url}{path}", headers=self.headers(headers), **kwargs)
        if response.status_code >= 400:
            raise RuntimeError(f"{method} {path} -> {response.status_code}: {response.text[:500]}")
        return response

    def poll(self, path: str, *, timeout: float = 600.0, interval: float = 1.0) -> dict:
        deadline = time.monotonic() + timeout
        while True:
            payload = self.call("GET", path).json()
            status = payload.get("status")
            print(f"  状态: {status}")
            if status in TERMINAL_STATUSES:
                return payload
            if time.monotonic() >= deadline:
                raise TimeoutError(f"{path} 在 {timeout:.0f}s 内没有进入终态 (最后状态 {status})")
            time.sleep(interval)

    def download(self, file_id: str) -> bytes:
        """下载产物;遇到 302 时不把 API key 带给另一个源。"""
        response = self.session.get(
            f"{self.base_url}/v1/files/{file_id}/content", headers=self.headers(), allow_redirects=False
        )
        if response.is_redirect:
            response = requests.get(response.headers["Location"], timeout=300)
        if response.status_code >= 400:
            raise RuntimeError(f"GET /v1/files/{file_id}/content -> {response.status_code}: {response.text[:300]}")
        return response.content


def same_origin(url: str, base_url: str) -> bool:
    """方案 + 主机 + 有效端口都一致才算同源,同主机不同端口也算跨源。"""
    def origin(value: str) -> tuple[str, str | None, int]:
        parsed = urlparse(value)
        return parsed.scheme, parsed.hostname, parsed.port or (443 if parsed.scheme == "https" else 80)

    return origin(url) == origin(base_url)


def save_job_outputs(client: Client, files: list[dict], out_dir: Path) -> list[Path]:
    """Job / task 响应里的 files[] 形状一致:name + status + output_files。"""
    out_dir.mkdir(parents=True, exist_ok=True)
    saved: list[Path] = []
    for entry in files:
        if entry.get("status") != "completed":
            print(f"  跳过 {entry.get('name')}: {entry.get('status')} {entry.get('error')}")
            continue
        stem = Path(entry["name"]).stem
        for fmt, ref in (entry.get("output_files") or {}).items():
            if not ref:
                continue
            target = out_dir / f"{stem}{OUTPUT_SUFFIX.get(fmt, '.' + fmt)}"
            target.write_bytes(client.download(ref["file_id"]))
            saved.append(target)
            print(f"  保存 {target} ({target.stat().st_size} 字节)")
    return saved


def save_task_content(payload: dict, out_dir: Path) -> list[Path]:
    """/v1/tasks/{id}/result 与 /v1/file_parse 返回的内联结果。"""
    out_dir.mkdir(parents=True, exist_ok=True)
    saved: list[Path] = []
    for entry in payload.get("files", []):
        if entry.get("status") != "completed":
            print(f"  跳过 {entry.get('name')}: {entry.get('status')} {entry.get('error')}")
            continue
        stem = Path(entry["name"]).stem
        for fmt, content in (entry.get("content") or {}).items():
            target = out_dir / f"{stem}{OUTPUT_SUFFIX.get(fmt, '.' + fmt)}"
            if isinstance(content, str):
                target.write_text(content, encoding="utf-8")
            else:
                target.write_text(json.dumps(content, ensure_ascii=False, indent=2), encoding="utf-8")
            saved.append(target)
            print(f"  保存 {target} ({target.stat().st_size} 字节)")
    return saved


# ── 示例一:/v1/uploads + /v1/parse/jobs(标准链路)────────────────────
def example_uploads_then_jobs(
    client: Client, pdf: Path, out_dir: Path, *, tier: str, ocr_mode: str, formats: list[str]
) -> None:
    """上传字节 -> 拿到 file_id -> 提交 Job -> 轮询 -> 从 /v1/files 下载产物。"""
    data = pdf.read_bytes()
    sha256 = hashlib.sha256(data).hexdigest()

    # 1) 创建上传会话。带 sha256sum 时,服务端已有相同字节会直接返回 completed(秒传)。
    upload = client.call(
        "POST",
        "/v1/uploads",
        json={
            "filename": pdf.name,
            "bytes": len(data),
            "mime_type": "application/pdf",
            "purpose": "parse",
            "sha256sum": sha256,
        },
    ).json()
    print(f"1. upload {upload['id']} status={upload['status']}")

    if upload["status"] == "pending":
        upload_url = urljoin(f"{client.base_url}/", upload["upload_url"])
        upload_headers = dict(upload.get("upload_headers") or {})
        if same_origin(upload_url, client.base_url):
            # 本地服务的上传地址同源,需要带 API key;云端的预签名 URL 是跨源,不能带。
            upload_headers = client.headers(upload_headers)
        response = client.session.put(upload_url, data=data, headers=upload_headers, timeout=300)
        if response.status_code >= 400:
            raise RuntimeError(f"PUT {upload_url} -> {response.status_code}: {response.text[:300]}")
        print(f"2. PUT bytes {len(data)}")

        # 3) complete 生成 File 对象。
        upload = client.call(
            "POST", f"/v1/uploads/{upload['id']}/complete", json={"sha256sum": sha256}
        ).json()
        print(f"3. complete status={upload['status']}")

    file_id = upload["file"]["id"]
    print(f"   file_id={file_id}")

    # 4) 提交解析任务:POST /v1/parse/jobs 永远返回 202,不会同步等结果。
    job = client.call(
        "POST",
        "/v1/parse/jobs",
        json={
            "files": [{"source": {"type": "file_id", "file_id": file_id}}],
            "tier": tier,
            "ocr_mode": ocr_mode,
            "output_formats": formats,
        },
    ).json()
    job_id = job["job_id"]
    print(f"4. job {job_id} status={job['status']}")

    # 5) 轮询到终态。completed / partial / failed / canceled 都是终态。
    job = client.poll(f"/v1/parse/jobs/{job_id}")
    print(f"5. job 结束: {job['status']}")

    # 6) 产物只给 file_id,内容必须从 /v1/files/{file_id}/content 取。
    save_job_outputs(client, job.get("files", []), out_dir)


# ── 示例二:/v1/tasks(自部署便捷异步接口)───────────────────────────
def example_tasks(
    client: Client, pdf: Path, out_dir: Path, *, tier: str, ocr_mode: str, formats: list[str]
) -> None:
    """multipart 直接提交,主进程不用先走 uploads;结果可从 /result 内联取。"""
    params: list[tuple[str, str]] = [("tier", tier), ("ocr_mode", ocr_mode)]
    params += [("output_formats", fmt) for fmt in formats]
    form: list[tuple[str, tuple[str, bytes, str]]] = [("files", (pdf.name, pdf.read_bytes(), "application/pdf"))]

    task = client.call("POST", "/v1/tasks", params=params, files=form).json()
    task_id = task["task_id"]
    print(f"1. task {task_id} status={task['status']}")

    task = client.poll(f"/v1/tasks/{task_id}")
    print(f"2. task 结束: {task['status']} (task_id 就是 job_id,可用 /v1/parse/jobs/{task_id} 查)")

    # 3) /result: 未终态 202,completed/partial 200,failed/canceled 409。
    if "zip" in formats:
        response = client.session.get(
            f"{client.base_url}/v1/tasks/{task_id}/result",
            params={"response_format": "zip"},
            headers=client.headers(),
            timeout=600,
        )
        if response.status_code == 409:
            print(f"   任务失败: {response.text[:500]}")
            return
        response.raise_for_status()
        out_dir.mkdir(parents=True, exist_ok=True)
        target = out_dir / f"{pdf.stem}{OUTPUT_SUFFIX['zip']}"
        target.write_bytes(response.content)
        print(f"3. 保存 {target} ({target.stat().st_size} 字节)")
        return

    response = client.session.get(
        f"{client.base_url}/v1/tasks/{task_id}/result",
        params={"response_format": "json"},
        headers=client.headers(),
        timeout=600,
    )
    if response.status_code == 409:
        print(f"   任务失败: {response.text[:500]}")
        return
    response.raise_for_status()
    save_task_content(response.json(), out_dir)


# ── 示例三:/v1/file_parse(自部署同步包装)──────────────────────────
def example_file_parse(
    client: Client, pdf: Path, out_dir: Path, *, tier: str, ocr_mode: str, formats: list[str], wait_timeout: int = 600
) -> None:
    """一次请求等结果;超过 wait_timeout 会返回 202 和查询地址,后台任务继续跑。"""
    response_format = "zip" if "zip" in formats else "json"
    params: list[tuple[str, str]] = [
        ("tier", tier),
        ("ocr_mode", ocr_mode),
        ("response_format", response_format),
        ("wait_timeout", str(wait_timeout)),
    ]
    params += [("output_formats", fmt) for fmt in formats]
    form: list[tuple[str, tuple[str, bytes, str]]] = [("files", (pdf.name, pdf.read_bytes(), "application/pdf"))]

    response = client.session.post(
        f"{client.base_url}/v1/file_parse", params=params, files=form, headers=client.headers(), timeout=wait_timeout + 60
    )
    if response.status_code == 202:
        task = response.json()
        task_id = task["task_id"]
        print(f"1. 等待超时,任务仍在跑: {task_id},转为轮询")
        client.poll(f"/v1/tasks/{task_id}")
        response = client.session.get(
            f"{client.base_url}/v1/tasks/{task_id}/result",
            params={"response_format": response_format},
            headers=client.headers(),
            timeout=600,
        )
    if response.status_code == 409:
        print(f"任务失败: {response.text[:500]}")
        return
    if response.status_code >= 400:
        raise RuntimeError(f"POST /v1/file_parse -> {response.status_code}: {response.text[:500]}")

    print(f"1. 同步返回: {response.status_code}")
    if response_format == "zip":
        out_dir.mkdir(parents=True, exist_ok=True)
        target = out_dir / f"{pdf.stem}{OUTPUT_SUFFIX['zip']}"
        target.write_bytes(response.content)
        print(f"2. 保存 {target} ({target.stat().st_size} 字节)")
        return
    save_task_content(response.json(), out_dir)


def main() -> int:
    parser = argparse.ArgumentParser(description="MinerU 4.0.12 V1 API PDF 解析示例")
    parser.add_argument("mode", choices=["uploads", "tasks", "sync"], help="要演示的接口组合")
    parser.add_argument("pdf", type=Path, help="待解析的 PDF")
    parser.add_argument("--out", type=Path, default=None, help="产物目录,默认 ./_")
    parser.add_argument("--tier", default="flash", choices=["flash", "basic", "standard", "advanced"])
    parser.add_argument("--ocr-mode", default="auto", choices=["auto", "txt", "ocr"])
    parser.add_argument("--formats", default="markdown", help="逗号分隔: markdown,middle_json,structured_content,zip")
    parser.add_argument("--wait-timeout", type=int, default=600, help="sync 模式等待秒数 (1-3600)")
    args = parser.parse_args()

    if not args.pdf.is_file():
        print(f"找不到文件: {args.pdf}", file=sys.stderr)
        return 1
    if args.pdf.suffix.lower() != ".pdf":
        print(f"这个示例只处理 PDF: {args.pdf}", file=sys.stderr)
        return 1

    formats = [item.strip() for item in args.formats.split(",") if item.strip()]
    out_dir = args.out or Path.cwd() / f"{args.pdf.stem}_{args.mode}"
    client = Client(os.environ.get("MINERU_API_URL", DEFAULT_BASE_URL), load_api_key())
    if not client.api_key:
        print("提示: 未找到 API key,将按匿名请求发送", file=sys.stderr)

    print(f"服务 {client.base_url} | 文件 {args.pdf} | tier={args.tier} ocr_mode={args.ocr_mode} formats={formats}")
    if args.mode == "uploads":
        example_uploads_then_jobs(client, args.pdf, out_dir, tier=args.tier, ocr_mode=args.ocr_mode, formats=formats)
    elif args.mode == "tasks":
        example_tasks(client, args.pdf, out_dir, tier=args.tier, ocr_mode=args.ocr_mode, formats=formats)
    else:
        example_file_parse(
            client,
            args.pdf,
            out_dir,
            tier=args.tier,
            ocr_mode=args.ocr_mode,
            formats=formats,
            wait_timeout=args.wait_timeout,
        )
    print(f"完成,产物目录: {out_dir}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *

தீவிர சூறாவளி புயல் 'முரசு' சென்னையில் நாளை பள்ளிகளுக்கு விடுமுறை 'முரசு' புயல் குறித்த தகவல்கள் சென்னையில் நாளை பள்ளிகளுக்கு விடுமுறையா? வானிலை சென்னையில் நாளை விடுமுறையா? 'முரசு' புயல் வானிலை சென்னையில் புயல் 'முரசு' புயல் கண்காணிப்பு சென்னையின் வானிலை தெலுங்கானா சென்னை வானிலை புயல் கண்காணிப்பு செங்கல்பட்டில் இன்று பள்ளிகளுக்கு விடுமுறை சென்னையில் பள்ளிகளுக்கு விடுமுறை செங்கல்பட்டில் பள்ளிகளுக்கு விடுமுறை விஜயவாடா வானிலை வானிலை அறிக்கை 'முரசு' புயல் கண்காணிப்பு இன்றைய வானிலை அறிக்கை சென்னையில் நாளை பள்ளிகளுக்கு விடுமுறை சென்னை வானிலை சென்னையில் இன்று பள்ளிகளுக்கு விடுமுறையா? இன்றைய சென்னை வானிலை விமான சேவைகள் தமிழ் பக்தாகோர் (Pakhtakor) vs அல்-நாசர் (Al-Nassr) பக்தாகோர் எஃப்சி vs அல்-நாசர் எஃப்சி தரவரிசை ஏஎஃப்சி (AFC) சாம்பியன்ஸ் லீக் பக்தாகோர் எஃப்சி vs அல்-நாசர் எஃப்சி அணிகளின் விவரம் ஜோவா ஃபெலிக்ஸ் (João Félix) அல்-நாசர் எஃப்சி பக்தாகோர் எஃப்சி நியூ இங்கிலாந்து (New England) vs இன்டர் மியாமி (Inter Miami) நியூ இங்கிலாந்து ரெவல்யூஷன் vs இன்டர் மியாமி தரவரிசை எம்எல்எஸ் (MLS) இன்டர் மியாமி லியோனல் மெஸ்ஸி இன்டர் மியாமி சிஎஃப் இன்டர் மியாமி vs நியூ இங்கிலாந்து நியூ இங்கிலாந்து ரெவல்யூஷன் vs இன்டர் மியாமி அணிகளின் விவரம் மெஸ்ஸியின் மொத்த கோல்கள் நியூ இங்கிலாந்து ரெவல்யூஷன் vs இன்டர் மியாமி போட்டி நிகழ்வுகள் இன்டர் மியாமி போட்டிகள் நியூ இங்கிலாந்து ரெவல்யூஷன் நியூ இங்கிலாந்து ரெவல்யூஷன் vs இன்டர் மியாமி ஓமன் vs நெதர்லாந்து ஓமன் தேசிய கிரிக்கெட் அணி vs நெதர்லாந்து தேசிய கிரிக்கெட் அணி தரவரிசை ஓமன் vs நெதர்லாந்து ஓமன் தேசிய கிரிக்கெட் அணி vs நெதர்லாந்து தேசிய கிரிக்கெட் அணி போட்டி ஸ்கோர்கார்டு ஐசிசி (ICC) சிடபிள்யூசி (CWC) லீக் 2 ஓமன் தேசிய கிரிக்கெட் அணி vs நெதர்லாந்து தேசிய கிரிக்கெட் அணி தரவரிசை ஓமன் தேசிய கிரிக்கெட் அணி vs நெதர்லாந்து தேசிய கிரிக்கெட் அணி போட்டி ஸ்கோர்கார்டு நவம்பர் 2 - தங்கம் மற்றும் வெள்ளி விலை நிலவரம் வெள்ளி மற்றும் தங்கத்தின் விலைகள் தங்கம் குறித்த செய்திகள் இன்றைய தங்க விலை பெங்களூருவில் இன்றைய தங்க விலை ஹைதராபாத்தில் இன்றைய தங்க விலை கொல்கத்தாவில் இன்றைய தங்க விலை சென்னையில் இன்றைய தங்க விலை இன்றைய தங்கம் மற்றும் வெள்ளி விலை பெங்களூருவில் இன்றைய தங்க விலை சென்னையில் இன்றைய தங்க விலை இன்றைய தங்க விலை தனிஷ்க் (Tanishq) தங்க விலை வெள்ளி - எம்சிஎக்ஸ் (MCX) நேரலை விலை பெங்களூருவில் இன்றைய வெள்ளி விலை கோயம்புத்தூரில் இன்றைய தங்க விலை இன்றைய தங்கம் விலை தங்கத்தின் விலைகள் சென்னையில் இன்றைய தங்க விலை இன்றைய தங்க விலை இன்றைய வெள்ளி விலை MCX தங்கம் MCX தங்க விலை விலைமதிப்பற்ற உலோகம் மும்பையில் இன்றைய தங்க விலை ஹைதராபாத்தில் இன்றைய தங்க விலை டெல்லியில் இன்றைய தங்க விலை ஹைதராபாத்தில் இன்றைய தங்க விலை MCX தங்க விலை சென்னையில் தங்க விலை பெங்களூருவில் இன்றைய தங்க விலை MCX வெள்ளி விலை MCX மலபார் தங்க விலை இன்றைய MCX தங்க விலை இன்றைய 22 காரட் தங்க விலை இன்றைய 22K தங்க விலை நேரலை தங்க விலை இன்றைய 18 காரட் தங்க விலை கிமி அன்டோனெல்லி கிமி F1 தரவரிசை F1 F1-ன் மிக இளம் சாம்பியன் கிமி அன்டோனெல்லி ஃபார்முலா 1 F1 ஓட்டுநர் தரவரிசை F1 பந்தயம் F1 நேரலை F1 மெக்சிகோ கிராண்ட் பிரிக்ஸ் F1 2026 மேக்ஸ் வெர்ஸ்டாப்பன் F1 முடிவுகள் மெக்சிகோ கிராண்ட் பிரிக்ஸ் F1 மெக்சிகோ GP ரிலையன்ஸ் பங்கு விலை ரிலையன்ஸ் பங்கு ரிலையன்ஸ் RIL பங்கு விலை ரிலையன்ஸ் இண்டஸ்ட்ரீஸ் பங்கு விலை RIL பங்கு RIL பங்கு விலை உயர்வு குறித்த பகுப்பாய்வு ரிலையன்ஸ் இண்டஸ்ட்ரீஸ் பங்கு அனுஜ் தாக்கூர் நடிகர் அனுஜ் தாக்கூர் வலிப்பு (seizure) தூக்கம் விமானம் விபத்து புளோரிடா விமான விபத்து லியர்ஜெட் (Learjet) லியர்ஜெட் 60 வீடியோக்கள் புளோரிடா ஆஸ்டின் விபத்து இன்றைய செய்திகள் ரிமி டோமி லிபின் மேத்யூ - ரிமி டோமி ரிமி டோமி திருமணம் திருமணம் லிபின் மேத்யூ ரிமி டோமி டேலைட் சேவிங்ஸ் (Daylight Savings) 2026 டேலைட் சேவிங்ஸ் அமெரிக்காவில் டேலைட் சேவிங்ஸ் 2026 அமெரிக்காவில் டேலைட் சேவிங்ஸ் 2026 டேலைட் சேவிங்ஸ் அமெரிக்காவில் டேலைட் சேவிங்ஸ் 2026 ஷாருக்கான் பிறந்தநாள் ஷாருக்கான் ஷாருக்கான் பிறந்தநாள் கிங் (King) SRK பிறந்த தேதி சித்தார்த் ஆனந்த் SRK வயது ஷாருக் இந்தித் திரைப்படம் கேரள லாட்டரி முடிவுகள் கேரள லாட்டரி முடிவு இன்றைய கேரள லாட்டரி முடிவு இன்றைய பாக்யதாரா லாட்டரி முடிவு இன்றைய லாட்டரி முடிவு இன்றைய கேரள லாட்டரி முடிவு (நேரலை) இன்றைய கேரள லாட்டரி முடிவு இன்றைய கேரள லாட்டரி முடிவு (மதியம் 3 மணி) லாட்டரி இன்றைய முடிவு கேரள லாட்டரி முடிவு - இன்று பிற்பகல் 3 மணி (நேரலை) கேரள லாட்டரி முடிவு - நேற்று サイクロン「ムラス(Murasu)」 チェンナイの学校、明日は休校か サイクロン「ムラス」最新情報 チェンナイの学校は明日休みか? 天気 チェンナイは明日休みか? サイクロン「ムラス」の気象情報 チェンナイのサイクロン サイクロン「ムラス」追跡 チェンナイの天気 テランガーナ州 チェンナイの天気 サイクロン追跡 チェンガルパットゥの学校は今日休校か チェンナイの学校休校情報 チェンガルパットゥの学校休校情報 ビジャヤワーダの天気 天気予報 サイクロン「ムラス」追跡 今日の天気予報 チェンナイの学校、明日は休校 チェンナイの天気 チェンナイの学校は今日休みか? 今日のチェンナイの天気 フライト情報 タミル語 パフタコール対アル・ナスル パフタコールFC対アル・ナスル:順位表 AFCチャンピオンズリーグ パフタコールFC対アル・ナスル:出場メンバー ジョアン・フェリックス アル・ナスルFC パフタコールFC ニューイングランド対インテル・マイアミ ニューイングランド・レボリューション対インテル・マイアミ:順位表 MLS(メジャーリーグサッカー) インテル・マイアミ リオネル・メッシ インテル・マイアミCF インテル・マイアミ対ニューイングランド ニューイングランド・レボリューション対インテル・マイアミ:出場メンバー メッシの通算ゴール数 ニューイングランド・レボリューション対インテル・マイアミ:試合経過 インテル・マイアミの試合 ニューイングランド・レボリューション ニューイングランド・レボリューション対インテル・マイアミ オマーン対オランダ オマーン代表クリケットチーム対オランダ代表クリケットチーム:順位表 オマーン対オランダ オマーン代表クリケットチーム対オランダ代表クリケットチーム:試合スコアカード ICCクリケット・ワールドカップ・リーグ2 オマーン代表クリケットチーム対オランダ代表クリケットチーム:順位 オマーン代表クリケットチーム対オランダ代表クリケットチーム:試合スコアカード 11月2日の金・銀価格 銀・金価格 金に関するニュース 今日の金価格 バンガロールの今日の金価格 ハイデラバードの今日の金価格 コルカタの今日の金価格 チェンナイの今日の金価格 今日の金・銀価格 バンガロールの今日の金価格 チェンナイの今日の金価格 今日の金価格 タニシュク(Tanishq)の金価格 銀のMCX(インド商品取引所)ライブ価格 バンガロールの今日の銀価格 コインバトールの今日の金価格 今日の金価格価格 金価格 チェンナイの今日の金価格 今日の金価格 今日の銀価格 MCX(インド商品取引所)金価格 MCX金価格 貴金属 ムンバイの今日の金価格 ハイデラバードの今日の金価格 デリーの今日の金価格 ハイデラバードの今日の金価格 MCX金価格 チェンナイの金価格 バンガロールの今日の金価格 MCX銀価格 MCX マラバール・ゴールド(Malabar Gold)の金価格 今日のMCX金価格 今日の22金(22カラット)価格 今日の22金価格 金価格(リアルタイム) 今日の18金(18カラット)価格 キミ・アントネッリ キミ F1順位表 F1 キミ・アントネッリ(最年少F1チャンピオン候補) フォーミュラ1 F1ドライバー順位表 F1レース F1ライブ F1メキシコグランプリ F1 2026年シーズン マックス・フェルスタッペン F1結果 メキシコグランプリ F1メキシコGP リライアンス(Reliance)の株価 リライアンス株 リライアンス RIL株価 リライアンス・インダストリーズの株価 RIL株 RIL株価急騰の分析 リライアンス・インダストリーズ株 アヌジ・タクール 俳優アヌジ・タクール 発作 睡眠 飛行機墜落事故 フロリダでの飛行機墜落事故 リアジェット リアジェット60 動画 フロリダ オースティンでの事故 今日のニュース リミ・トミー リビン・マシュー、リミ・トミー リミ・トミーの結婚 結婚 リビン・マシュー リミ・トミー 2026年のサマータイム(デイライト・セービング) サマータイム 2026年米国のサマータイム 2026年米国サマータイム サマータイム 2026年米国サマータイム シャー・ルク・カーンの誕生日 シャー・ルク・カーン シャー・ルク・カーンの誕生日 キング SRK(シャー・ルク・カーン)の誕生日 シッダールト・アーナンド SRKの年齢 シャー・ルク ヒンディー語映画 ケーララ州宝くじの結果 ケーララ州宝くじ結果 今日のケーララ州宝くじ結果 今日の「バギャターラ(Bhagyathara)」宝くじ結果 今日の宝くじ結果 今日のケーララ州宝くじ結果(ライブ) 今日のケーララ州宝くじ結果 今日のケーララ州宝くじ結果(午後3時) 宝くじ本日の結果 ケーララ宝くじ 本日の結果(午後3時ライブ) ケーララ宝くじ 昨日の結果 তীব্র ঘূর্ণিঝড় 'মুরাসু' চেন্নাইতে আগামীকাল স্কুল ছুটি ঘূর্ণিঝড় 'মুরাসু' সংক্রান্ত আপডেট চেন্নাইতে আগামীকাল স্কুল ছুটি কি না আবহাওয়া চেন্নাইতে কি আগামীকাল ছুটি? ঘূর্ণিঝড় 'মুরাসু' ও আবহাওয়া চেন্নাইতে ঘূর্ণিঝড় ঘূর্ণিঝড় 'মুরাসু' ট্র্যাকার চেন্নাইয়ের আবহাওয়া তেলেঙ্গানা চেন্নাইয়ের আবহাওয়া ঘূর্ণিঝড় ট্র্যাকার চেঙ্গলপাট্টুতে আজ স্কুল ছুটি চেন্নাইতে স্কুল ছুটি চেঙ্গলপাট্টুতে স্কুল ছুটি বিজয়ওয়াড়ার আবহাওয়া আবহাওয়া প্রতিবেদন ঘূর্ণিঝড় 'মুরাসু' ট্র্যাকার আজকের আবহাওয়া প্রতিবেদন চেন্নাইতে আগামীকাল স্কুল ছুটি চেন্নাইয়ের আবহাওয়া চেন্নাইতে আজ স্কুল ছুটি কি না আজকের চেন্নাইয়ের আবহাওয়া বিমান চলাচল তামিল পাখতাকোর বনাম আল-নাসর পাখতাকোর এফসি বনাম আল-নাসর পয়েন্ট টেবিল এএফসি চ্যাম্পিয়ন্স লিগ পাখতাকোর এফসি বনাম আল-নাসর লাইনআপ জোয়াও ফেলিক্স আল-নাসর এফসি পাখতাকোর এফসি নিউ ইংল্যান্ড বনাম ইন্টার মায়ামি নিউ ইংল্যান্ড রেভোলিউশন বনাম ইন্টার মায়ামি পয়েন্ট টেবিল এমএলএস (MLS) ইন্টার মায়ামি লিওনেল মেসি ইন্টার মায়ামি সিএফ ইন্টার মায়ামি বনাম নিউ ইংল্যান্ড নিউ ইংল্যান্ড রেভোলিউশন বনাম ইন্টার মায়ামি লাইনআপ মেসির মোট গোল নিউ ইংল্যান্ড রেভোলিউশন বনাম ইন্টার মায়ামি টাইমলাইন ইন্টার মায়ামির ম্যাচসমূহ নিউ ইংল্যান্ড রেভোলিউশন নিউ ইংল্যান্ড রেভোলিউশন বনাম ইন্টার মায়ামি ওমান বনাম নেদারল্যান্ডস ওমান জাতীয় ক্রিকেট দল বনাম নেদারল্যান্ডস জাতীয় ক্রিকেট দল পয়েন্ট টেবিল ওমান বনাম নেদারল্যান্ডস ওমান জাতীয় ক্রিকেট দল বনাম নেদারল্যান্ডস জাতীয় ক্রিকেট দল ম্যাচ স্কোরকার্ড আইসিসি সিডব্লিউসি (CWC) লিগ ২ ওমান জাতীয় ক্রিকেট দল বনাম নেদারল্যান্ডস ক্রিকেট দল র‍্যাঙ্কিং ওমান জাতীয় ক্রিকেট দল বনাম নেদারল্যান্ডস ক্রিকেট দল ম্যাচ স্কোরকার্ড ২রা নভেম্বর সোনা ও রুপার দর সোনা ও রুপার দাম সোনা বিষয়ক খবর আজকের সোনার দর ব্যাঙ্গালোরে আজকের সোনার দর হায়দ্রাবাদে আজকের সোনার দর কলকাতায় আজকের সোনার দর চেন্নাইতে আজকের সোনার দর আজ সোনা ও রুপার দর ব্যাঙ্গালোরে আজকের সোনার দর চেন্নাইতে আজকের সোনার দর আজকের সোনার দর