T2thesouthernlight
@T2thesouthernlight

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【質問】FedEx API で追跡情報の取得

解決したいこと

現在、Pythonを使用してFedExのWeb APIであるTrack APIのTrack by Tracking Numberの追跡情報を取得する実装を行っているところですが、色々と調べてベアラートークンまでは取得ができましたが、その後は欲しい情報のResponseがうまく取得できずとして返ってきます。下記のFedEx開発者ポータルサイトのTrack APIのドキュメントを参照して、コードを書いたのですがうまく取得ができませんでした。

Pythonのスキルとしてはまだ学び始めて1年程度で、APIについては2週間くらい前からいろいろと調べて実装を試みておりましたが、OAuth2.0やJson等の知識も不足しているという点は否めません。
また海外のサイトもいろいろと探してみましたが解決策が見つからずといった状態です。アドバイスを頂けないでしょうか。

発生している問題・エラー

{'errors': [{'code': 'BAD.REQUEST.ERROR',
             'message': 'The given JWT is invalid. Please modify your request '
                        'and try again.'}],
 'transactionId': 'cb91a977-d5dc-4a46-818a-9f2320d1179b'}

エラーコードは400になります。

<Response [400]>

該当するソースコード

尚、client_idとclient_secret、trackingNumberの値はダミーを記載させていただいております。

import requests
import json

headers = { "Content-Type" : "application/x-www-form-urlencoded" }

data = {
    "grant_type": "client_credentials",
    "client_id": "XXXXXXXXXXXXXXXXXX",
    "client_secret": "XXXXXXXXXXXXXXXXXX"
}

oauth_url = "https://apis.fedex.com/oauth/token"

r = requests.post(oauth_url, data=data, headers=headers)

bearer_token = r.json()["access_token"]

import pprint

url = "https://apis-sandbox.fedex.com/track/v1/trackingnumbers"

headers = {"content-type": "application/json",
   'X-locale': "en_US",
    "Authorization": "Bearer {}".format(bearer_token)}


payload = {"trackingInfo": [{"trackingNumberInfo": {"trackingNumber": "XXXXXXXXXXXXXXXXXX"}}],"includeDetailedScans": True}


response = requests.request('GET', url, data=payload, headers=headers)

data = json.loads(response.text)
pprint.pprint(data)

自分で試したこと

ドキュメント内には参照情報として下記2つのurlがあり、どちらも試してみましたが、前者はエラーコード400(上記で記載したエラー内容)で後者は405が返ってきました。405のメッセージは以下の通りです。

"https://apis-sandbox.fedex.com/track/v1/trackingnumbers"
https://apis.fedex.com/track/v1/trackingnumbers”

{'errors': [{'code': 'METHOD.NOT.ALLOWED.ERROR',
             'message': 'We received a requested method that is not supported. '
                        'Please modify your request and try again.'}],
 'transactionId': 'baa20dbe-70a6-46dd-952d-a6d931476cf4'}

urlを変えてみる以外にも追跡番号を変更してみたりしてみたのですが、追跡情報の取得ができませでした。
ウェブ上でもFedEx APIに関する情報が見つけることができませんでしたので、アドバイス頂けると有難いです。

0

3Answer

payloadを辞書ではなくJSON文字列で渡せばよいかなあ。(自信ないです)

data=json.dumps(payload)

参考:

1Like

Comments

  1. @yucatio様
    ありがとうございます。アドバイス頂いた通りのコードに置き換えところ、しっかりと情報が取得できました。Pythonの学習を始めてこんなに苦戦したことがなかったので、感動です!
    また、共有頂いたRequestsに関するドキュメントもひと通り拝見させて頂きましたが、今後かなりリファレンスになりそうな情報でした。

We received a requested method that is not supported.

こちらのエラーに関しては、メソッドがGETではなくてPOSTのようです。(マニュアルにPOSTと書いてありますよ)

0Like

@yucatioさん
ご回答ありがとうございます。
すいません、記載を忘れておりました。POSTでも試したのですがエラーコード405と以下のエラーメッセージが返ってきました。'Invalid field value in the inoput'という英文は入力された値が有効でないと認識しておりますが、どの部分をさしているのかまでは特定ができませんでした。

<Response [422]>
{'errors': [{'code': 'INVALID.INPUT.EXCEPTION',
             'message': 'Invalid field value in the input'}],
 'transactionId': '135995db-d91e-4fd2-92b2-5b4b2ab47bd1'}
0Like

Your answer might help someone💌