Hexo+Next+阿里云OSS實(shí)現(xiàn)相冊(cè)功能

本文主要內(nèi)容是利用阿里云對(duì)象存儲(chǔ)OSS做圖床七婴,實(shí)現(xiàn)Hexo下Next主題的相冊(cè)功能打厘,本文首發(fā)于筆者博客

相冊(cè)

前言

由于Next主題本身是沒(méi)有實(shí)現(xiàn)相冊(cè)的杭棵,所以相冊(cè)功能需要手動(dòng)添加婚惫,主要的內(nèi)容是需要做一個(gè)圖床氛赐,然后將本地圖片上傳至圖床,在打開(kāi)博客的時(shí)候從圖床上請(qǐng)求并加載圖片先舷。

最終效果參見(jiàn)我的相冊(cè)艰管。

解決方案對(duì)比

可用的解決方案

  • Github的一個(gè)倉(cāng)庫(kù)做圖床

  • 七牛云做圖床

  • 阿里云OSS做圖床

Github

利用Github倉(cāng)庫(kù)做圖床是一個(gè)最常用的解決方案,但是有很多限制蒋川,比如存儲(chǔ)空間只有1GB牲芋,并且還會(huì)受到流量的限制捺球,當(dāng)圖片越來(lái)越多或者圖片很大的時(shí)候Github就不太適用了缸浦。

七牛云

七牛云確實(shí)是一個(gè)很好的解決方案,注冊(cè)賬號(hào)并實(shí)名認(rèn)證之后會(huì)有10GB永久存儲(chǔ)空間氮兵,10GB/月 HTTP國(guó)內(nèi)流量裂逐,10GB/月 HTTP海外流量,但是七牛云會(huì)強(qiáng)制實(shí)名認(rèn)證泣栈,并且需要上傳手持身份證正面和反面的兩張照片卜高,所以這也是我沒(méi)有用七牛云的原因,當(dāng)然不在意的朋友可以忽略南片。

阿里云OSS

阿里云OSS掺涛,即阿里云對(duì)象存儲(chǔ),速度疼进、安全這些便不用說(shuō)了薪缆,收費(fèi)方式比較復(fù)雜,最簡(jiǎn)單的方法是購(gòu)買(mǎi)一個(gè)40GB的存儲(chǔ)寶即可伞广,一年9元錢(qián)拣帽,流量和請(qǐng)求使用默認(rèn)的按量計(jì)費(fèi)即可,流量費(fèi)用00:00-08:00(閑時(shí)):0.25元/GB赔癌,8:00-24:00(忙時(shí)):0.50元/GB诞外,請(qǐng)求費(fèi)用0.01元/萬(wàn)次澜沟,顯然灾票,個(gè)人博客能達(dá)到GB流量/小時(shí)、萬(wàn)次訪問(wèn)的博主完全不會(huì)在乎這些費(fèi)用了茫虽,未達(dá)到的個(gè)人博客收費(fèi)不出意外的話應(yīng)該每小時(shí)為0.00元刊苍,如下圖所示:

消費(fèi)明細(xì)

綜上,我選擇阿里云OSS濒析。

創(chuàng)建阿里云OSS存儲(chǔ)空間

創(chuàng)建

創(chuàng)建阿里云<i class="fa fa-arrow-right">賬號(hào)開(kāi)通阿里云OSS服務(wù)<i class="fa fa-arrow-right">購(gòu)買(mǎi)一個(gè)40GB的存儲(chǔ)資源包<i class="fa fa-arrow-right">創(chuàng)建儲(chǔ)存空間

創(chuàng)建的時(shí)候?qū)⒋鎯?chǔ)空間的讀寫(xiě)權(quán)限設(shè)置為公共讀正什。

獲取阿里云OSS的EndPoint和外網(wǎng)訪問(wèn)域名

進(jìn)入創(chuàng)建好的存儲(chǔ)空間的管理頁(yè)面,找到EndPoint和外網(wǎng)訪問(wèn)域名号杏。

EndPoint和外網(wǎng)訪問(wèn)域名

獲取阿里云OSS的Access Key

點(diǎn)擊阿里云OSS控制臺(tái)頁(yè)面右邊的Access Key按鈕婴氮,進(jìn)入該頁(yè)面創(chuàng)建Access Key斯棒。

Access Key

安裝OSS客戶端

進(jìn)入阿里云OSS控制臺(tái)頁(yè)面,在該頁(yè)面的右上角點(diǎn)擊更多主经,再點(diǎn)擊OSS客戶端下載進(jìn)行安裝荣暮。

