截至 2012 年 11 月,通过 json 和 php 获取 youtube 数据的正确语法是啥?
Posted
技术标签:
【中文标题】截至 2012 年 11 月,通过 json 和 php 获取 youtube 数据的正确语法是啥?【英文标题】:what is the correct syntax to use for getting youtube data via json and php as at november 2012?截至 2012 年 11 月,通过 json 和 php 获取 youtube 数据的正确语法是什么? 【发布时间】:2012-10-24 20:25:47 【问题描述】:我很难通过 json 和 php 获取 youtube 视频数据。
我花了一整夜和一上午的时间尝试从网络上获取代码 sn-ps 和堆栈溢出。
他们不工作的事实表明我没有使用最新的语法。
我认为提出这个问题的最清楚的方法是询问以下属性在 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:duration 标签:
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&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>";
【问题讨论】:
看看这个,会有用的:***.com/questions/13219020/… 去掉卷曲和单引号。$json_data->entry->title
或者,将true
的第二个参数传递给json_decode
并将其作为数组$json_data['entry']['title']
访问。箭头和花括号看起来像是 Perl 中的东西,它是访问嵌套数组引用的语法。在 PHP 中,像这样的卷曲和引号会进行一些有趣的字符串化,通常不应该在不了解实际情况的情况下使用。
感谢您的回复,尝试测试第一个解决方案,代码编辑器不喜欢$video_duration = $json_data->entry->media:group->yt$duration;
和$video_views = $json_data->entry->yt$statistics->viewCount;
- 你能告诉我这些的语法应该是什么吗?谢谢。
@charles:feed 中返回的属性经常使用$
字符。大括号和单引号可以去掉,除非$
出现在属性名称中。
@SalmanA,听起来像是精神错乱的秘诀,尤其是考虑到:
似乎也经常被使用。我个人强烈建议将 JSON 数据解码为数组,这自然会使用字符串键。
【参考方案1】:
收到您的 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 一起表演。
芝麻街是非营利组织芝麻工作室的作品 教育组织也生产 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
数据要容易得多,找到您需要的所有位,然后编写代码。
【讨论】:
非常感谢,我目前正在解决一些问题,并在我测试完所有内容后返回这里,再次感谢您!【参考方案2】:您收到的错误意味着您正在尝试打印出一个对象。您可以使用 var_dump($json_data) 更好地了解您正在使用的对象。然后你可以找出可以打印哪些字符串。
为了获得更好的帮助,请提供最短的代码示例来显示您的问题。从 youtube 检索数据的行最终给出 400 错误。此外,您给出的错误表明您正在尝试打印一个值。您提供的示例代码均未尝试打印值。打印 $video_title 可能有效,而打印另一个值无效。
【讨论】:
您好,感谢您的回复,上面的 file_get_contents url 包含一个变量$random_text
所以如果您尝试访问该 url,这就是我认为出现 400 错误的原因。我已经用代码示例修改了上面的帖子。非常感谢。以上是关于截至 2012 年 11 月,通过 json 和 php 获取 youtube 数据的正确语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
OSMDROID android 4.2:Mapquest:截至 2016 年 7 月 11 日,直接磁贴访问已停止
曾为boston.gov提供代码。截至2019年11月,已移至Drupal 8。
如何使用新的 Instagram Graph 或 Basic Display API 获取普通用户的个人资料图片(截至 2020 年 6 月 29 日)