Nifty Cloud Mobile BackendのREST APIをPythonから利用する

monacaとNifty Cloud Mobile Backendを用いて、プッシュ通知を送信する作業を行なっていました。

バックエンドはPythonで書いていたので、PythonからのREST APIの利用法をメモしておきたいと思います。

署名(signature)を作るのがちょっと大変ですね。。

# -*- coding:utf-8 -*-

import hmac
import hashlib
import base64
from datetime import datetime
import requests
import json

fqdn = "mb.api.cloud.nifty.com"
sig_method = "HmacSHA256"
sig_ver = "2"
app_key = "XXXXX"
client_key = b"XXXXX"


def encode_signature(secret, message):
    signature = hmac.new(secret, message, hashlib.sha256).digest()
    decoded = base64.b64encode(signature)
    return decoded


def gen_signature(method, api_path, timestamp):
    keys = "&".join([
        "SignatureMethod=" + sig_method,
        "SignatureVersion=" + sig_ver,
        "X-NCMB-Application-Key=" + app_key,
        "X-NCMB-Timestamp=" + timestamp
    ])
    message = "\n".join([
        method,
        fqdn,
        api_path,
        keys
    ]).encode()
    signature = encode_signature(client_key, message)
    return signature


def send_request(method, api_path, params):
    timestamp = datetime.utcnow().isoformat()[:-3]
    signature = gen_signature(method, api_path, timestamp)
    headers = {
        "X-NCMB-Application-Key": app_key,
        "X-NCMB-Signature": signature,
        "X-NCMB-Timestamp": timestamp,
        "Content-Type": "application/json"
    }
    if method == "POST":
        res = requests.post(
            "https://{0}{1}".format(fqdn, api_path),
            headers=headers,
            data=json.dumps(params)
        )
        print(res.text)


def test_push():
    method = "POST"
    api_path = "/2013-09-01/push"
    params = {
        "immediateDeliveryFlag": True,
        "target": ["android", "ios"],
        "message": "Test Message!",
        "deliveryExpirationTime": "3 day",
        "badgeIncrementFlag": True
    }
    send_request(method, api_path, params)


if __name__ == "__main__":
    test_push()

コードを見直して気付きましたが、timestampの最後にタイムゾーンを表す”Z”をつけなくても動くようですね。

一応動くと思いますが、動かなかったらすみません(^_^;

あと今回はpush通知しか使わなかったので、GETのAPIは書いていません。

そのうち必要になったら追記します。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする