2019年1月5日 星期六

在LINE Bot中使用Imgur作為圖檔保存位置

先前介紹過Imgur.com可做為開發人員的圖檔上傳位置之後,就有學員們敲碗,要我們具體DEMO一下如何把Chat bot用戶上傳的照片或圖檔存到Imgur.com中。

別急,我們這不就來了嗎?

回頭先討論一下這個需求的背景,過去我們曾介紹過,在開發LINE Bot時若要抓取用戶傳來的圖檔或是照片時,由於該圖檔其實是保存在LINE的伺服器中,且有七天的保存期限,因此若我們要永久保存該圖檔,或做一些加工處理,所採用的方法是,將該圖檔(的binary資料)從LINE取得後,在我們WebHook所在的IIS伺服器上,直接複製儲存一份,然後取得該實體檔案的相對路徑轉為網址。

一般來說這樣做具體可行,但如果考量的進階一點,可能會有一些需要注意的問題,舉例來說,IIS伺服器的硬碟空間如果不足,可能就會發生意外狀況。或是,該WebHook希望能夠支援HA(High Availability)做負載平衡時,也可能會發生問題。雖然,這都是系統架構比較大的時候,才會碰到的狀況,但也不可不重視。

此外,有些圖檔根本是我們的Chat bot在跟用戶對談的過程中動態產生的,產生完後就Push/Reply給用戶,用戶看完可能根本就不打算再看一次(例如即時產生的圖表、照片…等),這類的圖檔儲存在WebHook所在的伺服器根本浪費空間,還得定時去清理,非常不經濟。

那這樣,我們有沒有其他更好的方式處理?

其實,我們可以考慮把圖檔上傳(保存)到第三方的雲端空間,而Imgur.com正好就符合我們的需求。開發人員可以透過Imgur提供的API,把圖檔上傳到Imgur.com並取得該圖檔的URL,如此一來,我們連空間和位置都無須擔心。

具體Imgur API該怎麼使用呢? 這個部分讀者可以參考底下連結:

https://studyhost.blogspot.com/2018/12/imgurcom-api.html

在了解其API的使用方式之後,我們就來看如果要把LINE Bot從用戶收到的圖檔上傳到Imgur.com上,該怎麼做。

我們先看底下這個範例的執行結果:

你會發現最上面一開始用戶傳來一個圖檔,接著LINE Bot把該圖檔上傳到Imgur並取得URL後,將URL顯示給用戶(同時也再一次把該圖檔顯示出來)

看來很不錯,該展示的功能都出現了,怎麼實現呢? 首先,參考上面連結的貼文,你必須先申請好Imgur.com的Client ID與Secret。有了這兩個重要資訊之後,我們來看程式碼怎麼撰寫。整個範例我們放在底下GitHub位置:

https://github.com/isdaviddong/Linebot-Demo-UploadImage2imgur

我們來看主要的WebHook部分:

我們看到WebHook程式碼,一開始幾行只是抓取Web.Config中的資訊,其中包含了我們需要的Channel Access Token以及Imgur的Client ID與Secret。

接著,我們看到下圖的程式碼片段,這部分是WebHook中判斷用戶傳來的是一個圖檔時,所要進行的動作。先看下圖一的部分,主要的動作是透過Client ID與Secret建立出ImgurClient物件,我們待會要透過這個物件把圖檔上傳。

下圖標示二的地方則是透過我們的LineBotSDK取得用戶上傳來的圖檔Binary資料,並存入ByteArray物件中:

最後,上圖三的部分是透過Imgur.API提供的UploadImageStreamAsync(…)方法,把抓取到的Byte資料上傳到Imgur.com並在完成後取得其URL位置。

後面的程式碼也不複雜,下圖A的部分是建立一個TextMessage與ImgaeMsg物件,這兩個物件是要回傳給用戶的訊息,其中包含剛才我們上傳到Imgur.com的圖片的URL(image.Link),這部分我們用TextMessage(文字訊息)物件的方式顯示。而ImageMsg這個物件則是用來顯示該圖片:

