【画像編】Mastodon (マストドン) PHPで外部から画像付き投稿してみようかとテストをしてみました


最近話題の「Mastodon」(マストドン)で、前回の「Mastodon(マストドン) PHPで外部から投稿してみようかとテストをしてみました」に引き続き 外部から画像付きで投稿してみようとテストをしました。

今回も利用するのはこれです。

PHP Library for Mastodon REST API (GPL)
https://github.com/TheCodingCompany/MastodonOAuthPHP

【手順】
①画像をアップロード
⑦画像のIDをつけてトゥート
※環境は前回のものを使いますので まだの方はこちらの設定を行ってください。
 

画像をアップロード

まず画像をアップロードできるようにします。

画像をアップロード用の関数を追加

「Mastodon REST API」には Media upload用の関数が無かったので勝手に追加します。class Mastodon内に入れてください。

Mastodon.php

	/**
	 * Posting a new Media 仮
	 */
	public function PostMedia( $image_path=null ){

		if( $image_path ){

			// mime_type
			$mime_type = $this->mime_type_extension( $image_path );

			// CurlFile PHP5.5~
			$cfile = curl_file_create( $image_path, $mime_type, 'file' );

			// Posturl
			$url = $this->getApiURL() . "/api/v1/media";
			$headers = array(
				"Content-Type" => "multipart/form-data",
			);

			$post_field = array(
				'access_token'	=> $this->credentials["bearer"],
				'file'	=> $cfile,
			);

		        /* Curl settings */
		        $options = array(
				CURLOPT_SSL_VERIFYPEER => false,
				CURLOPT_HTTPHEADER => $headers,
				CURLOPT_URL => $url,
				CURLOPT_RETURNTRANSFER => true,
		   		CURLOPT_POST => true,
				CURLOPT_POSTFIELDS => $post_field,
		        );

		        $curlHandle = curl_init();
		        curl_setopt_array( $curlHandle, $options );
		        $response = curl_exec( $curlHandle );
		        curl_close( $curlHandle );

			$response = json_decode( $response, true );
			return $response;
		}
	}

	/**
	 * Get mime_type
	 */
	public function mime_type_extension( $image_path=null ){

		if( $image_path ){
			$size = @getimagesize( $image_path );
			switch( $size['mime'] ){
			    //jpeg
			    case IMAGETYPE_JPEG:
			        return "image/jpg";
			        break;
			    //png
			    case IMAGETYPE_PNG:
			        return "image/png";
			        break;
			    //gif
			    case IMAGETYPE_GIF:
			        return "image/gif";
			        break;
			}
		}
		return '';
	}

※テスト用なのでシンプルにしてます。

画像をアップロードテスト

では、画像をアップロードしてみます。
まず、アップロードする画像を mastodonフォルダ(index.phpがある階層)に置いてください。

以下のコードを index.php に張り付けてください。(前のコードは消してください)

<?php
require_once("autoload.php");
$t = new \theCodingCompany\Mastodon();

//image upload Test
$response = $t->PostMedia( __DIR__ . DIRECTORY_SEPARATOR . 'sample.jpg');
var_dump($response);
echo 'ID ' . $response['id'];
echo '<br><img src="' . $response['url'] . '">';

http://localhost/mastodon に アクセス してください。

このように画像が表示されればOKです。

ここの「ID」を後で使います。

 



 

画像のIDをつけてトゥート

画像付でトゥートする場合は画像IDが必要です。
そのため、前回設置した トゥート用関数を少し変更します。

Toot用の関数を変更

Toot用の関数をこちらに変更(上書き)します。class Mastodon内に入れてください。

Mastodon.php


	/**
	 * Posting a new status 仮2
	 */
	public function PostStatuses($toot=null, $visibility='private', $media_ids=array() ){

		if( $toot ){
			//Create our object
			$http = HttpRequest::Instance($this->getApiURL());
			$statusses = $http::Post(
				"api/v1/statuses",
				array(
					'status'	=> $toot,
					'visibility'	=> $visibility,	// public ,  unlisted ,  private ,  direct 
					'media_ids'	=> $media_ids,
				),
				$this->getHeaders()
			);
			if(is_array($statusses) && count($statusses) > 0){
				return $statusses;
			}
		}
		return false;
	}

画像付でトゥートテスト

では、画像付でトゥートテストしてみます。

ここでは、まず画像をアップロードして 帰ってくる画像IDをつけてトゥートしています。
画像は4つまでいけますので複数ある場合は PostMedia() の所を追加して$media_ids画像IDを追加してください。

以下のコードを index.php に張り付けてください。(前のコードは消してください)

<?php
require_once("autoload.php");
$t = new \theCodingCompany\Mastodon();

$media_ids = array();
$response = $t->PostMedia( __DIR__ . DIRECTORY_SEPARATOR . 'sample.jpg');
$media_ids[] = $response['id'];

$statusses = $t->PostStatuses("画像付トゥートテスト",'private', $media_ids );
var_dump($statusses);

http://localhost/mastodon に アクセス してください。

うまくいけばこのようになります。

 
 

あとがき

今回もいきおいで書きましたので間違いがあったらごめんなさいです。
Mastodonのインスタンスによっては 制限がある場合がありますのでガイドラインを確認してから利用してください。

 
 

参考

documentation / Using-the-API / API.md
https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md#media