4

json と php 経由で youtube の動画データを取得するのに苦労しています。

私は一晩中朝から晩まで、Web やスタック オーバーフローからコード スニペットを試してみました。

それらが機能していないという事実は、私が最新の構文を使用していないことを示唆しています。

この質問をする最も明確な方法は、次のプロパティが 2012 年 11 月の時点で正しいかどうかを尋ねることだと思います。

これは私の最初の変数宣言です:

$json = file_get_contents("http://gdata.youtube.com/feeds/api/videos/{$random_text}?v=2&alt=json");
$json_data = json_decode($json);

以下が正しいかどうか誰か教えてください。

1.  $video_title = $json_data->{'entry'}->{'title'};
2.  $video_date = $json_data->{'entry'}->{'published'};
3.  $video_duration = $json_data->{'entry'}->{'media:group'}->{'yt$duration'};
4.  $video_views = $json_data->{'entry'}->{'yt$statistics'}->{'viewCount'};
5.  $video_description = $json_data->{'entry'}->{'content'};

他のコードや情報を提供しすぎて質問を薄めたくはありませんが、取得しているエラーの1つは次のとおりです。

Catchable fatal error: Object of class stdClass could not be converted to string

したがって、これらのプロパティの1つが正しくないことはわかっています。

助けてくれてありがとう、私はコーヒーを飲んでこれに戻ってくるよ!

リサーチ

これらのリソースは、取得しようとしているプロパティへの直接の API 参照であり、機能するはずですが、そうではないようです:(。

フィードとエントリの構造:

https://developers.google.com/youtube/2.0/developers_guide_protocol_understanding_video_feeds#Understanding_Video_Entries

エントリの内容:

https://developers.google.com/youtube/2.0/reference#youtube_data_api_tag_entry

タイトルタグ:

https://developers.google.com/youtube/2.0/reference#youtube_data_api_tag_title

公開タグ:

https://developers.google.com/youtube/2.0/reference#youtube_data_api_tag_published

yt:duration タグ:

https://developers.google.com/youtube/2.0/reference#youtube_data_api_tag_yt:期間

yt:statistics > viewCount タグ:

https://developers.google.com/youtube/2.0/reference#youtube_data_api_tag_yt:統計

content タグ (動画の説明):

https://developers.google.com/youtube/2.0/reference#youtube_data_api_tag_content

コードサンプル(ご要望に応じて)

だから私がやっていることは:

  • 私はフォームを持っています
  • 送信時にphpファイル(insert.php)によって処理されます
  • データにいくつかの変更を加えてから、データベースに送信します
  • $final_li_code で始まる行にエラー メッセージが表示されます (ただし、json 変数が含まれていない場合、コードは機能するため、json 変数に問題があります)
  • (このフォームは sql インジェクションに対して脆弱であると言われていますが、一般向けのフォームではありません。つまり、htaccess/htpasswd で保護されています)。

これは、insert.php の関連コードです。

// basic form information
$field1 = $_POST["field1"];
$field2 = $_POST["field2"];
$original_link = $_POST["link"];
// add class and video display information
$random_text = array_pop(explode('/',$original_link)); 
$final_value = "<a class=\'youtube\' href=\"http://www.youtube.com/embed/".$random_text."?rel=0&autohide=1&showinfo=0&autoplay=0&iv_load_policy=3&amp;wmode=transparent\">link</a>";
//start getting the youtube information
$thumb = "<img src=\"http://i.ytimg.com/vi/".$random_text."/mqdefault.jpg\">";
$json = file_get_contents("http://gdata.youtube.com/feeds/api/videos/{$random_text}?v=2&alt=json");
$json_data = json_decode($json);
$video_title = $json_data->entry->title;
$video_date = $json_data->entry->published;
$video_duration = $json_data->entry->media:group->yt:duration;
$video_views = $json_data->entry->ytstatistics->viewCount;
$video_description = $json_data->entry->content;
// put it all together to create an <li>
$final_li_code = "<li class=\".{$field1} .{$field2}\">{$thumb}<div id=\"video_information\"><h3>{$video_title}</h3><div id=\"video_information_left\"><span id=\"date\">{$video_date}</span><span id=\"duration\">{$video_duration}</span><span id=\"another_id\">{$field2}</span></div><div id=\"video_information_right\"><span id=\"video_views\">{$video_views}</span><span id=\"yet_another_id\">{$field1}</span></div><span id=\"description\">{$video_description}</span></div></li>";
4

2 に答える 2

5

SOS メッセージを受け取りました。必要な変更は次のとおりです。

$video_title = $json_data->{'entry'}->{'title'}->{'$t'};
$video_date = $json_data->{'entry'}->{'published'}->{'$t'};
$video_duration = $json_data->{'entry'}->{'media$group'}->{'yt$duration'}->{'seconds'};
$video_views = $json_data->{'entry'}->{'yt$statistics'}->{'viewCount'};
$video_description = $json_data->{'entry'}->{'media$group'}->{'media$description'}->{'$t'};

という名前の変数ではなく、$tリテラルの$後に が続くことに注意してください。t$t

動画 ID gzDS-Kfd5XQ の出力例:

string(66) 「セサミストリート: レイ・チャールズがバート & アーニーと "I Got A Song" を歌う」

文字列(24) "2008-08-06T18:56:56.000Z"

文字列(3) "129"

文字列(6) "828277"

string(342) "その他のビデオやゲームについては、http://www.sesamestreet.org の新しい Web サイトを ご覧ください。

このビデオでは、バートとアーニーがレイ チャールズと共演しています。

セサミストリートは、世界中の子供たちのためにピンキーディンキードゥー、エレクトリックカンパニー、およびその他のプログラムを制作する非営利教育組織であるセサミワークショップの制作です。」

PS: 連想配列に慣れている場合は、2 番目のパラメーターとして true を に渡しますjson_decode

mixed json_decode(string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0]]])

PPS:var_dumpデータを取得し、必要なすべてのビットを見つけて、後でコードを記述する方がはるかに簡単です。

于 2012-11-05T15:06:29.813 に答える
0

受け取ったエラーは、オブジェクトを印刷しようとしていることを意味します。var_dump($json_data) を使用して、作業しているオブジェクトをよりよく理解できます。次に、どの文字列を印刷できるかを調べることができます。

より適切なサポートが必要な場合は、問題を示す可能な限り短いコード サンプルを含めてください。YouTube からデータを取得するために指定された行は、最終的に 400 エラーになります。また、指定したエラーは、値を出力しようとしていることを示しています。あなたが与えたサンプルコードはどれも値を印刷しようとはしませんでした。$video_title の出力が有効で、別の値の出力が有効でない可能性があります。

于 2012-11-05T02:43:50.400 に答える