接著放入上圖B所定義的Messages集合物件,然後透過ReplyMessage(…)方法回覆(Reply)給用戶,就大功告成啦。

我們再看一次,執行的結果如下:

其實程式碼相當簡單不複雜,有興趣的開發人員可以參考Github上的範例實際製作一次。

--------------------------------------------
線上課程:https://www.udemy.com/line-bot/
電子書:https://www.pubu.com.tw/ebook/103305
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

2019年1月4日 星期五

微軟認知服務(Cognitive Services)中的QnA Maker 系列文 x 6

QnA Maker是MS Cognitive Services中一項頗實用的服務,過去一年,我們碰到很多客戶想要實現Q/A類型的Chat Bot,在企業內(B2E),或是面對消費者(B2C)。在早期,企業其實已經累積很多這種QA的Knowledge Base(可能是Excel sheet, 可能是DB…etc),是否有方法讓這些Q/A直接變成Chat bot的知識庫,讓chat bot稍微有點AI樣子的回覆客戶呢?

QnA Maker是這個需求的最迅速解決方案…而且支援中文。

底下是我整理好的四篇介紹,應該相當完整了,希望有所幫助。

微軟認知服務中的QnA Maker– (1) 什麼是QnA Maker?
微軟認知服務中的QnA Maker– (2) 建立QnA Maker服務
微軟認知服務中的QnA Maker– (3) 測試與訓練
微軟認知服務中的QnA Maker– (4) 與LINE Bot整合

相關文章

為QnA Service的Knowledge Base加上共同管理者
建立QnA Maker時的小陷阱

--------------------------------------------
線上課程:https://www.udemy.com/line-bot/
電子書:https://www.pubu.com.tw/ebook/103305
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

2019年1月3日 星期四

微軟認知服務中的QnA Maker– (4) 與LINE Bot整合

好,接續著前面的介紹,在我們看過了如何從外部工具postman來呼叫QnA Maker之後,接著我們來看,當我們建立知識庫(KB)並訓練好QnA Services之後,要如何與我們的Line bot整合呢?

建議LINE Bot的開發人員可以直接透過我們寫好的範例程式碼來進行,您可以用我們先前在介紹過的方式,使用現成的StudyHost.Example.Linebot套件。

您只需樣建立一個空專案(建議採用.net framework 4.6.1):

記得請務必勾選Web Form與WebAPI,專案建立完成後再透過Nuget安裝StudyHost.Example.Linebot套件:

安裝完成後,你會發現專案中有一個TestQnAController.cs,這個WebHook是我們寫好的範本,你只需要把其中的一些參數置換掉即可:

分別是:

channelAccessToken : 就是你Line bot的channelAccessToken

AdminUserId : 你Line bot的管理者UserId(傳送錯誤訊息用)

QnAEndpoint : 這個參數很重要,必須填寫完整的Endpoint,例如像是這樣 https://xxxxxxx.azurewebsites.net/qnamaker/knowledgebases/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/generateAnswer

QnAKey : 你正式使用QnA Maker的Key

UnknowAnswer : 當找不到符合問題時,預設回答。

當你都設定好了之後,可以透過ngrok或發佈到Azure WebSite上測試,記得要將Line bot的WebHook設定為:

https://你的domain/api/TestQnA

這是因為我們範例中的WebHook的Route是TestQnA:

設定完成之後,你就可以嘗試一下了:

你會發現,你的WebHook的行為已經變成,當用戶傳遞訊息給LINE Bot時,LINE Bott果然會把訊息傳遞給QnA Service並抓取到回答。

而如果QnA Service沒有適合的答案則會出現:

這也是我們設定在UnknowAnswer參數中的預設回答。

接著我們來看一下程式碼,LINE Bot具體到底是怎麼與QnA Service整合的。

套件程式碼說明

你會發現,其實程式碼非常簡單,下圖A的地方我們先判斷用戶輸入的是否為文字(也就是收到的是否為text message),如果是,我們丟給isRock.MsQnMaker.Client這個物件幫我們向QnA Maker詢問答案(該物件中的程式碼會自動幫我們以http post方式去呼叫服務):

