Huginn中文指南:搭建自己的iFTTT

傳說有兩個(gè)烏鴉,名為Huginn和Muninn拦英,它們被視為奧丁的左肩右臂蜒什。奧丁在黎明時(shí)送出Huginn和Muninn,它們飛到世界各地疤估,然后在晚餐時(shí)間回來吃谣,告訴奧丁它們看到和聽到的一切,奧丁則賜予它們食物作為報(bào)酬做裙。——Huginn命名的由來

什么是Huginn肃晚?

Huginn是一個(gè)強(qiáng)大的自動(dòng)化工具锚贱,它就像iFTTT,if 1 then 2关串,當(dāng)事件1出現(xiàn)拧廊,自動(dòng)完成事件2。它可以幫助你設(shè)置感應(yīng)器晋修,收集信息并完成從信息的搜集—過濾—通知這樣一連串的任務(wù)吧碾。比起iFTTT,它更加強(qiáng)大墓卦,更加自動(dòng)化倦春,也更加難以搞定。不過,使用Huginn睁本,你可以做到比iFTTT更加多樣尿庐、更加有趣的事情,其缺點(diǎn)僅僅是——你需要一筆小小的精力呢堰,去學(xué)習(xí)相關(guān)知識(shí)抄瑟,去配置相關(guān)程序,去在每天的實(shí)踐中debug枉疼,讓它成熟起來皮假。

關(guān)于Huginn的大概介紹,有兩篇文章寫的很好骂维。我承認(rèn)惹资,自己的huginn之路就是從這里開始的:不過,我并沒有按照這樣的思路來做席舍,不管怎么樣布轿,首先閱讀以下這些文章,總是有好處的来颤。

第一篇是關(guān)于Huginn的大致結(jié)構(gòu)汰扭,它是怎么幫助我們完成任務(wù)的:

Huginn: 燒錄RSS的神器

我起初了解Huginn是因?yàn)橄胍獮闆]有RSS的網(wǎng)站制作RSS種子。我嘗試過Feed43福铅,但是免費(fèi)版本種子更新速度太慢萝毛,頻率是六小時(shí)一次,通知不及時(shí)滑黔。加上我特別擔(dān)心這些看不清楚盈利模式笆包,同時(shí)在CN網(wǎng)絡(luò)打開又特別慢的網(wǎng)站,怕他哪一天就完蛋了略荡,在這個(gè)時(shí)候庵佣,我通過百度知道了Huginn。到今天為止汛兜,Huginn也還是個(gè)“小眾”的東西巴粪,在百度的搜索結(jié)果,中文頁面只有兩個(gè)能看粥谬,并且這兩個(gè)里面只有一篇教程肛根,這篇教程限制還很多,并且一大群人在下面提issure漏策,各種各樣的安裝錯(cuò)誤派哲。

Huginn 官方網(wǎng)站/WIKI

里面的安裝寫的是很詳細(xì),不過如果你真的照著做掺喻,出問題的概率幾乎是100%芭届。作者們假定你已經(jīng)了解了Xpath储矩,CSS,JS還有Docker喉脖、Negix椰苟、Linux基礎(chǔ)聊疲,當(dāng)我剛開始著手準(zhǔn)備搭建的時(shí)候塘装,我真的感到非常痛苦载矿,各種錯(cuò)誤出現(xiàn)在各種位置涨椒。不過——這顯然也不是作者的問題奕翔,當(dāng)我現(xiàn)在懂酱,想要寫一個(gè)人人都能看得懂的教程的時(shí)候脾还,才發(fā)現(xiàn)缕棵,這其中的工作量性锭,何其之大赠潦,未免生出放棄的念頭。

嘗試部署Huginn到你的服務(wù)器

關(guān)于huginn的安裝草冈,如果自己沒有服務(wù)器的她奥,可以參看這篇文章:

當(dāng)然,如果英文基礎(chǔ)尚可的話怎棱,可以參考一下官方給的安裝資料:

Deploying Huginn 在服務(wù)器上部署Huginn

  • Installation guide for Ubuntu/Debian

    我嘗試在在EC2上這樣安裝哩俭,嘗試了13遍,最后還是放棄了拳恋,國內(nèi)的話凡资,安裝gem可能會(huì)遇到qiang的問題,所以想要在阿里云或者騰訊云上安裝的谬运,請做好心理準(zhǔn)備

  • Run Huginn on Heroku

    這個(gè)方法和上面提到的中文安裝教程其實(shí)是一種思路隙赁,部署在第三方平臺(tái)。

  • Deployment with Capistrano

    這個(gè)也是第三方平臺(tái)梆暖。

  • Using Huginn on predeployed Docker container

    安裝docker是最簡單的方法伞访,不過之后的配置需要docker基礎(chǔ),不過一般人也用不到這些高級(jí)的設(shè)置轰驳,所以還是推薦用這種方法安裝咐扭,備注:阿里云好像占用了一些端口,安裝docker會(huì)有問題滑废,請自行百度更改這些設(shè)置,搜索“阿里云安裝docker”就可以袜爪。

    Linux安裝指南(最好還是點(diǎn)開鏈接去看官方的wiki)

    Install docker using the install instructions蠕趁;首先要有docker環(huán)境,docker的安裝參考 這里 , 非常簡單辛馆。

- Start your Huginn container using  `docker run -it -p 3000:3000 cantino/huginn`
- Open Huginn in the browser `http://localhost:3000`
- Log in to your Huginn instance using the username  `admin`  and password `password`

安裝好之后俺陋,就可以進(jìn)行以下的任務(wù)了豁延。

初見Huginn

image
image

Huginn的狀態(tài)欄很簡單,agents指的是機(jī)器鳥腊状,鳥兒們被分成組诱咏,執(zhí)行不同的計(jì)劃,這些分組稱之為scenarios缴挖,同一組的鳥兒彼此間互相合作袋狞,在一個(gè)組里,第一只鳥兒的指令是主人下發(fā)的映屋,第二只鳥兒的指令則是從第一只鳥兒執(zhí)行完指令后生成的事件events中獲取的苟鸯。換句話說,當(dāng)一只鳥兒獲取到情報(bào)后棚点,它會(huì)生成一個(gè)事件早处,同一組的鳥兒可以從這些事件中獲取指令,開始自己的任務(wù)瘫析。Credentialsservices指這些鳥兒常去的地點(diǎn)砌梆,其實(shí)就是別的服務(wù)程序的API接口,這些鳥兒從這里獲得相關(guān)服務(wù)的信息贬循。

image

這個(gè)是我的agents咸包。點(diǎn)擊 view diagram可以查看相關(guān)的agent之間的關(guān)系,比如這樣:

image

以右邊為例甘有,第一只鳥兒打開一個(gè)網(wǎng)頁诉儒,然后獲取到相關(guān)的條目url,第二只鳥兒打開這個(gè)url亏掀,然后從新的頁面里提取全文忱反。要知道,第一只鳥可能獲取多個(gè)url滤愕,它獲取的這些url稱之為事件event温算,這些事件被交給第二只鳥,這只鳥比較悲催间影,需要一個(gè)個(gè)打開這些事件中的url注竿,然后分別獲取全文,然后再生成與之對應(yīng)的自己的event魂贬。第二只鳥的event里面是獲取到的url內(nèi)的全文巩割,然后這些內(nèi)容被交給第三只鳥,第三只鳥把這些內(nèi)容合起來付燥,生成一個(gè)RSS種子宣谈,它自己的event,是一個(gè)網(wǎng)址键科,這個(gè)網(wǎng)址就是我們最終得到的RSS源闻丑。

示例一:當(dāng)美劇更新的時(shí)候推送通知到我的iPhone

0漩怎、需求分析

這個(gè)任務(wù)設(shè)計(jì)兩大部分,首先是美劇網(wǎng)站更新的檢測嗦嗡,二是如果有更新勋锤,把生成的huginn event推送到手機(jī)端。第一部分很簡單侥祭,利用website agent抓取on_charge的數(shù)據(jù)即可叁执,第二部分則需要選擇一個(gè)服務(wù)商,并且將huginn event的內(nèi)容推送到這個(gè)平臺(tái)卑硫。

這樣的服務(wù)商比較不錯(cuò)的有三個(gè):

  • 郵件agent
  • slack agent
  • pushover agent

其中郵件推送最經(jīng)濟(jì)實(shí)惠徒恋,不受平臺(tái)約束;pushover這個(gè)服務(wù)最方便欢伏,APP界面簡潔美觀入挣,但是需要購買許可,每份許可一次性售價(jià)30人民幣硝拧。slack是一個(gè)和企業(yè)微信比較像的國外交流軟件径筏,可能面臨著封殺的危險(xiǎn),但是功能豐富障陶,支持桌面端滋恬、Chrome插件、iOS和Android端抱究,界面漂亮恢氯,并且可以自己選擇把消息推送到哪一個(gè)群組。

