現役プログラマのWordPressカスタマイズ相談

WordPress(ワードプレス)のお悩み、うまくいかなくてお困りなこと、不具合調査、新規制作依頼まで、ウェブアプリケーションエンジニアがあなたをサポートします。

今頃だけどphpでmixi Graph APIのDiary APIを使い日記投稿

PHPWordPress)を使ってmixiの日記を内容を投稿できないか」
という問い合わせがあり、調査したのでせっかくなので記事にまとめました。


PHP mixi API」などで検索しても情報が古く、
APIの仕様が変更後の記事は極端に少なかったので
自分でリファレンスを読んでいくしかなかったです。

f:id:jsaz:20170218134152p:plain
(正直、需要がないから書かれていないことは気づいています。。。笑)

mixi Partner Dashboardにてアカウント登録

公式サイトの手順通りにアプリの登録申請を行います。

そこでクレデンシャル情報(Consumer KeyとConsumer Secret)を取得します。
この2つの値はAPI連携のプログラムに必須となる情報です。

developer.mixi.co.jp

※現在、mixi Graph APIは認定パートナー(法人)とクレジットカード登録済の個人パートナーが利用できます。


クレジットカードの登録が必要でした。
お金がかかるわけではなく、実在確認や本人認証みたいなものですね。

アクセストークンを取得する

developer.mixi.co.jp


mixiとの連携アプリケーションを使ってもらう上で一番最初にすることは、
各ユーザーにアプリの利用同意をさせる必要があります。

そのためのURLを作ります。

scopeは日記の投稿なので w_diary を指定します。
stateは適当で良いです。

https://mixi.jp/connect_authorize.pl?client_id=[Consumer Key]&response_type=code&scope=w_diary%20r_diary&state=2017

このURLにアクセスすると下記のようなページに飛びます。

~は以下のアクションの許可を要求しています。
ご確認のうえ、問題なければ同意ボタンを押してください。

日記
自分と友人の日記・イイネ・コメントを取得します。
自分の日記・イイネ・コメントを投稿・削除します。

アプリ利用時にこのような画面が表示され、ユーザーに同意を求めます。
日記への投稿に関してのアクション許可のメッセージが表示されていますね。


同意するとURLにcodeが含まれた状態で自分のアプリ画面に戻ります。

http://[アプリケーションURL]/?state=2017&code=ed7aab8e63737794197ef46d35cXXXXXXXX


このcodeが各APIを利用するときに必要となってきます。

リフレッシュトークン、アクセストークンの入手


curlでしか検証していませんので、PHPで組みなおす必要はあります。

リフレッシュトークンを取得するためのcurlコマンド
curl -F grant_type=authorization_code -F client_id=[Consumer Key] -F client_secret=[Consumer Secret] -F redirect_uri=[アプリケーションURL] -F code=ed7aab8e63737794197ef46d35cXXXXXXXX https://secure.mixi-platform.com/2/token

{"refresh_token":"b0db3bf84baf1af90aed246f86263XXXXXXXX","expires_in":900,"access_token":"8e0c31fc9e0e89f63c7a538c07cf7772XXXXXXXX","token_type":"Bearer","scope":"r_diary w_diary"}

ここで取得したrefresh_tokenを使いアクセストークンを取得します。


アクセストークンを取得するためのcurlコマンド
curl -F grant_type=refresh_token -F client_id=[Consumer Key] -F client_secret=[Consumer Secret] -F refresh_token=b0db3bf84baf1af90aed246f86263XXXXXXXX https://secure.mixi-platform.com/2/token

{"refresh_token":"b0db3bf84baf1af90aed246f86263XXXXXXXX","expires_in":900,"access_token":"ebb44d7facb16e52c9261de0afb97XXXXXXXX","token_type":"Bearer","scope":"r_diary w_diary"}j


コマンドをたたけば、アクセストークンが更新されて返ってきます。
900秒なので有効期間は15分です。


PHPなどのシステムに組み込む場合は、有効期限とトークンをDBに保存しAPI連携時に期限をみて更新(有効であれば飛ばす)というイメージになるかと思います。


PHPにてDiary APIでの日記投稿

developer.mixi.co.jp
アクセストークンさえ取得できればプログラムは簡単です。
サンプルコードはコピペしてつなげてもらえれば使えるはずです。

まずは投稿データを作成

privacyの引数はmixiの技術仕様をご覧ください。

<?php
$post_data = array(
	'title' => $title,
	'body' => $body,
	'privacy' => array(
		'visibility' => "friends",
		'show_users' => "0",
	),
);
エンドポイントを指定し、ヘッダー情報にトークンをセット

トークンはこのような形です。
Authorization: Bearer ebb44d7facb16e52c9261de0afb97XXXXXXXX

<?php
//エンドポイント
$url = 'https://api.mixi-platform.com/2/diary/articles/@me/@self';

//ヘッダーにトークンを入れる
$headers = array(
	'Host:api.mixi-platform.com',
	'Content-Type: application/json',
	'Authorization: Bearer ' . $code,
);
必要な情報をjson変換しセット

今回は記事のみの投稿(画像はなし)なのでシンプルにcontentに投稿データをjson変換してセットします。

<?php
//パラメータ
$options = array(
	'http' => array(
		'method' => 'POST',
		'content' => json_encode($data),
		'header' => implode("\r\n", $headers),
		'ignore_errors'=>true,
	)
);
file_get_contentsでAPI実行

本当はtry-catchなどを実装する必要がありますが、
ひとまずテスト的に@(エラー制御演算子)を使いました。

結果をdumpして出力しています。

<?php
$respons = @file_get_contents($url, false, stream_context_create($options));

//結果を表示
echo "<hr><pre>";
var_dump($respons);
echo "</pre>";


投稿に成功した場合、新しく作成された日記のIDが返ってきます。





アクセストークンの更新さえ上手くプログラムできれば、API実行部分はパラメータをセットして送信するだけの簡単な処理です。
調査には時間がかかりましたが、サンプルコード作成は20分程でできました。

mixi連携をお考えのかたはぜひ参考にしてください。
開発のご相談も承っております。