39行透過GetResponse(…)這個方法,將用戶輸入的問題(LineEvent.message.text),傳給QnA Service,並且取回答案,要注意的是,前面我們說過,取回的答案可能不只一組,所以40-43行我們透過score(分數)排序,只抓取最高的那一個。

45行是先把要回覆的答案設定為預設回答,如果QnA Maker沒有抓取到答案,我們就會用這個預設答案回傳。

46行判斷如果QnA Maker有抓取到答案,我們就採用QnA Maker的答案,最後透過49行的ReplyMessage回傳,如此就大功告成囉。

直接透過.net API呼叫QnA Maker服務

當然,除了使用我們開發的套件,你也可以直接透過.net 程式碼來呼叫,最簡單的方式就是WebClient物件。

上面這段程式碼透過WebClient,把要問的問題組成JSON型式,以UploadData的方式(其實就是http post)丟給Endpoint,取回結果(JSON)後再透過Newtonsoft反序列化成物件,就可以在程式碼當中使用囉。

至於反序列化時候所需要的物件類別定義,可以參考底下位置:

https://gist.github.com/isdaviddong/6c32ea2f06c60891879c6e953eb61a5b

好啦,看到這邊,你已經會建立QnA Maker並且透過程式碼呼叫它,要撰寫一隻支援Q/A的LINE Bot大概也不是問題囉,這個系列先介紹到這邊,後面我們會再介紹一些具體應用上的範例。

--------------------------------------------
本系列索引: https://studyhost.blogspot.com/2019/01/cognitive-servicesqna-maker-x-4.html
線上課程:https://www.udemy.com/line-bot/
電子書:https://www.pubu.com.tw/ebook/103305
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

微軟認知服務中的QnA Maker– (3) 測試與訓練

接續著前面的介紹。

當我們建立好了QnA Maker的KB(Knowledge Base),並且裡面已經有了一些Q/A資料之後,我們接著可以在QnA Maker的後台進行測試,藉此觀察系統的回答準確率,並且嘗試修正。

要進行測試,你可以點選KB右上角的Test按鈕:

系統將會出現測試視窗,你可以在該視窗中輸入問題,系統會顯示找出的答案。你會發現,你的問題不盡然要和原本KB中的Question字句100%完全一樣,差幾個字其實沒有關係,QnA Service依舊會幫你找到最接近的問題,並且取得該問題相對應的答案顯示。

如果你覺得系統自動搜尋的結果不理想,你可以按下『Inspect』來檢查其他第二、三順位的答案,如果有必要時,可以手動調整:

如果QnA Maker的回答和你的預期不同,你可以選取原本排在第二順位的答案作為回答,或是手動輸入其他更理想的答案。你會發現在答案底下其實都有confidence score,這個分數是QnA Service自動判斷出的可信度,透過你手動的調整,也會影響這個數值得高低。

事實上,你在這個畫面上的測試與糾正的整個過程,就是我們訓練Q/A Service的主要步驟。

別忘了,只要有修改到答案或是有新的Q/A Pair加入,你都要重新按下『Save and train』這顆按鈕,讓系統重整一下索引並且重新訓練,待你覺得QnA Maker的回答你大致都滿意之後,就可以開始撰寫程式碼,正式與你的chat bot連結了。

使用建立好的服務

當我們建立好KB之後,若要從外部(當然也包含我們的LINE Bot)來呼叫,該KB必須先Publish,你可以從管理畫面中,找到Publish按鈕,將其發佈出去即可:

發佈後,你會看到類似底下這樣的http post sample code:

我們的Line bot就可以透過上面這樣的http post呼叫,把從LINE傳來的問題,丟給QnA Service並取得答案。

上圖中的A是KB的guid,而B則是我們呼叫該服務的key。

請注意這個Key,在正式環境中,你應該要使用先前我們從Azure Portal申請到的key。

我們來看一下如何呼叫此API。

我們可以透過坊間常用的工具Postman來測試:

上圖A的部分是完整的endpoint,其中包含了這個KB的Guid,而呼叫時的http header,必須包含Authorization資訊,因此你看到了上圖B中的參數EndpointKey xxxxxxxxxxxxxxxxxxx就是這個驗證資訊。其中的Key,你必須換成先前在Azure上申請到的正式的Key。

