我常常會使用 unsplash, 這裏面的圖片很是清爽,個人大多數文章的圖片都是在這個網上找的,雖然也有同類型網站,可是用過一段時間之後基本都放棄了,圖片質量良莠不齊,篩選過程太費勁。css
可是 unsplash 訪問速度是個大問題,我常常會由於圖片沒法加載而被勸退。html
今天一時手癢,順手搜了 unsplash api 這個關鍵字,看官方有沒有提供相關的 api 服務,還真有!前端
unsplash 提供了 2 個版本的 API。 一個是簡單版,主要是給小型應用,流量比較少的 app 使用,能夠經過 source.unsplash.com 進入;一個是進階版的開發者中心 API, 支持更多流量的 app 使用,能夠經過 unsplash.com/developers 進入。git
source api 提供的功能比較簡單。若是想獲取一張隨機圖片,能夠訪問地址:github
https://source.unsplash.com/random
這個地址會重定向到一張圖片的地址,能夠經過響應直接獲取到一張圖片。web
若是圖片太大,加載速度也會比較慢。你能夠在 url 後面添加尺寸,控制返回的圖片大小:json
https://source.unsplash.com/random/800x600
若是原圖片不是這種長寬比,unsplash 會對圖片進行裁剪,某些部分就會丟失。若是你想保持圖片的原始比例,能夠把高度設成 0 :flask
https://source.unsplash.com/random/800x0
小提示api
不管是什麼 API, 你均可以在最後使用 /800x0 這樣的方式控制圖片的大小。markdown
你能夠指定獲取某位做者的圖片。好比我特別喜歡 Raamin ka 拍攝的照片。
我能夠把它的用戶名小寫之後再去掉空格,添加到 /user 的後面:
https://source.unsplash.com/user/raaminka
這樣我就能獲取到這位做者拍攝的隨機妹子照片了。不要忘了,你一樣是能夠控制圖片尺寸的。
獲取某個用戶喜歡的照片:
https://source.unsplash.com/user/raaminka/like
unsplash api 還支持搜索。一般來講,我都會根據要寫的文章的主題在 unsplash 上搜索圖片。好比我要寫一篇關於加密的文章,那我就會去搜索 encryption 相關的圖片:
https://source.unsplash.com/800x0/?encryption
你也能夠組合多個不一樣的關鍵字。若是沒有圖片同時包含這些關鍵字,則會優先匹配最後的關鍵字。
https://source.unsplash.com/800x0/?encryption,girl
如今咱們每次訪問同一個 API, 獲得圖片都不同,由於是隨機生成的。可是若是咱們在每一個 API 的後面添加 /daily 或者 /weekly, 則能夠獲得固定的一張圖。須要注意,這並非說這些圖片更加熱門或者質量更高,只是天天/每週保持不變的隨機圖片而已。
https://source.unsplash.com/800x0/daily?sports
source api 的功能有限,並且若是訪問頻率太快老是會返回相同的圖片。如今咱們來看一下更加專業的開發者 API。
開發者 API 不是立刻就可使用的。你須要先註冊成爲開發者,獲得一個 access token, 以後你能夠經過這個 token 訪問 API:
https://api.unsplash.com/photos?client_id=fowflsfg
這個 API 還支持 3 個參數
param | Description |
---|---|
page |
第幾頁 |
per_page |
每頁的圖片數量 |
order_by |
排序 (能夠是: latest , oldest , popular ; 默認是: latest ) |
其餘的 api 文檔你均可以在官網上查看到,這裏不復制粘貼了。developer api 相比 resource api 的好處在於他能夠同時提供多張圖片,同時能獲取到豐富的信息,好比做者,日期,大小等等。
在 unsplash 的主頁只能看到編輯推薦的圖片。沒有最新的和流行的能夠看,因此我寫了個簡陋的外殼查看最新和流行的圖片。
首先定義一個函數獲取圖片:
def get_photos(order_by='popular', page=1, per_page=50):
"""經過developer api 獲取圖片。"""
session = requests.Session()
url = 'https://api.unsplash.com/photos'
params = {
"client_id": "your access token",
"order_by": order_by,
"page": page,
"per_page": per_page
}
resp = session.get(url, params=params).json()
return resp
這樣我能夠獲得 50 張圖的 url 地址。
image.png
接下來使用 flask 搭建一個簡易服務:
app = Flask(__name__)
@app.route('/')
def index():
pictures = get_photos()
return render_template('index.html', pictures=pictures)
if __name__ == '__main__':
app.run()
直接把圖片地址返回給前端頁面:
{% for pic in pictures %}
<a href="{{ pic.urls.regular }}">
<img src="{{ pic.urls.small }}">
</a>
{% endfor %}
這樣我經過訪問本地的 http://localhost:5000 就能夠看到不少的圖片。我沒有對圖片展現效果進行任何的美化,這種凌亂的風格其實也挺好看的。後面若是用得多我在用 css 框架去作一下頁面佈局。
當我點擊一張圖片時,則能夠進入這張圖片的大圖地址,而且能夠直接做爲連接地址應用到 markdown 當中,而在 unsplash 官方網站上不能直接獲取連接地址。
最後補充一點。這個小應用只是做爲 unsplash 網站訪問很是慢的時候一個備選,並不能真正代替官網。對於圖片的篩選和分類搜索操做,官網提供了很是人性化的操做,我就不重複造輪子了。對於這個備選服務,我把他設成了命令行形式,只須要在命令行輸入 unsplash 就能夠啓動網站,還算比較方便。
點擊 閱讀原文 獲取完整代碼。