因?yàn)槲也惶M约旱泥]箱堆滿消息鼓寺,所以選擇了slack勋拟。

1、獲取美劇信息更新

這一部分很簡單妈候,利用website agent即可敢靡。

假設(shè)我們需要獲取字幕組的資源,那么我們的網(wǎng)址就應(yīng)該選擇字幕組的搜索頁面苦银。(因?yàn)樽帜唤M的網(wǎng)站需要登錄才能在美劇詳情的頁面顯示資源啸胧,提供下載,如果不注冊賬戶則不能看到資源幔虏,也就無法判斷目前更新的狀態(tài)纺念,但是搜索頁面提供最新更新的“字幕”信息,我們可以在第一時(shí)間得知此劇有更新想括。)

如果有實(shí)力的話陷谱,建議每次自動(dòng)登陸自己的賬戶,在美劇的詳情頁查看是否有更新主胧,并且獲取最新更新的地址叭首,自動(dòng)發(fā)送到遠(yuǎn)程迅雷等NAS接口并自動(dòng)下載,然后通過slack通知你美劇有更新并且已經(jīng)下載好了踪栋,不過這樣比較麻煩焙格。

我們先從簡單的開始,website agent 信息如下所示:

sdjtg1
QQ截圖20170120150104

注意夷都,這里選擇mode:on_change即可眷唉,比較節(jié)省資源。至于url和title的css信息囤官,分別指的是fl-info這個(gè)class下的a元素冬阳,中間的//指的是a元素包括這個(gè)class的子、孫党饮、重孫等肝陪,如果使用一個(gè)/則表示,這個(gè)a元素則僅僅指的是class的子元素(而不能是子元素的元素)刑顺。@href表示href屬性氯窍,text()表示獲取其文本信息。

這個(gè)agent的網(wǎng)址是(2017年):

http://www.zmz2017.com/search?keyword=%E7%A5%9E%E7%9B%BE%E5%B1%80%E7%89%B9%E5%B7%A5&type=subtitle

在沒更換網(wǎng)址之前是這個(gè):

http://www.zimuzu.tv/search?keyword=神盾局特工&type=subtitle

2蹲堂、創(chuàng)建過濾器

這不是一個(gè)必選項(xiàng)狼讨。因?yàn)椋?dāng)我們獲取更新后柒竞,直接可以把title的內(nèi)容作為通知的信息發(fā)送到我們的手機(jī)政供。但是,一般情況下朽基,當(dāng)我們獲取了目錄之后布隔,需要過濾掉我們不希望出現(xiàn)的信息,這樣推送的消息會(huì)更有針對性踩晶。

創(chuàng)建過濾器利用的是TriggerAgent执泰。

image

如圖所示,是另外一個(gè)任務(wù)的過濾器渡蜻,這里作為實(shí)例术吝。keep event這里我選擇的是false,意思是不生成過濾之后的事件茸苇,直接傳遞message的內(nèi)容給下一個(gè)agent排苍。如果你希望對過濾后余下的信息進(jìn)一步利用,比如再次過濾之類学密,可以選擇true以保留事件淘衙。

type指的是類型,regex指的是匹配腻暮,系統(tǒng)會(huì)檢測上一個(gè)agent生成的內(nèi)容(這里選擇的是path:title彤守,意思是把傳遞過來的事件中的title作為過濾的對象)毯侦,和value中內(nèi)容進(jìn)行比較,如果這個(gè)event中包含這些value具垫,那么生成事件侈离,否則不生成。value中的豎分割線指的是或的意思筝蚕,出現(xiàn)其中任何一個(gè)詞即可通過過濾器卦碾,生成事件。!regix 指的是不匹配起宽,它會(huì)檢測pathvalue的相似程度洲胖,如果path中出現(xiàn)value的值,則不輸出坯沪,反之绿映,則通過過濾器并輸出、生成事件屏箍。

3绘梦、通過Slack推送通知

首先,前往https://slack.com/ 注冊一個(gè)Slack賬戶赴魁。

接著卸奉,配置incoming webhook:

前往https://my.slack.com/services/new/incoming-webhook

選擇或者新建一個(gè)群組 (channel),點(diǎn)擊繼續(xù)颖御,復(fù)制Webhook URL 榄棵,然后選擇一個(gè)標(biāo)簽(Descriptive Label,可選) 和昵稱(Customize Name),自定義通知的圖標(biāo)潘拱,保存設(shè)置疹鳄。

你的 webhook URL 類似這個(gè)樣子: https://hooks.slack.com/services/some/random/characters

image

注意,Sources來源(1處)選擇上一個(gè)Agent芦岂,這里用的是我們website agent中的神盾局特工更新瘪弓,當(dāng)然你也可以用TriggerAgent作為通知的來源。

Propagate immediately(2處)的意思是當(dāng)上一個(gè)Agent生成事件后立馬喚醒此Slack Agent禽最。一般腺怯,這樣會(huì)造成較高的CPU使用,我選擇不理會(huì)這個(gè)選項(xiàng)川无,默認(rèn)情況下呛占,Huginn會(huì)每分鐘檢查一下你的Agent,看有沒有事件需要處理懦趋,所以不選的話晾虑,頂多1分鐘后再推送消息,對我的差別不大。

webhook_url(3處)選擇剛才我們生成的Webhook URL帜篇,channel(4處)選擇我們之前設(shè)置的群組(Chanel)糙捺,username指的是昵稱,message指的是我們需要推送的消息笙隙。icon建議留空继找,這樣它會(huì)默認(rèn)使用你在Slack設(shè)置界面中指定的圖標(biāo)。

如果我們選擇了“神盾局特工”作為此Slack Agent的來源(Source)逃沿,那么,你在右面會(huì)看到這樣一個(gè)東西(6處)幻锁,這里指的是Slack Agent來源事件的Agent凯亮,即神盾局特工更新這個(gè)Website agent 。下面顯示了此website agent傳遞過來的參數(shù)哄尔,我們看到有一個(gè)url假消,有一個(gè)title,在message欄內(nèi)填入紅色字部分岭接,那么通知將會(huì)變成這個(gè)樣子:

更新:[美劇字幕]《神盾局特工 第四季 第十集【精懈晦郑】》Marvel's Agents of S.H.I.E.L.D 地址是:/subtitle/51114

其中被雙括號(hào)包裹的東西是上一個(gè)agent中傳遞過來的事件對應(yīng)部分的內(nèi)容,其余部分我們可以自己填寫鸣戴。比如啃沪,默認(rèn)生成的url是/subtitle/51114,我們需要在前面加上http://www.zmz2017.com/窄锅,即:

image

這樣一來创千,我們收到的通知就變成下面這個(gè)樣子了。

更新:[美劇字幕]《神盾局特工 第四季 第十集【精腥胪担】》Marvel's Agents of S.H.I.E.L.D 地址是:http://www.zmz2017.com/subtitle/51114

看一下我們的流程追驴,是這個(gè)樣子的:

image

示例二:為沒有RSS的網(wǎng)站創(chuàng)建訂閱

下面給出我為了獲取ONE的RSS使用的代碼,注意疏之,真正想要了解它的使用方法殿雪,僅僅看懂以下代碼是沒什么作用的,每個(gè)類型的agent都給出了詳細(xì)的使用指南锋爪,就在你新建agent的右側(cè)丙曙,雖然它是英文,請務(wù)必讀懂几缭,這非常重要河泳。

1、摘要獲取

單擊任務(wù)欄新建一個(gè)agent年栓,這里選擇website agent拆挥,之后按照要求填入相關(guān)信息。注意:agent的名稱是必填項(xiàng)。當(dāng)你新建一個(gè)agent之后纸兔,從這個(gè)agent的菜單中選擇“show”惰瓜,你就可以見到如下的agent詳細(xì)信息。

Type: Website Agent 汉矿;這是一類獲取公開網(wǎng)頁信息的agent

Schedule: Every 5h 崎坊;每5小時(shí)運(yùn)行一次,對于RSS來說足夠了

Last checked: ~2h ago

Keep events: 5 days洲拇; 保留這個(gè)agent生成的事件的時(shí)間

Last event created: ~17h ago 奈揍;最后事件的創(chuàng)建時(shí)間

Last received event: never

Events created: 6 ;創(chuàng)建的事件數(shù)目

Event sources: None

Propagate immediately: No

Event receivers: ONE_獲取全文
本agent生成的事件傳遞給誰(因?yàn)檫@個(gè)agent是獲取目錄赋续,當(dāng)然下一步是獲取全文男翰,在新建website
agent的時(shí)候你不用填,到下一個(gè)生成全文的agent填寫event接收來源就可以了纽乱,website
agent會(huì)自動(dòng)把事件接收者指向生成全文的agent)

