iT邦幫忙

0

透過 php + mysql 製作 RSS(XML) ?

事由
因為第一次接觸到 RSS,發現了完全不了解的問題。
目前網站中有部落格,但是非WP或其他第三方套件,而是自己寫的一個部落格,可以發佈、也可看所有文章列表,也有用 htaccess 重新寫了網址規則。

爬爬爬
我查了一下RSS製作方式
http://raymondchou.pixnet.net/blog/post/144233644-%E5%A6%82%E4%BD%95%E8%A3%BD%E4%BD%9Crssfeed%E4%BD%BF%E7%94%A8mysql%E8%88%87php-
他的做法是創建一個數據表,將需要做成RSS的內容都丟進去,最後再用 php while 將這資料表的欄位資料印出,在旁邊加上 RSS 上面的那種 tag 例如 <title> 等等。這是我目前看到好像是 RSS製作的一種方式?這是標準的製作方式嗎?

XML Format ?
因目前跟某公司合作,主要是想更新我這邊的文章到他那邊去。有給了我一個 XML Format 格式,上面的標籤真的是不少。

這是其中一段:

 <startYmdtUnix>1457280000000</startYmdtUnix> //Mandatory
        <endYmdtUnix>1457480000000</endYmdtUnix>  //Mandatory
        <title>String // article title</title>  //Mandatory
        <category>String</category>  //Mandatory
        <subCategory>String</subCategory>  //Optional
        <publishTimeUnix>1457480000000</publishTimeUnix>  //Mandatory
        <updateTimeUnix>1457480000000</updateTimeUnix>  //Optional
        //Optional
        // 0 stands for general article with plain text, images and short video;
        // 1 stands for long video news. Warning!!! if the article is long video news, this tag is necessary and must be 1.
        // 2 stands for the comic book.
        // 5 is for video content, only allow one video and text in contents.
        // 6 stand for trailer for a specific movie, only allow one video and text in contents.
        <contentType>0, 1, 2, 5, 6</contentType>
        <thumbnail>String // relative file of thumbnail file</thumbnail>  //Optional
        <contents> //Contain at least one of image, video, text. Can be multiple.
            <image>
                <title>String // image title</title>  //Optional
                <description>String // image caption</description>  //Optional
                <url>String // relative file path of image file</url>  //Mandatory
                <thumbnail>String // relative file of thumbnail file</thumbnail>  //Optional
            </image>
            <video>
                <title>String // video title</title>  //Optional
                <description>String // video caption</description>  //Optional
                <url>String // relative file path of video file</url>  //Mandatory
                <thumbnail>String // relative file path of thumbnail file</thumbnail>  //Optional
                <restrictedCountries>  //Optional
                    <country>String // ISO 3166­1 alpha­2</country>
                    <country>String // ISO 3166­1 alpha­2</country>
                    <country>... // others</country>
                </restrictedCountries>
                <width>449</width> //Optional
                <height>101</height> //Optional
            </video>
            <text>
                <content>  //Mandatory
                         <![CDATA html tag or pure text ]]>
                </content>
            </text>
        </contents>

問題產生

  1. 對方提供的 XML Format 跟 RSS 是一樣的道理嗎?
  2. XML Format 每一個 tag 跟我製作 RSS 的方式是否是正確的方向?
  3. 也就是說,我新增部落格文章的同時,除了丟一份到我原本網站要顯示的那個數據表外,再把需要製作 RSS 的部落格內容也丟到另一個 RSS 專屬數據表去,然後再打印出來給對方取得?
  4. 這個製作方式是標準作法嗎?
  5. 所謂的「當我新增一篇文章,對方就能夠抓到」,是指這個 RSS 嗎?我只要將部落格內容丟給 RSS 專屬的數據庫,再利用 php 打印這個數據庫的文章,替他加上上方 XML Format 的標籤就可以了嗎?
  6. 我發現不管是 facebook 即時文章,或是對方給我的格式中,他的名稱都是 <articles> , <article>,但RSS教學中:http://www.w3school.com.cn/rss/index.asp 他的是 <channel>, <item> ,WHY?

抱歉問題有點多,但這確實困擾了我幾天

2 個回答

2
Homura
iT邦高手 1 級 ‧ 2018-09-20 21:00:07
最佳解答

