我去!把自己的數據拿回來辣麼費勁😱

之前倒騰豆瓣 API 的時候就想看看自己從標記上「想讀」到「讀過」要花多長時間。但我每次買書都會把看過的書的標記刪掉,其實就是把豆瓣讀書當作購書單。這樣的壞處就是沒法拿到「想讀」的時間了。不過好在標記「想讀」的同時,豆瓣會自動幫我發一條廣播。可以從廣播裏找回來。

那麼問題來了,豆瓣廣播的所有 API 操作必須登錄,而要登錄必須豆瓣授權,可是豆瓣已經關閉授權申請了。這不「第二十二條軍規」嘛😒

然後想到,瀏覽器不有 從 cookie 嘛,讓瀏覽器去抓廣播的頁面。這不就繞開了!好了:

  1. 找個能操縱 GUI 的膠水把廣播頁面 down 下來;
  2. 找個 HTML 解析庫揀出數據;
  3. 導到 Excel/Numbers 之類的小型數據庫裏畫圖。

結果……每一步都是坑啊😭 從晚上一直幹到第二天凌晨五點才有些眉目。接着九點半又爬起來弄了會才搞定。


就像好的程序會提供「圖形界面」和「命令行」兩套接口一樣,好的網站也會提供「服務於人的頁面」和「服務於程序」的 API 。

呃~豆瓣是個好網站!


先說第一步吧。想用 Python 的 pyautogui 來着,沒裝上。然後想找找有沒有 Ruby 版的 AutoIt 。突然想到,那還不如用 Automator 或者 AppleScript 呢。又試了下 Automator ,功能太簡單,轉向 AppleScript 。

AppleScript 坑

沒曾想這才是個大坑呢!連 Apple 官方的文檔都打不開。各種查資料才湊出段勉強能用的腳本。其實 AppleScript 設計得挺好的,就是不知道爲啥網上的資料大多沒講到點子上。

大家說「Mac 接口統一」,其實意思是「在圖形界面之外,還有一套不可見、卻能爲程序訪問的第二界面。那是機器之間的悄悄話」。是的,好程序都有兩套接口。所以,好程序更複雜,而不是更簡單。

在 Mac 上,這套「程序之間的黑話」叫「Apple events」。其實任何一個 Mac 程序都是一個服務器,只不過它們之間是經由 Apple Event Manager 用 Apple events 來傳遞信息。而 AppleScript 就是把 Apple events 包裝了下。而能聽懂這套黑話的程序叫做「AppleScriptable applications」。AppleScript 的能力邊界取決於它黏合的那些程序能幹什麼。

接下來,請記住:這套黑話是爲了方便其他程序能夠理解。

就像一篇文章由段落構成,段落由句子構成,句子由成分構成,成分由單詞構成,單詞由字母構成,AppleScript 是以 object 爲單位來組織架構的。object 是包含一定信息的某種抽象。之所以抽取出這些信息片段,是爲了方便其他程序理解。AppleScript 內置了一些基本的 object ,比如:numbers, strings, dates ...

42
3.14
"Hello, World!"
date "Friday, Sep 16, 2016"
{2, 3, 17, 18, 43, 45}

理解 AppleScript 的關鍵之一,就是弄清楚程序是怎麼來組織信息的,這些信息單元又對應於哪些 objects,可以通過哪些 commands 來操作這些 objects 。

之前接觸 AppleScript 的時候,之所以覺得一地雞毛、零碎得很的原因就在於沒有弄清楚操作對象的 objects 組織架構(也就是 objets model)。

有三種方法可以操控 object ,分別是:command, operactor, variable.

而把這些黏合起來的,就是「控制語句」:

  • 我該不該做這個? Should I do this?
  • 我該做多少次? How often should I do this?
  • 要是出錯了怎麼辦? What should I do if things go wrong?

以及某種抽象機制——handlers[1] & script objects.

神奇的是,AppleScript 的 handlers 允許先調用,後定義[2]😱 但不允許嵌套定義。

但,最最神奇的是,AppleScript 允許一套通過標籤(而非位置)來傳遞參數的方式定義 handler 。既可以是預定義的標籤[^predefined label],也可以是自定義標籤[^user label]。這才是 AppleScript 敢把自己叫做「English-like」語言的原因。

[^predefined label]: predefined labels 有23個:about, above, against, apart from, around, aside from, at, below, beneath, beside, between, by, for, from, instead of, into, on, onto, out of, over, since, thru (or through), and under. 另外,第一個參數可以用inof來標識,但僅限於第一個參數。

[^user label]: user labels 用given來標識。如果自定義標籤所指示的參數是 boolean 變量,在調用時可以用with來設置爲true,或者用without來設置爲false

用腳本去操控程序,根本就不是去模擬人的點擊、鍵入……,而是腳本直接與程序對話。AppleScript 中類似「點擊」「鍵入」……等動作的操作,就是 commands 。

所有的程序會響應 run, open, quit 這些指令。有的程序還會提供自己的特有指令。人,是通過點擊 menus, buttons 這些圖形元素來操縱程序。而程序通過 commands 來操控其他程序。既然是指令,就需要有作用對象。這樣,commands 就和 objects 綁定起來了。


nokogiri 坑


……


  1. 代碼柄?正好和代碼塊(block)相對😁 其實和子程序(subroutines)啦、函數(functions)啦、過程(procedures)啦一個意思。

  2. 把關鍵字「to」換成「on」也行,一個意思。而且如果忘了在 end 後寫上 handler name 也沒關係。

    foo()

    to foo()
    2
    end foo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 隨筆1-24(2015.6-10) 1、作者 才華不是財富,痛苦不是財富,用才華對痛苦進行思考和表達才是。於是有了...
    四葉阅读 1,487评论 3 14
  • a大仙阅读 209评论 2 0
  • 是否梦里常会出现一个人,曾是自己心心念念的那个人,熟悉又遥远,伸手无法触摸,话到嘴边,却怎么也喊不出名字,一...
    眯眯眼晓琦琦阅读 163评论 0 0