傳說有兩個(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是因?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ò)誤派哲。
里面的安裝寫的是很詳細(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)備
-
這個(gè)方法和上面提到的中文安裝教程其實(shí)是一種思路隙赁,部署在第三方平臺(tái)。
-
這個(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`
Guided VirtualBox installation using shell scripts and Vagrant
Deploying huginn on any server or virtualbox using chef solo and/or vagrant
安裝好之后俺陋,就可以進(jìn)行以下的任務(wù)了豁延。
初見Huginn
Huginn的狀態(tài)欄很簡單,agents
指的是機(jī)器鳥腊状,鳥兒們被分成組诱咏,執(zhí)行不同的計(jì)劃,這些分組稱之為scenarios
缴挖,同一組的鳥兒彼此間互相合作袋狞,在一個(gè)組里,第一只鳥兒的指令是主人下發(fā)的映屋,第二只鳥兒的指令則是從第一只鳥兒執(zhí)行完指令后生成的事件events
中獲取的苟鸯。換句話說,當(dāng)一只鳥兒獲取到情報(bào)后棚点,它會(huì)生成一個(gè)事件早处,同一組的鳥兒可以從這些事件中獲取指令,開始自己的任務(wù)瘫析。Credentials
和services
指這些鳥兒常去的地點(diǎn)砌梆,其實(shí)就是別的服務(wù)程序的API接口,這些鳥兒從這里獲得相關(guān)服務(wù)的信息贬循。
這個(gè)是我的agents咸包。點(diǎn)擊 view diagram
可以查看相關(guān)的agent之間的關(guān)系,比如這樣:
以右邊為例甘有,第一只鳥兒打開一個(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
信息如下所示:
注意夷都,這里選擇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
执泰。
如圖所示,是另外一個(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ì)檢測path
和value
的相似程度洲胖,如果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
注意,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/
窄锅,即:
這樣一來创千,我們收到的通知就變成下面這個(gè)樣子了。
更新:[美劇字幕]《神盾局特工 第四季 第十集【精腥胪担】》Marvel's Agents of S.H.I.E.L.D 地址是:http://www.zmz2017.com/subtitle/51114
看一下我們的流程追驴,是這個(gè)樣子的:
示例二:為沒有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輸出
指的是你將要生成的RSS訂閱網(wǎng)址的名稱钠四,它會(huì)顯示在地址欄里盗扒,請自行填寫(一般寫這個(gè)項(xiàng)目的昵稱就好)跪楞。
比如,上一步我們生成的事件內(nèi)容是:
則這里的
title
值侣灶,因?yàn)榭赡苡泻芏嗤籥gent生成的不同事件甸祭,所以這樣表示,可以把所有上一個(gè)agent生成的事件結(jié)合在一起輸出褥影。
以上池户。
本文首發(fā)于blog.mazhangjing.com ; blog.mazj.me. ? 版權(quán)所有,轉(zhuǎn)載請聯(lián)系作者:js@mazhangjing.com