荷物の配送状況を確認する(荷物追跡APIの使用)

Exmentで作成しているシステムの中で、注文した荷物の配送状況を知りたい場面があり一個ずつリンクを作成して状況を確認していたのですが、もっと簡単にできないかなっと思っていました。

以前は日本郵便とかAPIが公開されていたと思うのですが、現在は使用できません。ローカルアプリでスクレイピングを行えばできると思うのですが、それは大変だなって思っていました。

AIに相談すると海外のサイトで荷物追跡できるところがあると言われたのですが、国内便ばかりなのでそちらを使うのはな~って思って、ふと検索するとこちらのサイトが見つかりました。

こちらは、荷物追跡APIを提供しているサイトで、利用規約が2026年7月になっているので、つい最近公開されたと思われます。

サイトによると、現在は月3000件で1か月無料で使用することができるみたいです。紹介ページを作成して認証されればその後も使い続けることができるみたいです
こちらは、まだ申請していないので、承認されるかは不明ですが、申請してみるつもりです。

2026年8月現在は、ヤマト運輸・佐川急便・日本郵便・西濃運輸・福山通運・日本通運・名鉄運輸・トナミ運輸・第一貨物・西日本鉄道・久留米運送の11社に対応しているみたいです。

お試しは、こちらのサイトで試すことができます。

コマンドラインで処理することもできそうです。試しにPowerShellで作成したコードを載せておきます。
こちらはPowerShellのコードですので、任意の名前.ps1で文字コードUTF-8で保存していただき実行してもらうと追跡結果が表示されます。

# ==========================================
# 1. 設定項目
# ==========================================
$API_KEY    = "ご自身のAPI Key"
$SECRET_KEY = "ご自身の秘密Key"

$API_URL    = "https://api.trackingapi.jp/v1/tracking/trace"

while ($true) {
    Clear-Host
    Write-Host "==========================================" -ForegroundColor Cyan
    Write-Host "           荷物追跡ツール (API)            " -ForegroundColor Cyan
    Write-Host "==========================================" -ForegroundColor Cyan
    Write-Host ""
    Write-Host "  1. ヤマト運輸 (yamato)"
    Write-Host "  2. 佐川急便 (sagawa)"
    Write-Host "  3. 日本郵便 (post)"
    Write-Host "  4. 終了"
    Write-Host ""

    $choice = Read-Host "配送会社の番号を選択してください [1-4]"
    if ($choice -eq "4" -or [string]::IsNullOrEmpty($choice)) { break }

    $courier = ""
    $c_name  = ""
    if ($choice -eq "1") { $courier = "yamato"; $c_name = "ヤマト運輸" }
    if ($choice -eq "2") { $courier = "sagawa"; $c_name = "佐川急便" }
    if ($choice -eq "3") { $courier = "post";   $c_name = "日本郵便" }

    if ([string]::IsNullOrEmpty($courier)) {
        Write-Host "無効な番号です。Enterキーを押してやり直してください..." -ForegroundColor Red
        [void][Console]::ReadLine()
        continue
    }

    Write-Host ""
    Write-Host "[$c_name]" -ForegroundColor Yellow
    $track_num = Read-Host "追跡番号(お問い合わせ番号)を入力してください"
    if ([string]::IsNullOrEmpty($track_num)) { continue }

    # スペースを自動削除
    $track_num = $track_num -replace "\s+", ""

    Write-Host ""
    Write-Host "APIから配送状況を取得中..." -ForegroundColor DarkGray

    $authString = "Bearer " + $API_KEY + ":" + $SECRET_KEY

    $headers = @{
        "Authorization" = $authString
        "Content-Type"  = "application/json"
    }
    $bodyObj = @{ items = @(@{ courierCode = $courier; trackingNumber = $track_num }) }
    $bodyJson = $bodyObj | ConvertTo-Json -Compress

    Write-Host "------------------------------------------"
    try {
        # API送信(JSON形式で受け取るため、Invoke-WebRequestを使用)
        $response = Invoke-WebRequest -Method Post -Uri $API_URL -Headers $headers -Body $bodyJson -ContentType "application/json" -TimeoutSec 10 -ErrorAction Stop
        
        # 取得した文字列をJSONに変換
        $res = ConvertFrom-Json $response.Content

        if ($res.isSuccess) {
            $results = @($res.data.results)
            $result = $results[0]

            if ($result.success) {
                Write-Host "【追跡結果】 成功" -ForegroundColor Green
                Write-Host "【配送会社】 $($result.data.carrierName)"
                Write-Host "【配送状況】 $($result.data.deliveryStatusText) ($($result.data.deliveryStatus))"
            } else {
                Write-Host "【追跡結果】 エラー" -ForegroundColor Red
                Write-Host "【エラーコード】 $($result.error.code)"
                
                $reason = switch ($result.error.code) {
                    "INVALID_TRACKING_NUMBER" { "追跡番号の形式が不正です。桁数などをご確認ください。" }
                    "NOT_FOUND"               { "該当する配送情報が見つかりません。番号がまだ未登録か、誤りの可能性があります。" }
                    "UNSUPPORTED_COURIER"     { "非対応の配送会社コードが指定されました。" }
                    "COURIER_PREPARING"       { "指定された配送会社は現在「準備中」です。" }
                    "TRACKING_FAILED"         { "一時的なエラーです。時間をおいて再試行してください。" }
                    Default                   { "原因不明のエラーが発生しました。" }
                }
                Write-Host "【エラー理由】 $reason"
            }
        } else {
            Write-Host "【追跡結果】 APIの処理に失敗しました (isSuccess が false です)" -ForegroundColor Red
        }
    } catch {
        # エラーが起きた場合は、生データをダンプして原因を見やすくする
        Write-Host "【追跡結果】 通信に失敗したか、エラーが返ってきました。" -ForegroundColor Red
        if ($_.Exception.Response) {
            $reader = New-Object System.IO.StreamReader($_.Exception.Response.GetResponseStream())
            $errBody = $reader.ReadToEnd()
            Write-Host "【詳細ログ】 $errBody" -ForegroundColor DarkRed
        } else {
            Write-Host "【詳細ログ】 $_" -ForegroundColor DarkRed
        }
    }
    Write-Host "------------------------------------------"
    Write-Host ""
    Write-Host "Enterキーを押すとメニューに戻ります..."
    [void][Console]::ReadLine()
}

もし、コードに不具合があれば、お知らせいただけたらと思います。

Exmentのプラグインについてはまた別記事で書こうと思います。

(まだ評価がありません)

PC

Posted by ぷぷり