此外,我們要把需要詢問的問題,組成JSON字串,在呼叫上述的http endpoint時以JSON Body的方式傳遞給它,結構很簡單,例如:

{"question":"如果有使用上的問題,該怎麼辦"}

OK,完整的呼叫內容是:

POST /qnamaker/knowledgebases/Guid/generateAnswer HTTP/1.1

Host: forbotdesigner.azurewebsites.net

Authorization: EndpointKey Key

Content-Type: application/json

Cache-Control: no-cache

{"question":"如果有使用上的問題,該怎麼辦"}

我們用postman測試,呼叫後,我們會得到類似底下這樣的結果:

請留意,你會發現這組JSON的最外層是answers陣列,這表示,其實當我們把問題拋給QnA Maker,它找到的答案很可能不只一組,而是多組。但每一組都會有score供你判斷評估的準確度。

你會發現QnA Maker把回答以JSON的方式回傳,其中包含了原始的問題(questions)、找到的答案(answer),以及該答案的評分(score)…等資訊。

如此一來,我們就可以透過http post的方式,與QnA Maker互動,詢問問題並取得需要的答案。

先介紹到這邊,下一篇,我們來看如何讓QnA Maker與我們的LINE Bot結合…

--------------------------------------------
本系列索引: https://studyhost.blogspot.com/2019/01/cognitive-servicesqna-maker-x-4.html
線上課程:https://www.udemy.com/line-bot/
電子書:https://www.pubu.com.tw/ebook/103305
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

微軟認知服務中的QnA Maker– (2) 建立QnA Maker服務

QnA Maker是微軟Cognitive Services中的一環,你可以從底下這個獨立的網址進入,大部分建立和管理knowledge base的功能也都在這裡。

https://www.qnamaker.ai/

但是具體要使用該服務前,你還是得要具有Azure帳號,和先前介紹過的LUIS一樣,你必須在Azure Portal先建立好使用QnA Maker時所需要的Key,建立的方式如下。

請透過https://portal.azure.com/ 進入Azure管理站台,在建立資源時,請搜尋QnA Maker即可找到要建立的服務:

建立時,請注意底下的畫面:

上圖中A與D的部分,建議你可以用同樣的名字,因為建立一組QnA Maker服務,Azure portal將會自動為你產生三個資源,分別是index服務、App Web Site、以及QnA Maker本體。

上圖D的部分,就是App Web Site這個網站的名稱。

會要您特別留意,是因為雖然QnA Maker在建立時你可以選擇F0免費方案,該方案讓你可以在每秒三次呼叫以內免費使用,聽起來很不錯,但你別忘了,其實在建立的同時,Azure還同時建立了Search服務以及Web App,特別是Web App在預設的狀況下是個S1等級的標準網站,每個月將會有幾千元台幣的費用。因此,請在建立好之後,自行找到該網站,調整資源大小,以避免被收取較高費用(當然,如果你需要大量使用,對效能來說恐怕S1是比較好的選擇)。

相關的調整辦法可以參考底下連結:

https://studyhost.blogspot.com/2018/07/qna-maker.html

順利的建立好了QnA Maker服務之後,你可以在該服務的Keys選項下找到你所需要的Key:

有了這組Key之後,我們就可以正式的使用該服務了。

建立知識庫

接著,我們回到https://www.qnamaker.ai 這個Portal,在主畫面中你會看到Create a knowledge base的選項:

點選後,系統會引導你透過五個步驟來建立KB。

你會發現,第一個步驟其實就是要你去Azure站台建立QnA Service,而這我們剛才也已經做了,所以只需要在步驟二,選擇你的Azure目錄、訂閱名稱、以及QnA 服務名稱就行了。

而步驟三,也只是要你輸入想建立的KB的名稱,自己取一個方便識別的名稱就好:


接著『步驟四』比較重要,其實也是唯一一個你需要留意的步驟:

