<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>php 归档 - Tinyfool的个人网站</title>
	<atom:link href="https://codechina.org/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>https://codechina.org/tag/php/</link>
	<description></description>
	<lastBuildDate>Mon, 29 Jan 2024 15:44:31 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>PHP如何解析Youtube的RSS【ChatGPT】</title>
		<link>https://codechina.org/2024/01/30634/</link>
					<comments>https://codechina.org/2024/01/30634/#respond</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Mon, 29 Jan 2024 15:44:29 +0000</pubDate>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[youtube]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=30634</guid>

					<description><![CDATA[<p>最近我想把我的油管视频的RSS引入到我的其他网站，比如OurCoders里。这本来应该不难。本来OurCode [&#8230;]</p>
<p><a href="https://codechina.org/2024/01/30634/">PHP如何解析Youtube的RSS【ChatGPT】</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>最近我想把我的油管视频的RSS引入到我的其他网站，比如<a href="https://ourcoders.com/">OurCoders</a>里。这本来应该不难。本来OurCoders的代码里面就包含了<a href="https://magpierss.sourceforge.net/">magpierss</a>，这是一个古老的PHP RSS解析库，但是一直都可以用。</p>



<span id="more-30634"></span>



<p>但是今天发现，magpirerss解析不出来，这是因为Youtube的RSS其实跟规范不完全统一，不够合法。之前即使magpirerss可以解析的时候，有些部分的解析也是不完全对的，我还需要写代码来调整解析后的结果。</p>



<p>今天又解析不出来了，于是我干脆想换一个新的RSS解析器吧，毕竟这个都10多年没更新的，有些Bug也没人解决。于是我找到了<a href="https://github.com/dg/rss-php">rss-php</a>。安装rss-php，很容易，它支持composer。安装方法是：</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">composer require dg/rss-php</code></pre>



<p>使用方法也很简单：</p>



<pre class="wp-block-code"><code lang="php" class="language-php">$rss = Feed::loadRss($url);

echo 'Title: ', $rss-&gt;title;
echo 'Description: ', $rss-&gt;description;
echo 'Link: ', $rss-&gt;url;

foreach ($rss-&gt;item as $item) {
	echo 'Title: ', $item-&gt;title;
	echo 'Link: ', $item-&gt;url;
	echo 'Timestamp: ', $item-&gt;timestamp;
	echo 'Description ', $item-&gt;description;
	echo 'HTML encoded content: ', $item-&gt;{'content:encoded'};
}</code></pre>



<p>但是可怕的是换了rss-php还是无法解析。我就想干脆单独自己写解析Youtube RSS的代码吧。</p>



<p>下面是YoutubeRSS的例子：</p>



<pre class="wp-block-code"><code lang="xml" class="language-xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;feed xmlns:yt="http://www.youtube.com/xml/schemas/2015" xmlns:media="http://search.yahoo.com/mrss/" xmlns="http://www.w3.org/2005/Atom"&gt;
 &lt;link rel="self" href="http://www.youtube.com/feeds/videos.xml?channel_id=UCdhngtoCb1xRmJQqkS5DpfA"/&gt;
 &lt;id&gt;yt:channel:dhngtoCb1xRmJQqkS5DpfA&lt;/id&gt;
 &lt;yt:channelId&gt;dhngtoCb1xRmJQqkS5DpfA&lt;/yt:channelId&gt;
 &lt;title&gt;Tinyfool的胡说八道&lt;/title&gt;
 &lt;link rel="alternate" href="https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA"/&gt;
 &lt;author&gt;
  &lt;name&gt;Tinyfool的胡说八道&lt;/name&gt;
  &lt;uri&gt;https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA&lt;/uri&gt;
 &lt;/author&gt;
 &lt;published&gt;2019-03-26T02:06:01+00:00&lt;/published&gt;
 &lt;entry&gt;
  &lt;id&gt;yt:video:0u_rS0CfhFc&lt;/id&gt;
  &lt;yt:videoId&gt;0u_rS0CfhFc&lt;/yt:videoId&gt;
  &lt;yt:channelId&gt;UCdhngtoCb1xRmJQqkS5DpfA&lt;/yt:channelId&gt;
  &lt;title&gt;军事是不是科技大发展的原动力？老范、徐凯和Tinyfool三人谈&lt;/title&gt;
  &lt;link rel="alternate" href="https://www.youtube.com/watch?v=0u_rS0CfhFc"/&gt;
  &lt;author&gt;
   &lt;name&gt;Tinyfool的胡说八道&lt;/name&gt;
   &lt;uri&gt;https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA&lt;/uri&gt;
  &lt;/author&gt;
  &lt;published&gt;2024-01-23T00:40:00+00:00&lt;/published&gt;
  &lt;updated&gt;2024-01-23T00:40:00+00:00&lt;/updated&gt;
  &lt;media:group&gt;
   &lt;media:title&gt;军事是不是科技大发展的原动力？老范、徐凯和Tinyfool三人谈&lt;/media:title&gt;
   &lt;media:content url="https://www.youtube.com/v/0u_rS0CfhFc?version=3" type="application/x-shockwave-flash" width="640" height="390"/&gt;
   &lt;media:thumbnail url="https://i1.ytimg.com/vi/0u_rS0CfhFc/hqdefault.jpg" width="480" height="360"/&gt;
   &lt;media:description&gt;成为此频道的会员即可获享以下福利：
https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA/join


本视频字幕使用TinyStudio生成 https://tinystudio.ai/&lt;/media:description&gt;
   &lt;media:community&gt;
    &lt;media:starRating count="54" average="5.00" min="1" max="5"/&gt;
    &lt;media:statistics views="2065"/&gt;
   &lt;/media:community&gt;
  &lt;/media:group&gt;
 &lt;/entry&gt;
 &lt;entry&gt;
  &lt;id&gt;yt:video:kj8b3sJ_gJE&lt;/id&gt;
  &lt;yt:videoId&gt;kj8b3sJ_gJE&lt;/yt:videoId&gt;
  &lt;yt:channelId&gt;UCdhngtoCb1xRmJQqkS5DpfA&lt;/yt:channelId&gt;
  &lt;title&gt;老范采访我，问我为啥要做游戏&lt;/title&gt;
  &lt;link rel="alternate" href="https://www.youtube.com/watch?v=kj8b3sJ_gJE"/&gt;
  &lt;author&gt;
   &lt;name&gt;Tinyfool的胡说八道&lt;/name&gt;
   &lt;uri&gt;https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA&lt;/uri&gt;
  &lt;/author&gt;
  &lt;published&gt;2024-01-21T01:00:20+00:00&lt;/published&gt;
  &lt;updated&gt;2024-01-21T01:00:20+00:00&lt;/updated&gt;
  &lt;media:group&gt;
   &lt;media:title&gt;老范采访我，问我为啥要做游戏&lt;/media:title&gt;
   &lt;media:content url="https://www.youtube.com/v/kj8b3sJ_gJE?version=3" type="application/x-shockwave-flash" width="640" height="390"/&gt;
   &lt;media:thumbnail url="https://i4.ytimg.com/vi/kj8b3sJ_gJE/hqdefault.jpg" width="480" height="360"/&gt;
   &lt;media:description&gt;成为此频道的会员即可获享以下福利：
https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA/join


本视频字幕使用TinyStudio生成 https://tinystudio.ai/&lt;/media:description&gt;
   &lt;media:community&gt;
    &lt;media:starRating count="54" average="5.00" min="1" max="5"/&gt;
    &lt;media:statistics views="2452"/&gt;
   &lt;/media:community&gt;
  &lt;/media:group&gt;
 &lt;/entry&gt;

&lt;/feed&gt;</code></pre>



<p>但是写起来好麻烦啊。对啊，我们有 ChatGPT，万事不决问ChatGPT，于是我写下了如下的Prompt：</p>



<pre class="wp-block-preformatted">如下的xml，我希望读取每个<code>entry</code>的id，title，link，published，updated，media:thumbnail，media:description等信息，用PHP如何获得 </pre>



<p>ChatGPT回复道：</p>



<pre class="wp-block-preformatted">使用SimpleXML扩展可以轻松地解析这样的XML。但请注意，由于XML具有命名空间，因此需要在处理元素和属性时指定它们。以下是如何用SimpleXML读取每个&lt;entry>的id，title，link，published，updated，media:thumbnail，media:description等信息： </pre>



<pre class="wp-block-code"><code lang="php" class="language-php">&lt;?php
$xmlString = '...'; // 这里放你的原始XML字符串
$xml = simplexml_load_string($xmlString);
$xml->registerXPathNamespace('media', 'http://search.yahoo.com/mrss/');
$xml->registerXPathNamespace('yt', 'http://www.youtube.com/xml/schemas/2015');

foreach ($xml->entry as $entry) {
    $id = (string)$entry->id; // 或者使用 $entry->children('yt', true)->videoId
    $title = (string)$entry->title;
    $link = (string)$entry->link->attributes()->href;
    $published = (string)$entry->published;
    $updated = (string)$entry->updated;
    
    // 获取媒体信息
    $mediaGroup = $entry->children('media', true)->group;
    $mediaThumbnail = (string)$mediaGroup->thumbnail->attributes()->url;
    $mediaDescription = (string)$mediaGroup->description;
    
    // 输出信息
    echo "ID: $id\n";
    echo "Title: $title\n";
    echo "Link: $link\n";
    echo "Published on: $published\n";
    echo "Updated on: $updated\n";
    echo "Thumbnail: $mediaThumbnail\n";
    echo "Description: $mediaDescription\n";
    echo "----------------------\n";
}
?></code></pre>



<pre class="wp-block-preformatted">这段代码首先加载了XML字符串到$xml变量。然后，我们使用registerXPathNamespace()函数来注册XML中使用的命名空间。这对于正确解析media:和yt:前缀的元素至关重要。接着，代码遍历了&lt;entry>标签中的每一个条目，提取和打印了所需的信息。 请注意，由于含有冒号（:）的XML元素属于名称空间，我们需要使用children()方法来访问它们。SimpleXML中的attributes()方法被用于获取元素的属性。 这段代码提供了一个基本的框架，可能需要根据实际XML结构或者特定需求进行适当的调整。同时，确保输入的XML字符串是完整和有效的，这里出于示例缩短了字符串内容。</pre>



<p>问题解决了</p>
<p><a href="https://codechina.org/2024/01/30634/">PHP如何解析Youtube的RSS【ChatGPT】</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2024/01/30634/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2024/01/截屏2024-01-29-23.38.21.png" medium="image" />
	</item>
	</channel>
</rss>