Working: Yes蛾绎; 是否工作

Options: ;這里是填入的代碼

{

"expected_update_period_in_days": "2", 鸦列;不用管
"url": "http://wufazhuce.com/", 租冠;打開哪個(gè)網(wǎng)站
 "type": "html", ;網(wǎng)頁類型薯嗤,一般是html
"mode": "on_change",
有三種可選顽爹,這里指的是把網(wǎng)頁和上一次生成的事件比較,如果有變化則輸出事件骆姐,如果和上次輸出的一樣則不輸出话原,避免生成重復(fù)的事件。
"extract": {
"url": {
"css": ".one-articulo-titulo/a", 這里是xpath代碼诲锹,前往w3c school自行學(xué)習(xí)繁仁,在xml的目錄下。
"value": "@href"
@XXX表示屬性归园,這里指的是“a”這個(gè)鏈接的href屬性黄虱,其實(shí)就是指網(wǎng)址。

},

"title": {
"css": ".one-articulo-titulo/a",
"value": "normalize-space()" 這里什么意思庸诱,請查看xpath函數(shù)部分捻浦。

}

}

} 

2、獲取全文

Details

Type: Website Agent

Schedule: Every 5h

Last checked: ~2h ago

Keep events: 2 days

Last event created: ~17h ago

Last received event: ~17h ago

Events created: 2

Event sources: One_一個(gè)_摘要獲取

Propagate immediately: Yes

Event receivers: ONE-RSS輸出

Working: Yes

Options:

{
"expected_update_period_in_days": "2",
"url": "{{url}}",
"type": "html",
"mode": "merge",
"extract": {
"author": {
"css": ".articulo-autor",
"value": "substring(normalize-space(),4)"

},

"title": {
"css": ".articulo-titulo",
.XXX表示class屬性桥爽,一般不寫成XX[@class=’XXX’]朱灿,而寫成 “.XXX”
"value": "normalize-space()"

},

"hovertext": {
"css": ".articulo-contenido",
"value": "."

}

}

} 

3、RSS輸出

image
image
  1. 指的是你將要生成的RSS訂閱網(wǎng)址的名稱钠四,它會(huì)顯示在地址欄里盗扒,請自行填寫(一般寫這個(gè)項(xiàng)目的昵稱就好)跪楞。

  2. 比如,上一步我們生成的事件內(nèi)容是:

image

則這里的

image
指的就是上一步生成事件中的title值侣灶,因?yàn)榭赡苡泻芏嗤籥gent生成的不同事件甸祭,所以這樣表示,可以把所有上一個(gè)agent生成的事件結(jié)合在一起輸出褥影。

以上池户。

本文首發(fā)于blog.mazhangjing.com ; blog.mazj.me. ? 版權(quán)所有,轉(zhuǎn)載請聯(lián)系作者:js@mazhangjing.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凡怎,一起剝皮案震驚了整個(gè)濱河市校焦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌统倒,老刑警劉巖斟湃,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異檐薯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)注暗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門坛缕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捆昏,你說我怎么就攤上這事赚楚。” “怎么了骗卜?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵宠页,是天一觀的道長。 經(jīng)常有香客問我寇仓,道長举户,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任遍烦,我火速辦了婚禮俭嘁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘服猪。我一直安慰自己供填,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布罢猪。 她就那樣靜靜地躺著近她,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膳帕。 梳的紋絲不亂的頭發(fā)上粘捎,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼晌端。 笑死捅暴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咧纠。 我是一名探鬼主播蓬痒,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漆羔!你這毒婦竟也來了梧奢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤演痒,失蹤者是張志新(化名)和其女友劉穎亲轨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸟顺,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惦蚊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讯嫂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹦锋。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖欧芽,靈堂內(nèi)的尸體忽然破棺而出莉掂,到底是詐尸還是另有隱情,我是刑警寧澤千扔,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布憎妙,位于F島的核電站,受9級(jí)特大地震影響曲楚,放射性物質(zhì)發(fā)生泄漏厘唾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一龙誊、第九天 我趴在偏房一處隱蔽的房頂上張望阅嘶。 院中可真熱鬧,春花似錦载迄、人聲如沸讯柔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魂迄。三九已至,卻和暖如春惋耙,著一層夾襖步出監(jiān)牢的瞬間捣炬,已是汗流浹背熊昌。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湿酸,地道東北人婿屹。 一個(gè)月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像推溃,于是被迫代替她去往敵國和親昂利。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

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