由於QnA Maker會幫我們自動建立一個KB,所以,你可以上傳一個包含 Q/A的Excel檔案(上圖B),或是在上圖A的位置提供一個包含Q/A的網頁連結,QnA Maker會自動分析你的提供的檔案或網址,產生出基本的Q and A知識庫。

至於C的部分,是問你要不要幫你自動添加『閒聊』Q/A問答,諸如基本的問候或是些有的沒的的對話,但由於這功能目前只支援英文,因此我們選擇None跳過。

填妥KB的名稱與Q/A來源,最後按下『Create your KB』鈕即可。

QnA Maker會需要一點時間來產生資料庫:

下圖是我們透過QnA Maker建立好的KB部分內容:

而這些資料的來源其實是一個網頁:

QnA Maker會自動分析上面這樣的網頁(或是你上傳的word/pdf均可),在文件中找出QA之後自動產生KB。如果你還想要添加什麼額外的Q/A,可以點選KB紹面的『Add QnA pair』手動加入:

你只需要在上面輸入好Question與Answer欄位中的資料即可。

別忘了若對KB有任何的異動,最後都要按下右上角的『Save and train』鈕:

按下去後需要一點時間,系統會自動索引並訓練,完成候你就可以測試了。

下一篇,我們來看如何測試與訓練QnA Maker…

--------------------------------------------
本系列索引: https://studyhost.blogspot.com/2019/01/cognitive-servicesqna-maker-x-4.html
線上課程:https://www.udemy.com/line-bot/
電子書:https://www.pubu.com.tw/ebook/103305
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

微軟認知服務中的QnA Maker– (1) 什麼是QnA Maker?

前面我們介紹過了LUIS,你大概差不多也慢慢知道了Chat bot要跟人類對談在開發時是有一定難度的。然而,我們大部分時候,也並非真的要讓chat bot和人1 on 1的對談,更多時候我們只是要讓chat bot回答一些知識庫中存在的問題而已。

這個時候,你其實有另外一個選擇,就是我們接著要介紹的QnA Maker 服務,它值得一提的地方是,你可以透過該服務,以REST API的形式,輸入特定的問題,它會自動從知識庫裡面找到最符合的答案。你不需要管intent或entities,只需要匯入Q/A問題來建立知識庫就可以了。

在你開始建立QnA Maker服務前,請先花一點點時間來了解該服務背後的機制。這有助於你在使用該服務時,得以用最經濟(便宜)的方式來運作,同時達成最好的呈現效果。

首先,你還記得底下這張圖嗎?

如果你還有印象,這是我們在前面介紹WebHook的時候談過,你應該也已經知道我們負責回應Chat bot的WebHook就是上圖中的asp.net WebAPI的部分。

好,確定了這個概念之後,我們來看,如果要設計一個chat bot,回覆用戶傳來的各種問題,顯然我們必須把相關的程式碼撰寫在WebAPI(WebHook)那部分。例如,當用戶傳來某個問題,我們就去資料庫中找該問題所對應的答案,找到了,就以ReplyAPI回覆給用戶即可,這意味著,我們應該會需要建立一個類似底下這樣的資料表:

當你有了一個類似上面這樣的資料表之後,用戶輸入了某個問題,你就可以透過SQL去資料庫中搜尋是否有該問題,如果有,則取出答案回覆,聽起來很簡單,但…你會開始碰到幾個狀況…

首先,用戶輸入的問題不可能100%完全一樣,那怎麼找出句子中的關鍵字呢? 又要用LUIS來處理斷句和語意嗎?

其次,當資料庫越來越大時,搜尋的速度就會開始明顯的降低,這時候該怎麼透過索引機制來加快搜尋速度呢?

好, QnA Maker就是這些問題的解答。

QnA Maker的功能

QnA Maker可以透過匯入Excel/Word或是爬網頁抓取資料的方式,自動在雲端建立一分Q & A知識庫(因此我們也不需要自己建立資料庫了),有了這個知識庫之後,我們的WebHook就可以利用REST API呼叫的方式,把用戶傳來的問題丟給該服務,該服務就會以JSON方式回傳最佳的答案回來。

例如,底下這是一個校務資訊的例子,當我們在QnA Maker的管理後台,建立了底下這幾個Q/A之後:

