我寫了個工具,能知道我什麼時候死

茶山小旋風發表於2017-12-04

程式當然無法預測一個人什麼時候會死,就算人工智慧跟各個流派的算命方法結合起來,應該也算不出這個時間。

這個工具只是檢測到我死了之後,做一套預設的任務流。

程式怎麼判斷我死沒死

我想了想這個問題,方法有兩種

  1. 我在瀕臨死亡只剩一口氣的時候,按下一個按鈕,然後任務流自動啟動

    DGW2DU6VwAALa7Z

    拋開瞬間死亡這種場景不說,還存在一個矛盾: “我在沒死之前,即使是瀕死階段,我不知道我還剩一口氣還是兩口氣,萬一在還剩三口氣的時候按下了這個按鈕,那結果不準確,程式設計是失敗的”

  2. 每個人每天都會做一些同樣的事,假如有一段時間沒有做,那是不是可以判斷這個人可能去世了

    這裡又衍生出兩種方案

    • 主動告訴指令碼,今天我還活著

      指令碼呢一定是跑在伺服器上,考慮到能夠不限地點,不限裝置的告訴指令碼我還活著的訊息,我最先想到的方案是:訪問一個只有我知道地址的路由,只要這個路由今天被訪問到了,那就證明我今天活著。

      那麼這個路由得是一個沒有任何語意的拼寫組合,比如說 https://hostname/whwhqiangdongqiang/23333,且需要在 robots.txt 中配置相應的路由規則,不然在我死了之後,指令碼在特定的情況下,還會認為我活著。

      縱使一切都按部就班的完成了,仍然會有洩露地址的可能性,於是這個方案顯得不是合適,且每天都需要手動訪問這個地址,比較麻煩。

    • 指令碼自動檢測今天的我有沒有活動痕跡

      人每天都會重複一些事情,比如:吃飯、上廁所、走路等等

      舉個例子:吃了飯就會有垃圾產生,那麼垃圾桶的重量就會加重,但是即使在垃圾桶上裝上感測器,垃圾是產生了,但是這個垃圾是誰產生的並不能確定。而且,我有可能出去遊玩,也有可能沒有睡在家裡。

      需要找到一種 “跟身份強關聯的且每日都會產生的痕跡”,社交網路上的痕跡就很符合這個要求。

獲取社交網路上的痕跡

途徑有兩種:

1. 訪問開放平臺對應的開發者介面    
2. 爬蟲爬取對應的資料
複製程式碼

我想了想我每天都會在網際網路上留下哪些痕跡,比較常見的有:刷朋友圈、刷頭條、刷微博、刷頭條等等等

其中有些很難通過上述的兩種方案獲取相關資訊,比如:朋友圈。

朋友圈比較麻煩是因為:沒有網頁版也沒有可供使用的 api,想要獲取評論資訊和點贊資訊預估得走很多彎路

剩餘的資訊源中又能分為三種情況:

  1. 需要模擬登入獲取記錄的,比如頭條的閱讀記錄,模擬登入又有很多途徑

    • Oauth 登入
    • 獲取登入態登入
    • 模擬輸入賬號密碼登入
  2. 直接訪問對應使用者的主頁就能獲取活動記錄的,比如知乎

  3. 提供介面的,比如微博

想要從資訊源中知道我死了沒有,無非就是從檢索一下資訊源中最上方的一條資訊是否和之前的一致,不一致就說明我還活著。

於是這裡又有個問題出現了:

假如我今天沒有產生資訊,但是我刪了一條几年前的資訊,那麼按照上文的規則,我會被認為已死亡。

規避這種情況有兩種方案:

  1. 獲取我在這個平臺上的所有資料,這樣即使刪除了一條很久之前的資料,也能被認為是「不一致」,但這方案也會帶來一個問題,假如全部資料量十分巨大,指令碼就需要完善對應的「反·反爬蟲機制」
  2. 從介面中找到能體現「全部資料量」的元素

舉個例子

知乎

這是一個使用者首頁資訊

我寫了個工具,能知道我什麼時候死

從中可以看到,我回答了「36個問題」,有「8個想法」,贊助了「18個live」,關注了「1419個問題」 等等等等,將這些資料與首頁的資訊流結合起來,能規避掉一部分的誤判,當然在某些特定的情況下,還是會出現「總量沒變,第一條資訊流也沒變的情況」,可以把資訊流的條數適當增大一點,比如十條。這樣操作之後,出現誤判的機率能降低很多(排除人為欺騙的場景)

如何從頁面中獲取到對應的資訊

從網頁呼叫的介面中獲取

我寫了個工具,能知道我什麼時候死
像知乎這樣用 React 等框架構建的網頁,很多資料是從介面處拿的,找到對應的介面,偽造相關資訊後可以拿到介面資料。

從 DOM 中獲取

直接從 DOM 中找到對應的資料,這裡又會出現一個問題

指令碼的 get請求,只是獲取到了 HTML 文字,網頁中還會有一些 js 程式碼沒有被執行,這意味著瀏覽器展示的 HTML 和指令碼 get請求到的 HTML 是不一致的

例子

<html lang="en">
<head>
  <title>Document</title>
</head>
<body>
  <p id="test">no script</p>
</body>
<script>
  window.onload = function () {
    document.getElementById('test').innerText = 'hello world'
  }
</script>
</html>
</code>
複製程式碼

瀏覽器中的結果:

我寫了個工具,能知道我什麼時候死

指令碼獲取的結果:

我寫了個工具,能知道我什麼時候死

可以看到,瀏覽器中對應的 dom節點已經變成了 「Hello World」,而 curl 到的 dom節點還是「no script」

因此,為了讓瀏覽器環境和指令碼環境獲取到的 HTML 文字保持一致,需要引入一個能解釋 js 的工具:「PhantomJS

引入後獲取的 HTML:

我寫了個工具,能知道我什麼時候死
可以正常獲取到 「Hello World」了

從開放平臺處獲取對應的資訊

微博

在未登入的情況下開啟微博的個人主頁

我寫了個工具,能知道我什麼時候死

沒有登入的狀態下獲取不到任何資料,從 DOM 中拿資料的路數就行不通了,除非登入。

與其在這裡登入,再解析 HTML,不如直接從現成的開放平臺調介面。

一頓操作後,獲取到了我發出的評論,我發出的微博,我的關注,我的收藏資訊。

最後

我寫了三個資訊源:「知乎」、「豆瓣」、「微博」,

我寫了個工具,能知道我什麼時候死
將檢測時間調整(預設為一天)為 6分鐘測試一下,6分鐘內沒更新這三個資訊源,我就死了。然後指令碼自動執行一段任務流,比如在我的部落格發一篇預先設定好的博文,將我的密碼檔案發給指定郵箱等等等等。

像 hexo 這類的部落格程式只需要進入對應的目錄,執行 hexo clean && hexo g 就能發部落格,流程還是比較簡單的。

程式碼邏輯倒轉一下,這也能成為一個特別關注的工具,當特別關注的人「釋出了一個新回答的時候」/「看了本新書的時候」,能通知到自己。

缺點

這玩意缺點仍然很明顯,昏迷狀態和被限制人身自由狀態也會被誤認為死亡。

而且無法保證微博不更換介面,也無法保證豆瓣和知乎的 DOM 結構永遠不改。

專案地址

部落格原文

相關文章