使用 WP REST API 和 Python 新增文章和上傳圖片 | WordPress 技巧

使用 WP REST API 和 Python 新增文章和上傳圖片 | Wordpress 技巧

為何莫名會使用 WP REST API 的契機是,最近為了幫一個台大學長把一個網站上的大量內容重新發文到另一個網站上。剛好這兩個網站都是使用 WordPress 做的。不過因為原本網站的那一方雖然願意讓我們這樣子做但是不願意給我們文章的原始碼,所以只好一篇篇複製貼上再發表。但是文章數量眾多,大約有 70 多篇文章,如果一篇一篇複製貼上,做起來會累死人。剛好 WordPress 從 4.7 的版本之後開始正式納入 API 的功能,不用另外安裝外掛去新增 API 功能,所以我採用的方式是使用 Python 寫爬蟲,接著使用 WP REST API,把擷取下來的文字和圖片,透過 json 的格式發佈到另一個站台裡面。

每篇文章裡面都會有頁面圖片以及內文裡面的圖片,我一併也使用 WP REST API 一起處理好了,總合加起來的時間只有 10 分鐘(因為爬蟲當中有下載並上傳圖片的過程,加上網路剛好選到有點慢的地方…),可以不用讓你浪費幾小時的時間在做重複的事情,重複的事情只需要給比我們更不容易出錯的電腦做就可以了!

使用 WP REST API 前的觀念

而你有可能用到這個功能的時機點是什麼時候呢?例如:

1. 從別的架構的網站搬家到 WordPress 架構的網站時
2. 在有大批文章需要移動時
3. 無法獲得資料庫的權限而無法用 MySQL 或 MariaDB 直接匯入別的資料庫備份表時
4. 無法用 WordPress XML 匯入匯出大量文章的時候
5. WordPress 與 APP 互相溝通時,例如電商網站搭配手機 APP。

不過在使用 WP REST API 之前,需要先了解一些基本概念。

簡單來說,REST API 是對外的接口設計,透過 URL 位置定位資源,用 HTTP 的動作(GET, POST, DELETE…)來執行動作。而 REST 則是伺服器和要求端之間的一種溝通模式而已,有實際作用的是 REST API。

首先,如果你有一個 Wordpess 網站,可以試著打打看以下的網址。

https://[你的網域]/wp-json/wp/v2/posts

你會發現網路瀏覽器會使用 json 的格式把你網站的前 10 篇最新文章資料顯示出來,而如果你有學過 python 等程式語言,會發現這些資料,是使用多層的 dictionary 所包覆的,方便於我們的後續作業。

這裡給一個重要的觀念,「https://[你的網域]/wp-json/wp/v2/posts」整個就是 API 的 URL。觀察網址,可以發現這個 api url 是使用「{url}{api}{version}{endpoint}」這幾個元素組成的,互相對應到的東西是這樣子。

{url}:https://[你的網域]
{api}:wp-json
{version}:wp/v2
{endpoint}:posts

當中的「endpoint」是這裡的重點,要注意到隨著你要做的事情不同,endpoint 也要跟著改掉,而官方也有提供一份清單,告訴你在做什麼事情下你可以用哪些 endpoint 來去達成。

請參考:
1. Reference | REST API Handbook | WordPress Developer Resources

而以下的操作範例,會教你如何「發布新文章」以及「上傳圖片」,而其餘的功能就自己玩玩看囉。

說完之後,接著就開始教學該如何操作。

打開授權功能

雖然已經內建了 WP REST API,但是在透過 REST API 進行新建文章、上傳圖片、刪除文章等等所有動作時,都是需要有身份認證動作才能夠進行下去的。

認證身份的方式有三種,Cookie 認証、OAuth 認証和 Basic 認証。Cookie 認証是平常我們登入 WordPress 時就已經在用的方式,但如果寫成程式碼恐怕會變得很麻煩,這裡的話我推薦使用「OAuth 認証」的方式,但稍微複雜。不過我們沒有要用多久,如果是測試或開發階段,用 Basic 認証就足夠了,寫成程式碼也沒有很麻煩。

這裡要請你先安裝一個叫做「Application Passwords plugin」的外掛。

wp-rest-api-create-new-post-and-upload-image
作者ヤンヤン攝於 2018 / 08 / 9。
請參考:
1. Application Passwords | WordPress.org

當然也有其他外掛可以使用,例如「HTTP Basic Auth | WordPress.org」,你可以自己玩玩看。

如果你是採用 OAuth 認証的方式的話,可以考慮「JWT Authentication for WP REST API」或是「WP OAuth Server

安裝外掛我想就不用多說了,就是到安裝外掛的頁面搜尋並安裝即可。

安裝完「Application Passwords plugin」,接著要動手編輯「.htaccess」檔案。請務必在以下這一段之前

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

加入這一段。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
#or use this
#SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
</IfModule>

不然認證會無法成功。

wp-rest-api-create-new-post-and-upload-image
作者ヤンヤン攝於 2018 / 08 / 9。

之後我們要啟用我們剛剛安裝的「Application Passwords plugin」外掛。啟用完成之後,請到左側選單的「帳號」->「個人資訊」。

wp-rest-api-create-new-post-and-upload-image
作者ヤンヤン攝於 2018 / 08 / 9。

把畫面拉到最下面,會有一個「Application Passwords」的欄位,這裏請在「New Application Password Name」這個欄位裡面輸入任意的字串,方便你辨識待會兒產生的密碼是屬於哪一個。

wp-rest-api-create-new-post-and-upload-image
作者ヤンヤン攝於 2018 / 08 / 9。

然後他就會隨機產生一組固定密碼,讓我們可以做身份驗證用。