安裝后使用 上一步獲取的AccessKeyId、 AccessKeySecret登錄客戶端罩驻,進(jìn)入已經(jīng)創(chuàng)建好的Bucket穗酥,創(chuàng)建兩個(gè)文件夾,分別為photosmin_photos惠遏。

安裝OSS的Python SDK

該SDK的運(yùn)行環(huán)境為Python 2.6砾跃,2.7,3.3节吮,3.4抽高,3.5,并需要用到pip命令進(jìn)行安裝透绩,未滿足運(yùn)行環(huán)境請(qǐng)移步百度自行搜索安裝厨内。

使用如下命令安裝SDK:

pip install oss2

構(gòu)建相冊(cè)頁(yè)面

注:本文將使用blog代替博客根目錄

創(chuàng)建頁(yè)面

使用如下命令在blog目錄下創(chuàng)建photo頁(yè)面

hexo new page photos

在主題的配置文件_config.yml中的menu選項(xiàng)下添加Photos

menu:
  home: / || home
  categories: /categories/ || th
  archives: /archives/ || archive
  about: /about/ || user
  tags: /tags/ || tags
+ Photos: /photos/ || photo
  #schedule: /schedule/ || calendar
  #sitemap: /sitemap.xml || sitemap
  #commonweal: /404/ || heartbeat

進(jìn)入blog/source/photos目錄,修改index.md文件渺贤,并將位于第14行https://YourDomainName.com改為你的博客的地址

---
title: Photos
date: 2018-04-29 00:47:21
type: "photos"
comments: false
---
<link rel="stylesheet" href="../lib/album/ins.css">
<link rel="stylesheet" href="../lib/album/photoswipe.css"> 
<link rel="stylesheet" href="../lib/album/default-skin/default-skin.css"> 
<div class="photos-btn-wrap">
    <a class="photos-btn active" href="javascript:void(0)">Photos</a>
</div>
<div class="instagram itemscope">
    <a  target="_blank" class="open-ins">圖片正在加載中…</a>
</div>

<script>
  (function() {
    var loadScript = function(path) {
      var $script = document.createElement('script')
      document.getElementsByTagName('body')[0].appendChild($script)
      $script.setAttribute('src', path)
    }
    setTimeout(function() {
        loadScript('../lib/album/ins.js')
    }, 0)
  })()
</script>

添加插件

進(jìn)入blog/themes/next/source/lib雏胃,創(chuàng)建文件夾album,然后將這個(gè)Github倉(cāng)庫(kù)中的assets文件夾志鞍、default-skin文件夾瞭亮、data.json文件、ins.css文件固棚、ins.js文件统翩、photoswipe.css文件下載下來(lái)放到新建的album文件夾內(nèi),將該倉(cāng)庫(kù)中的photoswips.js文件此洲、photoswipe-ui-default.js文件放到blog/themes/next/source/js/src內(nèi)厂汗。

打開(kāi)ins.js文件,定位到大約121呜师、122行娶桦,如下:

var minSrc = 'https://yourBucketName.oss-cn-shenzhen.aliyuncs.com/min_photos/' + data.link[i];
var src = 'https://yourBucketName.oss-cn-shenzhen.aliyuncs.com/photos/' + data.link[i];

yourBucketName.oss-cn-shenzhen.aliyuncs.com替換為你的阿里云OSS外網(wǎng)訪問(wèn)域名。

配置插件

進(jìn)入blog/themes/next/layout,在_layout.swig文件的</head>標(biāo)簽前加入如下引用:

<script src="{{ url_for(theme.js) }}/src/photoswipe.js?v={{ theme.version }}"></script>
<script src="{{ url_for(theme.js) }}/src/photoswipe-ui-default.js?v={{ theme.version }}"></script>

<body>標(biāo)簽下添加如下代碼:

{% if page.type === "photos" %}
  <!-- Root element of PhotoSwipe. Must have class pswp. -->
  <div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
    <div class="pswp__bg"></div>
    <div class="pswp__scroll-wrap">
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>
        <div class="pswp__ui pswp__ui--hidden">
            <div class="pswp__top-bar">
                <div class="pswp__counter"></div>
                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
                <button class="pswp__button pswp__button--share" title="Share"></button>
                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                      <div class="pswp__preloader__cut">
                        <div class="pswp__preloader__donut"></div>
                      </div>
                    </div>
                </div>
            </div>
            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div> 
            </div>
            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>
            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>
            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>
        </div>
    </div>
  </div>
{% endif %}