若你問chat bot相關的問題,你會發現chat bot就開始懂得該如回答,底下是QnA Maker 的測試畫面。當我們問系統:

請注意有趣的地方是,用戶輸入的文字可以和資料庫中的Question不完全一樣,QnA Maker會自己透過index/search機制,找到最符合的問句,並且取得該問句的預設答案來回答。

更重要的是,這整個動作可以讓我們透過程式碼,以類似底下這樣的http post方式來呼叫:

這表示,我們在WebHook中,就可以直接以上面這樣的http post方式來呼叫並串接QnA Maker,如此一來,我們就可以透過該服務,輕易地完成一個Q/A LINE Bot了。

知道了概念之後,下一篇,我們來看如何建立QnA Maker。

--------------------------------------------
本系列索引: https://studyhost.blogspot.com/2019/01/cognitive-servicesqna-maker-x-4.html
線上課程:https://www.udemy.com/line-bot/
電子書:https://www.pubu.com.tw/ebook/103305
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

2018年12月27日 星期四

使用 imgur.com API 作為應用程式上傳檔案的圖床

不知道你有沒有用過Hackmd.io這個網站中一個我覺得很讚的功能?

Hackmd.io是一個共筆的網站,你可以在瀏覽器上以markdown格式編輯文件,其中有一個挺神奇的功能,你可以透過Ctrl+v直接把剪貼簿中的圖片以貼上的方式貼入文件中,這個貼上的動作會自動變成上傳檔案,並且在上傳完成之後得到一個該圖檔的url,整個操作像是底下這樣:

好,其實要實現這個功能不難,只要你javascript夠熟,這個動作也不過是把前端的圖檔往後端傳,然後後端接收到之後,上傳到某個位置(而這某個位置就是Imgur.com),取得該圖檔的url之後,update前端的html,就可以顯示出來了。(當然如果你願意的話,也可以整段都用js在前端完成)

但讓我好奇的是,這個imgur網站有支援開發人員免費當作圖床用嗎?

一查之下,還真的有,且API和套件都非常齊全,只要你是非商業使用,是完全免費的。即使是商業使用,也有一定額度的免費。這讓我挺訝異的,訝異的部分是我以前怎麼會錯過這個網站?

為什麼我們需要把上傳的檔案放到特定的blob或圖床上呢? 因為在雲端的時代,上傳的檔案放到Web Server上會造成系統無法實現HA,Scaling會受到限制,而放在資料庫中當然太奢侈,所以一個好的大檔案儲存位置,是開發應用程式必須的。

過去我都是用azure blob當作應用程式的上傳圖片存放位置,雖然也算是便宜,但免費的imgur還是頗吸引人,特別是在我們開發的服務並沒有收錢的時候(像是Chat bot、Demo範例…等)。

要怎麼把圖片上傳到imgur上並取得該圖片的URL呢?

程式碼超簡單:

上面這段程式碼使用到了Imgur.API這個nuget套件:

另外程式碼中的CLIENT_ID和CLIENT_SECRET當然要申請,申請的步驟也很容易,請先註冊成為imgur的會員,然後到底下這個頁面申請一個App:

https://api.imgur.com/oauth2/addclient

由於我們只是很簡單的上傳圖片取得URL,且使用的是Server Site的Code,所以我們不需要 callback URL,簡單的選擇第二項即可:

申請完之後你會得到像是底下這樣的資訊:

其中就有我們程式碼中需要的 Client ID與Secret。
(順帶一提,又一次使用OAuth的場合,如果你對OAuth不熟,可以參考一次搞懂OAuth與SSO在幹什麼?)。

OK,取得ID和Secret之後,透過上面這段C#程式碼,你可以超簡單的把圖檔上傳到imgur圖床上,並取得該圖片唯一的URL。

關於Imgur.API這個nuget套件的資訊可以參考這邊: https://imgurapi.readthedocs.io/en/latest/

至於Imgur這個網站本身的API可以參考: https://apidocs.imgur.com/

Related Posts Plugin for WordPress, Blogger...

熱門文章