wp-rest-api-create-new-post-and-upload-image
作者ヤンヤン攝於 2018 / 08 / 9。

記得要先複製下來,複製下來之後按下「關閉」。

wp-rest-api-create-new-post-and-upload-image
作者ヤンヤン攝於 2018 / 08 / 9。

新建新文章

接著我們就要透過 Python 程式來進行測試了。我這裡推薦使用 Sumblime Text 來編輯程式碼,當然你有自己習慣使用的編輯器也是可以的。

然後請輸入以下程式碼,該要自己調整的部分自己調整。

「user_passwd」的部分,就是剛剛上面產生的密碼。

觀察程式碼的部分,這裡的 url 參數是直接打出「{url}{api}{version}{endpoint}」的格式,而另外有幾個詳細的參數,可以看到詳細的參數說明和正確寫法。

請參考:
1. Posts | REST API Handbook | WordPress Developer Resources

另外說明一個重要的參數,在「p_status = “publish”」的部分是讓文章直接進行發表,當然也能夠改成為「排程」、「草稿」等等的模式,詳細的也是在上面的網址當中去尋找看看。

這裡我建議使用 Python 3.5 或 3.6 來撰寫程式碼,存擋後就執行看看程式碼吧!你可以發現瞬間你的部落格就多了一篇文章,是不是很方便呢?當然你可以在這個程式碼的基礎之後進行修訂,做出你想要的功能。

wp-rest-api-create-new-post-and-upload-image
作者ヤンヤン攝於 2018 / 08 / 9。
wp-rest-api-create-new-post-and-upload-image
作者ヤンヤン攝於 2018 / 08 / 9。

如果想要知道並獲得網站回傳的資訊,請多打這些程式碼,方便你坐下一步的行動。

response = json.loads(r.content)

上傳圖片至 WordPress

如果是想要上傳圖片,請參考以下的程式碼嘗試看看吧。

而詳細的參數資訊,可以參考以下網址。

請參考:
1. Media | REST API Handbook | WordPress Developer Resources

這篇我用我的畢業證書來做測試。不過圖片上傳這個部分,我發覺速度沒有我想像中的快,有可能跟我測試的場地的網路訊號強度有關係。

wp-rest-api-create-new-post-and-upload-image
作者ヤンヤン攝於 2018 / 08 / 9。

為何會出現 rest 400 的訊息

如果你去印出 request 之後得到的訊息,明明沒有寫錯什麼參數,但是卻出現了 400 或 401 的錯誤時,基本上是授權出錯的問題,建議重新生產一組密碼在測試一次,或是檢查一下 .htaccess 的設定有沒有寫對。

參考資料:

endpoint 的說明
1. WP Rest API 入门详解 – 那时那你
2. 怎样用通俗的语言解释REST,以及RESTful? | 知乎
3. Posts API Reference | WP REST API v2 Documentation

REST API 的概念
4.  WordPress 學習筆記 : WordPress REST API (一) : Handbook
5. WordPress 中 Restful API  是什么? – WordPress Hi

認證方式說明
6. 認証 | WP REST API v2 Documentation

要更改 .htaccess 檔案設定
7. WP REST API v2を使ってみた – WEmoB

Wordpress REST API 2
8. python - Can't import requests_oauthlib - Stack Overflow
9. api - Base64 Authentication Python - Stack Overflow
10. Update post using json api v2 - WordPress Development Stack Exchange
11. Publish WordPress Post with Python Requests and REST API - Stack Overflow
12. MaTachi.github.io/post-to-a-wordpress-json-rest-api-from-python.md at master · matachi/MaTachi.github.io
13. Retrieving Post Data Using the WordPress API with Python Script - Machine Learning Applications
14. python wordpress api create post - Google 搜尋
15. python - How to send POST request? - Stack Overflow
16. Posts | REST API Handbook | WordPress Developer Resources
17. wordpress-api · PyPI
18. derwentx/wp-api-python: A Python wrapper for the WooCommerce API.
19. Publish WordPress Post with Python Requests and REST API - Stack Overflow
20. A Guide to the WordPress REST API | Toptal
21. Authentication | REST API Handbook | WordPress Developer Resources
22. WordPress Rest API 相對應頁面、路徑資料總整理|梅問題.教學網
23. wordpress 禁用REST API功能并移除wp-json链接_博客吧
24. A Beginners’s Guide to the WordPress REST API

關於 request module 使用
25. 开发接口 — Requests 2.18.1 文档

Python Request 模組的說明
26. Requests: 人間のためのHTTP — requests-docs-ja 1.0.4 documentation
27. Authentication — Requests 2.19.1 documentation

WP REST API 官方說明文件
28. wordpress-api · PyPI
29. wordpress-api · PyPI
30. Reference | REST API Handbook | WordPress Developer Resources
31. Users API Reference | WP REST API v2 Documentation

使用 Python 的案例
32. WordPress REST APIを使ってPython で新規投稿する方法
33. Python - pythonを使ってwordpressに記事を投稿したい(114131)|teratail
34. PythonでWordPressのRest APIを使って投稿する方法 - つくねノヲト

使用 php 的案例
35. WordPressでREST APIから投稿させる機能を作る - Capital P
36. 【WordPress】2018年版 管理画面以外から投稿する2つの方法 | WP REST API 編 | ITエンジニアラボ

使用 curl 指令和終端機的案例
37. WordPress REST APIで投稿の取得から新規投稿を行う | Tips Note by TAM

關於為何出現 REST 400 的錯誤訊息
38. Basic Authentication not working with WP REST APIv2 · Issue #35 · WP-API/Basic-Auth
39. Trying to create a post with basic authentication - status code 401 - rest_cannot_create · Issue #2935 · WP-API/WP-API
Authentication — Requests 2.19.1 documentation