進(jìn)入blog/themes/next/layout/_scripts/pages文件夾汁汗,在post-details.swig中添加如下引用:

<script src="{{ url_for(theme.js) }}/src/photoswipe.js?v={{ theme.version }}"></script>
<script src="{{ url_for(theme.js) }}/src/photoswipe-ui-default.js?v={{ theme.version }}"></script>

圖片處理與上傳

下載配置腳本

下載這個(gè)Github倉(cāng)庫(kù)衷畦,然后在該倉(cāng)庫(kù)的文件夾內(nèi)創(chuàng)建兩個(gè)文件夾,分別為photosmin_photos知牌,然后修改tool.py文件:

def handle_photo():
    '''
    更新json文件
    
    '''
    endpoint = 'http://oss-cn-shenzhen.aliyuncs.com'
    auth = oss2.Auth('YourAccessKeyId', 'YourAccessKeySecret')
    bucket = oss2.Bucket(auth, endpoint, 'YourBucketName')
    file_list = []
    objs=islice(oss2.ObjectIterator(bucket,prefix='photos/20',delimiter=''),None)
def aliyun_operation(flag):
    '''
    上傳圖片
    '''
    endpoint = 'http://oss-cn-shenzhen.aliyuncs.com'
    auth = oss2.Auth('YourAccessKeyId', 'YourAccessKeySecret')
    bucket = oss2.Bucket(auth, endpoint, 'YourBucketName')

endpoint祈争、authbucket分別替換為你的阿里云OSS的EndPoint角寸,Access Key和BucketName菩混。

'''大約在130行'''

list_info.reverse()  # 翻轉(zhuǎn)
tmp = bubbleYear(list_info)
bubble(tmp)
final_dict = {"list": list_info}
with open("../blog/themes/next/source/lib/album/data.json","w") as fp:
    json.dump(final_dict, fp)

將上述代碼中的blog替換為你的博客根目錄的名字忿墅。

使用腳本

將需要上傳到博客相冊(cè)的圖片重命名為2018-5-1_圖片的描述.jpg形式,日期年月日之間為-沮峡,日期與圖片描述之間為_球匕,然后將圖片移動(dòng)到剛才創(chuàng)建的photos文件夾下,然后使用如下命令進(jìn)行圖片裁剪并上傳到阿里云OSS上帖烘。

python tool.py

執(zhí)行腳本可能遇到的問(wèn)題:

  • No module named 'PIL'

    解決辦法:執(zhí)行pip install Pillow

結(jié)語(yǔ)

感謝各位的閱讀亮曹。

參考文章

  1. http://www.biueo.com/2018/02/17/hexo%E7%9A%84Next%E4%B8%BB%E9%A2%98%E6%B7%BB%E5%8A%A0%E7%9B%B8%E5%86%8C/

更新于2018年11月10日:

  • 修改pool.py的單詞拼寫(xiě)錯(cuò)誤
  • 更新執(zhí)行python命令可能出現(xiàn)的問(wèn)題及解決辦法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秘症,隨后出現(xiàn)的幾起案子照卦,更是在濱河造成了極大的恐慌,老刑警劉巖乡摹,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件役耕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡聪廉,警方通過(guò)查閱死者的電腦和手機(jī)瞬痘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)板熊,“玉大人框全,你說(shuō)我怎么就攤上這事「汕” “怎么了津辩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)容劳。 經(jīng)常有香客問(wèn)我喘沿,道長(zhǎng),這世上最難降的妖魔是什么竭贩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任蚜印,我火速辦了婚禮,結(jié)果婚禮上留量,老公的妹妹穿的比我還像新娘窄赋。我一直安慰自己,他們只是感情好肪获,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布寝凌。 她就那樣靜靜地躺著柒傻,像睡著了一般孝赫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上红符,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天青柄,我揣著相機(jī)與錄音伐债,去河邊找鬼。 笑死致开,一個(gè)胖子當(dāng)著我的面吹牛峰锁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播双戳,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼虹蒋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了飒货?” 一聲冷哼從身側(cè)響起魄衅,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎塘辅,沒(méi)想到半個(gè)月后晃虫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扣墩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年哲银,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呻惕。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荆责,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亚脆,到底是詐尸還是另有隱情草巡,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布型酥,位于F島的核電站山憨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弥喉。R本人自食惡果不足惜郁竟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望由境。 院中可真熱鬧棚亩,春花似錦、人聲如沸虏杰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纺阔。三九已至瘸彤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笛钝,已是汗流浹背质况。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工愕宋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人结榄。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓中贝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親臼朗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邻寿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容