【mastodon】最短でAPIをPHPから使ってみる

前回の記事で紹介した環境を元に、APIを叩いてみました。

 

 

 

 

 

・管理人はサーバーに詳しくありません。

・APIで投稿(通常の投稿、リプライ)、フォロー、ブースト(リツイート)、お気に入りのやり方を紹介します。

・現状、他インスタンスからのリモートフォローが失敗しますが、原因が不明なのでこの記事では紹介していません。

※APIの使い方までを紹介するだけです。

 

 

 

■mastodonのインスタンスを建てる

 

~省略(前回の記事参照)~

 

 

■mastodonでユーザーアカウント作成

 

~省略~

 

送信サーバーの設定に間違いがなく、メールがちゃんと届くならすぐに終わるはず。

 

 

■ユーザーアカウントの権限を管理者に昇格

※5/13追記

 

作成したユーザーを一応管理者にしておきます。

以下のコマンドを実行。

 

docker-compose run –rm web rails mastodon:make_admin USERNAME=<ユーザー名>

<ユーザー名> …… @○○ は要らない。

どこの記事を参考にしたか忘れてしまったので、本当にこれでできたか怪しい……。

 

 

■OAuth2クライアント登録・アクセストークン取得

 

コマンド操作はConoHaのコンパネのコンソールからでもできますが、結果をコピペできないのでTeratermなどのSSHツールを使うのが無難です。

 

curl -X POST -sS https://<ドメイン名>:3000/api/v1/apps \
-F “client_name=<クライアント名>” \
-F “redirect_uris=urn:ietf:wg:oauth:2.0:oob” \
-F “scopes=read write follow”

上記のコマンドを実行。

<ドメイン名> …… 各自用意したドメイン名 SSLではない場合は http に

<クライアント名> …… 適当に何でも

 

{
“id”: 1,
“redirect_uri”: “urn:ietf:wg:oauth:2.0:oob”,
“client_id”: “****************************************************”,
“client_secret”: “”****************************************************”,”
}

上記のようなjsonが返ってくるので、client_id と client_secret をメモする。

 

curl -X POST -sS https://<ドメイン名>:3000/oauth/token \
-d “scope=write read follow&client_id=<client_id>&client_secret=<client_secret>&grant_type=password&username=<メールアドレス>&password=<パスワード>”

上記のコマンドを実行。

<ドメイン名> …… さっきと同じ

<client_id><client_secret> …… メモしたやつ

<メールアドレス><パスワード> …… mastodonアカウント作成の際に入力したやつ

 

{
“access_token”: “******************************”,
“token_type”: “bearer”,
“scope”: “write read follow”,
“created_at”: xxxxxxxxxx
}

上記のようなjsonが返ってくる。

access_token だけ必要なのでメモ。さっきメモしたのはもう要らない。

 

 

■APIを叩いてみる

 

参考ページ

 

自分が調べた感じではフリーのライブラリを使えとか書いてあったけど、そんなもの無くても叩けたので、完全独自です。これがベストなのかは分かりません。

また、環境によってはphpのエラーが出るかもしれません。

 

function send_mstdn($method, $edp, $params = array()) {

$url = ‘http://<ドメイン名>:3000/api/v1/’ . $edp;
$headers = array(
‘Content-Type: application/x-www-form-urlencoded’,
‘Host: <ドメイン名>’,
‘User-Agent: <ユーザーエージェント>’,
‘Authorization: Bearer <アクセストークン>’,
);
$options = array(‘http’ => array(
‘method’=>$method,
‘content’=>http_build_query($params),
‘header’=>implode(“\r\n”, $headers),
));
$json = file_get_contents($url, false, stream_context_create($options));
return mb_convert_encoding($json, ‘UTF8’, ‘ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN’);

}

適当なphpファイルを作り、上記の関数を追加。

<ドメイン名> …… さっきと同じ

<ユーザーエージェント> …… 適当に何でも

<アクセストークン> …… さっきメモしたやつ

 

 

▼タイムラインを取得する

 

$result = send_mstdn(‘GET’, ‘timelines/home’);

 

 

▼通常投稿する

 

$result = send_mstdn(‘POST’, ‘statuses’, array(‘status’=>’<投稿内容>’));

投稿内容に呟きたい内容をいれる。

 

 

▼リプライ投稿する

 

メンションだけを取得するエンドポイントがなさそうなので、一旦通知一覧を取得し、種別がメンションになっているものだけを抽出します。

 

$response = send_mstdn(‘GET’, ‘notifications’);
$response = json_decode($response, true);
$mentions = array();
foreach ($response as $key => $value) {
if ( $value[‘type’] == ‘mention’ ) $mentions[] = $value[‘status’];
}

$mentions; //この中にメンションの一覧が入ってる

 

 

▼フォローする

 

$result = send_mstdn(‘POST’, ‘follows’, array(‘uri’=>’<ユーザー名>’));

ユーザー名は 「ユーザーネーム@インスタンスドメイン」の形にする必要がある。

 

 

▼お気に入りする

 

$result = send_mstdn(‘POST’, ‘statuses/<投稿ID>/favourite’);

投稿IDは『タイムラインを取得する』等で取ってきた json データで見れます。

mastodonでは「いいね」ではなく「お気に入り」らしい。

 

 

▼リブート(リツイート)する

 

$result = send_mstdn(‘POST’, ‘statuses/<投稿ID>/reblog’);

お気に入りとほぼ同じ。

リブートはAPI上では「reblog」と表記されている。

 

 

■その他注意

 

・タイムラインの取得等で取ってきたトゥートの内容はすべてhtmlになっているため、botで自動返信とかしたい場合は、以下の処理でタグを取り除く必要がある(参考)。

$content = preg_replace(‘/<(“[^”]*”|\'[^\’]*\’|[^\'”>])*>/’, ”, $content);

 

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください