質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

1882閲覧

メソッドの呼び出し方について

kmtym1998

総合スコア9

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2019/08/28 08:57

編集2019/08/29 06:12

phpでSpotifyのAPIを使ったWebサイトを制作しています。

以下のリンクからSpotify APIのライブラリをダウンロードしたものを使っています。

jwilsson/spotify-web-api-php

認証を受けたユーザのよく聴く曲やアーティストを取得したいです。リファレンスを参照するとgetMyTop()というメソッドが定義されていたので、リファレンス通りにコードを記述したのですが、エラーが出てしまい、どうしてもその原因がわかりません。関数の呼び出し方に問題があるのでは、と疑っていましたが、ひとりで考えてみて限界になったので質問させていただきます。

php

1<?php 2//パス:C:\TECHBASE\__WatchOut__\XAMPP\htdocs\php_test\iNTO\iNTO.php 3 4require_once('../vendor/autoload.php'); 5require_once('spotify-web-api-php-master/src/SpotifyWebAPI.php'); 6require_once('profile.php'); 7 8$me = new Profile(); 9 10$me->setBio('洋楽がすき<br>'); 11 12?> 13 14<html> 15 16<head> 17 <title>iNTO</title> 18 <link rel="stylesheet" href="iNTO.css" type="text/css"> 19</head> 20 21<body> 22 <div class="upper"> 23 <h1><a href="http://localhost/php_test/iNTO/iNTO.php">Reload</a></h1> 24 <h2>iNTO</h2> 25 </div> 26 27 28 <div class="wrapper"> 29 <div class="Pic"> 30 <?php 31 //プロフィール画像取得 32 $img = file_get_contents('https://profile-images.scdn.co/images/userprofile/default/43516f5c98c8801ea2ceb67a696d51ce67e9671f'); 33 $enc_img = base64_encode($img); 34 $imginfo = getimagesize('data:application/octet-stream;base64,' . $enc_img); 35 echo '<img class="profilePic" src="data:' . $imginfo['mime'] . ';base64,'.$enc_img.'">'; 36 //// 37 ?> 38 </div> 39 40 <div class="userName"> 41 <strong><?php echo $me->getUserName() ?></strong> 42 </div> 43 44 <div class="followAndFollower"> 45 <?php 46 echo "フォロワー:" . $me->getFollow()."<br>"; 47 echo "フォロー:" .$me->getFollow(); 48 ?> 49 </div> 50 51 <div class="bio"> 52 <?php echo $me->getBio() ?> 53 </div> 54 55 <h3>公開中のプレイリスト</h3> 56 <ul> 57 <?php foreach($me->getPlaylists()->items as $playlist): ?> 58 <li><?php echo $playlist->name ?></li> 59 <?php endforeach ?> 60 </ul> 61 62 </div> 63 64</body> 65 66</html>

PHP

1<?php 2//パス:C:\TECHBASE\__WatchOut__\XAMPP\htdocs\php_test\iNTO\profile.php 3require_once('../vendor/autoload.php'); 4 5class Profile{ 6 private $userName; 7 private $profilePic; 8 private $follower = 0; 9 private $follow = 0; 10 private $Bio; 11 private $playlists; 12 private $topTracks; 13 private $topArtists; 14 15 public function __construct(){ 16 //Spotifyにユーザ認証 17 //アクセストークンの取得 18 $session = new SpotifyWebAPI\Session( 19 '{client id}', 20 '{client secret}', 21 'http://localhost/php_test/iNTO/iNTO.php' 22 ); 23 $api = new SpotifyWebAPI\SpotifyWebAPI(); 24 if (isset($_GET['code'])) { 25 $session->requestAccessToken($_GET['code']); 26 $api->setAccessToken($session->getAccessToken()); 27 }else{ 28 header('Location: ' . $session->getAuthorizeUrl(array( 29 'scope' => array( 30 'playlist-read-private', // プレイリスト取得 31 'playlist-modify-private', // プレイリスト変更 32 'user-read-private', 33 'playlist-modify' 34 ) 35 ))); 36 die(); 37 } 38 ///////////ここまでアクセストークンの処理 39 40 $profileInfo = $api->me(); //認証したユーザのプロフィール 41 42 //プロフィールから名前を取得 43 $this->userName = $profileInfo->display_name; 44 45 //プレイリスト取得 46 $this->playlists = $api->getMyPlaylists(["limit" => 2]); 47 48 //プロフィール画像をプロフィールから取得 49 $this->profilePic = $profileInfo->images[0]->url; 50 51 //トップトラックを取得 52 $this->topTracks = $api->getMyTop('tracks',['limit' => 3]); 53 54 } 55 56 public function getBio(){ 57 return $this->bio; 58 } 59 60 public function getUserName(){ 61 return $this->userName; 62 } 63 64 public function getPlaylists(){ 65 return $this->playlists; 66 } 67 68 public function getProfilePic(){ 69 return $this->profilePic; 70 } 71 72 public function getFollower(){ 73 return $this->follower; 74 } 75 76 public function getFollow(){ 77 return $this->follow; 78 } 79 80 public function getTopTracks(){ 81 return $this->topTracks; 82 } 83 84 public function setBio($bio){ 85 //$bioは文字列か確かめる 86 $this->bio = $bio; 87 } 88} 89 90?>

エラーメッセージ

Fatal error: Uncaught SpotifyWebAPI\SpotifyWebAPIException: An unknown error occurred. in C:\TECHBASE\__WatchOut__\XAMPP\htdocs\php_test\vendor\jwilsson\spotify-web-api-php\src\Request.php:52 Stack trace: #0 C:\TECHBASE\__WatchOut__\XAMPP\htdocs\php_test\vendor\jwilsson\spotify-web-api-php\src\Request.php(242): SpotifyWebAPI\Request->parseBody(NULL, 403) #1 C:\TECHBASE\__WatchOut__\XAMPP\htdocs\php_test\vendor\jwilsson\spotify-web-api-php\src\Request.php(121): SpotifyWebAPI\Request->send('GET', 'https://api.spo...', 'limit=3&offset=...', Array) #2 C:\TECHBASE\__WatchOut__\XAMPP\htdocs\php_test\iNTO\spotify-web-api-php-master\src\SpotifyWebAPI.php(1054): SpotifyWebAPI\Request->api('GET', '/v1/me/top/trac...', Array, Array) #3 C:\TECHBASE\__WatchOut__\XAMPP\htdocs\php_test\iNTO\profile.php(52): SpotifyWebAPI\SpotifyWebAPI->getMyTop('tracks', Array) #4 C:\TECHBASE\__WatchOut__\XAMPP\htdocs\php_test\iNTO\iNTO.php(16): Profile->__construct() #5 {main} thrown in C:\TECHBASE\__WatchOut__\XAMPP\htdocs\php_test\vendor\jwilsson\spotify-web-api-php\src\Request.php on line 52

profile.phpの$this->topTracks = $api->getMyTop('tracks',['limit' => 3]);を外した場合は正常に動作します。
考えられる原因は何でしょうか。ご回答お待ちしております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/08/28 10:19

ご提示のコードにはそもそも閉じ括弧(})が不足しています
kmtym1998

2019/08/28 13:13

申し訳ありません。 コピペミスです。手元のコードには閉じ括弧が書かれています。
gentaro

2019/08/28 13:38

質問文は修正できるので修正しましょう。(後から質問文を読んだ人はまず同じ疑問を持ちます)
m.ts10806

2019/08/28 14:12

エラーもコードブロック使ってください。
kmtym1998

2019/08/28 14:33

ご回答ありがとうございます。 修正しておきました。
t_obara

2019/08/29 01:48

$api->new となっていますが、これも$api = new の間違い?
m.ts10806

2019/08/29 04:35

コードは全体をコピペで提示してほしい・・ じゃないと正しく再現確認できない
kmtym1998

2019/08/29 05:53

何度も申し訳ありません。 コード全体をのせておきました。
m.ts10806

2019/08/29 06:01

そういえばレベルで申し訳ないですが、アクセストークンって実際の値じゃないですよね? もしそうだとしたらかなりマズいと思います。 ひとまず$apiにきちんとインスタンスが格納されているか確認してみてください。
kmtym1998

2019/08/29 06:26

アクセストークンの値を、var_dump($session->getAccessToken());で確認すると、以下のような文字列が出力されます(" "内の文字は毎回変わりますが)。 string(227) "BQABB3ilQCAFPetP5iZ8SY1pemhwwyit568ChPrALnH7KJSv7mcGIgyoP8W89RDK-sKOqh4p5fwl23Qqbou_U1Dbz5EFNtQwrQqwDCRVK1qLPsTLpPSzemXVHmeto3TaeYoBGeNNqpkrdE4n97qmtdJ-8Agjt-P-K8E0CAf65JTjUuMNf3V-VUDCylgyBEMi2jiJ07jglZa5c-QRj_3U0Gg7dF-Lk5hXM2g" これは値とは呼ばないのでしょうか。まだ初心者なので理解が行き届いておりません。
t_obara

2019/08/29 06:28

なんとなく、limitの指定が間違えているような。limit=3ではないでしょうかね。まぁ、すでに回答が出ていますが、レスポンスを確認するのが一番でしょうけども。
guest

回答2

0

自己解決

Spotify APIの公式リファレンスを参照し、解決することができました。

scopeにuser-top-readを記述し、ユーザに認証をもらわないと取得できない情報だったようです。

ご回答いただいた方、ありがとうございました。

php

1 $session = new SpotifyWebAPI\Session( 2 '{client id}', 3 '{client secret}', 4 'http://localhost/php_test/iNTO/iNTO.php' 5 ); 6 $api = new SpotifyWebAPI\SpotifyWebAPI(); 7 if (isset($_GET['code'])) { 8 $session->requestAccessToken($_GET['code']); 9 $api->setAccessToken($session->getAccessToken()); 10 }else{ 11 header('Location: ' . $session->getAuthorizeUrl(array( 12 'scope' => array( 13 'playlist-read-private', // プレイリスト取得 14 'playlist-modify-private', // プレイリスト変更 15 'user-read-private', 16 'playlist-modify', 17 'user-top-read' //これを足した 18 ) 19 ))); 20 die(); 21 }

投稿2019/08/29 14:23

kmtym1998

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

{main} thrown in C:\TECHBASE_WatchOut_\XAMPP\htdocs\php_test\vendor\jwilsson\spotify-web-api-php\src\Request.php on line 52

コード読めば良い。
200 台のステータスが帰ってないときに発生させる例外です。
JSON に error っぽいメッセージがないときに行き着く先のようなので、レスポンス JSON をそのまま表示させてみては?

投稿2019/08/29 06:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kmtym1998

2019/08/29 06:57

レスポンスJSONを表示するにはどうしたらよいのでしょうか。 json_encode関数を使ってJSON形式に変換できることは調べてわかりましたが引数になにをいれればよいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問