對方提供的 XML Format 跟 RSS 是一樣的道理嗎?

對方會這樣提供我想應該是的

XML Format 每一個 tag 跟我製作 RSS 的方式是否是正確的方向?

當然不一樣,RSS是有自己的標準格式

也就是說,我新增部落格文章的同時,除了丟一份到我原本網站要顯示的那個數據表外,再把需要製作 RSS 的部落格內容也丟到另一個 RSS 專屬數據表去,然後再打印出來給對方取得?

這個你要問對方是怎麼運作了,如果是標準的RSS訂閱器一開始會全部抓進去,之後會判斷哪些你讀過,然後只抓目前還沒讀取過的新文章

這個製作方式是標準作法嗎?

你如果是給大家用的RSS訂閱的,請使用正確的RSS格式,廠商的請另外再準備一份特殊格式

所謂的「當我新增一篇文章,對方就能夠抓到」,是指這個 RSS 嗎?我只要將部落格內容丟給 RSS 專屬的數據庫,再利用 php 打印這個數據庫的文章,替他加上上方 XML Format 的標籤就可以了嗎?

RSS應該每次修改或新增文章,RSS理論上都要重新產生一次才對,然後抓取最新的跟上面說的一樣

我發現不管是 facebook 即時文章,或是對方給我的格式中,他的名稱都是 , ,但RSS教學中:http://www.w3school.com.cn/rss/index.asp 他的是 , ,WHY?

因為他們都有遵照RSS 2.0標準

補充一下RSS 2.0標準連結

看更多先前的回應...收起先前的回應...
小松菜奈 iT邦研究生 4 級 ‧ 2018-09-20 21:03:41 檢舉

我文章內容一定要跟他訂製的tag標籤 一樣嗎?因為我發現一個問題,我產生文章是使用第三方套件編輯器,所以他無論是加入影片照片,都沒有他要的那種格式

Homura iT邦高手 1 級 ‧ 2018-09-20 21:08:45 檢舉

asys0512
要啊!
那你可能要自己寫或是問他有沒有什麼工具可以提供你用

小松菜奈 iT邦研究生 4 級 ‧ 2018-09-20 21:13:25 檢舉

Homura 什麼...天啊,我也是快瘋了。<content:encoded> 裡面也要有他要的格式?我不能直接給html嗎

Homura iT邦高手 1 級 ‧ 2018-09-20 21:19:42 檢舉

asys0512
這你要問對方了...
不過廠商為啥不用RSS 2.0
RSS標準就是為了大家都用一樣才定的啊/images/emoticon/emoticon06.gif

小松菜奈 iT邦研究生 4 級 ‧ 2018-09-20 21:22:29 檢舉

我發現facebook 即時文章跟 LINE 的格式好像都是 2.0 ?

小松菜奈 iT邦研究生 4 級 ‧ 2018-09-20 21:24:17 檢舉

真的很傷腦筋就是了,假設我編輯器每個 <img 都要變成這種格式
<<image> <<title></title> //Optional <<description></description> //Optional <<url></url> //Mandatory <<thumbnail></thumbnail> //Optional</image>

沒套件可以用啊?這一般編輯器哪來會給這東西

Homura iT邦高手 1 級 ‧ 2018-09-20 21:35:57 檢舉

asys0512
現在應該都2.0了
我突然想到黑暗執行緒大大的RSS確實是塞html標籤在<description>裡面
不過他有對標籤作轉換就是了
view-source:http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx
不過我怕你那個廠商寫的程式可能會不接受?
你還是問清楚會比較好...

小松菜奈 iT邦研究生 4 級 ‧ 2018-09-20 21:43:03 檢舉

我只是好奇我現在的做法是不是對的,我會建立兩個數據庫,分別是給臉書跟LINE的(舉例,這兩個要的RSS tag 有些不一樣...)
當發表文章的時候,我會將需要的值也丟進去這兩個數據庫中?這是對的做法嗎?然後再用這個別人寫的範例分別印出RSS...:https://www.pontikis.net/blog/simple-rss-class-create-rss-feed

以及怎麼轉譯啊,假設我的文章內容content有需要轉譯的字串(RSS官方說這兩個 <& 需要轉)? ...我要怎麼再丟到資料庫之前先轉譯?

Homura iT邦高手 1 級 ‧ 2018-09-20 21:51:01 檢舉

asys0512
2個不一樣嗎?
應該沒錯
不管是新增還是修改RSS都需要重新產生

轉譯的話
你可以產生RSS時再轉就好了
我查到PHP能用這個方法
http://www.w3school.com.cn/PHP/func_string_htmlspecialchars.asp

小松菜奈 iT邦研究生 4 級 ‧ 2018-09-20 22:01:16 檢舉

我發表文章時至少有三種欄位,title, content, cover (文章的封面照片)
而content創建的工具是網上的第三方套件編輯器,但這個編輯器又可以新增圖片,或是 iframe instagram, youtube 影音或貼文,這意味著我必須要在 content 中用某函數要先找到兩種東西

  1. <img src="https://..abc.jpg">
  2. <iframe></iframe>

例如圖片的話 RSS 要的是這樣的格式

<image><url> XXX </url></image>

那我就必須要先把 <img src="https://..abc.jpg"> 取出,然後取得 src 的內容 abc.jpg 然後再取代成 <image><url>https://..abc.jpg</url></image> 返回。

無論中途的字串是什麼,我必須先把他提出來,再包裝成 RSS 要的 <tag>標籤,這能用什麼函數做到?

Homura iT邦高手 1 級 ‧ 2018-09-20 22:18:12 檢舉

asys0512
喔你是想從文章取出來嗎?
這個可以用正規表示找出來吧
https://stackoverflow.com/questions/18653440/regular-expression-to-remove-an-iframe

小松菜奈 iT邦研究生 4 級 ‧ 2018-09-20 22:19:52 檢舉

我這個做法是對的嗎?

Homura iT邦高手 1 級 ‧ 2018-09-20 22:24:11 檢舉

asys0512
你是說符合廠商的格式嗎?
你要問廠商才對啊/images/emoticon/emoticon06.gif

小松菜奈 iT邦研究生 4 級 ‧ 2018-09-20 22:53:54 檢舉

所以那個 xml 網址中,印出來的資料就要是他規定的那樣顯示?例如 <img> 就不是img 了,而是 <image><url>https://..abc.jpg</url></image> ?

Homura iT邦高手 1 級 ‧ 2018-09-20 23:01:21 檢舉

asys0512
如果像你這樣說一樣的話
可能不能塞html在裡面唷
所以你還是得問廠商才是到那段程式到底是怎麼解讀的!!/images/emoticon/emoticon05.gif

小松菜奈 iT邦研究生 4 級 ‧ 2018-09-21 11:50:38 檢舉

看來是如果丟 html 就加上這個標籤就行 <![CDATA[ , 但這裡面的 html 不知道需不需要轉換?

Homura iT邦高手 1 級 ‧ 2018-09-21 13:32:05 檢舉

asys0512
對!
<![CDATA[就是讓XML分析器認為裡面沒有XML標記

小松菜奈 iT邦研究生 4 級 ‧ 2018-09-21 14:11:45 檢舉

了解,所以不需要轉換,直接給 html 就可以?

Homura iT邦高手 1 級 ‧ 2018-09-21 14:16:45 檢舉

asys0512

小松菜奈 iT邦研究生 4 級 ‧ 2018-09-21 18:18:28 檢舉

我好奇:
https://developers.facebook.com/docs/instant-articles/publishing/setup-rss-feed

content:encoded 標籤不知道跟上面那個是不是一樣的道理?可以放html

Homura iT邦高手 1 級 ‧ 2018-09-21 22:24:40 檢舉

asys0512
應該是一樣唷
可是查了很多還是會包在<![CDATA[裡面
你自己試試看可不可以吧!@@

0
浩瀚星空
iT邦大師 1 級 ‧ 2018-09-21 10:27:13

那個,不要將rss跟xml兩著搞混在一起看啦
rss的全名叫 Really Simple Syndication
也就是它只是一種訂閱服務的意思,大多數是採用xml格式且是統一的規範的東西

xml是一種資料規範好的文件,採用tag標簽的原理。

也就是兩著在說明上是有很大的不同的。

真正要說明的話,就是rss它是一種依照正規的規範xml檔的意思。也就是其tag的命名跟階層的使用方式都有一定的規則。

我要發表回答

立即登入回答