4

我很难通过 json 和 php 获取 youtube 视频数据。

我花了整整一夜和早上尝试来自网络和堆栈溢出的代码片段。

他们不工作的事实向我表明我没有使用最新的语法。

我认为提出这个问题的最清楚的方法是询问截至 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'};

我不想通过提供太多其他代码和信息来淡化这个问题,但我得到的错误之一是:

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

所以我知道其中一个属性是不正确的。

谢谢你的帮助,我要去喝杯咖啡,然后再回来!

研究

这些资源是对我试图获取的属性的直接 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:持续时间标签:

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

yt:statistics > viewCount 标签:

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

内容标签(视频说明):

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) “芝麻街:雷·查尔斯与伯特和厄尼一起唱“我有一首歌”

字符串(24)“2008-08-06T18:56:56.000Z”

字符串(3)“129”

字符串(6)“828277”

string(342) "欲了解更多视频和游戏,请访问我们的新网站 http://www.sesamestreet.org

在这段视频中,Bert 和 Ernie 与 Ray Charles 一起表演。

Sesame Street 是 Sesame Workshop 的作品,这是一个非营利性教育组织,它还为世界各地的儿童制作 Pinky Dinky Doo、The Electric Company 和其他项目。”

PS:如果您对关联数组感到满意,请将 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 回答