程式當然無法預測一個人什麼時候會死,就算人工智慧跟各個流派的算命方法結合起來,應該也算不出這個時間。
這個工具只是檢測到我死了之後,做一套預設的任務流。
程式怎麼判斷我死沒死
我想了想這個問題,方法有兩種
-
我在瀕臨死亡只剩一口氣的時候,按下一個按鈕,然後任務流自動啟動
拋開瞬間死亡這種場景不說,還存在一個矛盾: “我在沒死之前,即使是瀕死階段,我不知道我還剩一口氣還是兩口氣,萬一在還剩三口氣的時候按下了這個按鈕,那結果不準確,程式設計是失敗的”
-
每個人每天都會做一些同樣的事,假如有一段時間沒有做,那是不是可以判斷這個人可能去世了
這裡又衍生出兩種方案
-
主動告訴指令碼,今天我還活著
指令碼呢一定是跑在伺服器上,考慮到能夠不限地點,不限裝置的告訴指令碼我還活著的訊息,我最先想到的方案是:訪問一個只有我知道地址的路由,只要這個路由今天被訪問到了,那就證明我今天活著。
那麼這個路由得是一個沒有任何語意的拼寫組合,比如說 https://hostname/whwhqiangdongqiang/23333,且需要在 robots.txt 中配置相應的路由規則,不然在我死了之後,指令碼在特定的情況下,還會認為我活著。
縱使一切都按部就班的完成了,仍然會有洩露地址的可能性,於是這個方案顯得不是合適,且每天都需要手動訪問這個地址,比較麻煩。
-
指令碼自動檢測今天的我有沒有活動痕跡
人每天都會重複一些事情,比如:吃飯、上廁所、走路等等
舉個例子:吃了飯就會有垃圾產生,那麼垃圾桶的重量就會加重,但是即使在垃圾桶上裝上感測器,垃圾是產生了,但是這個垃圾是誰產生的並不能確定。而且,我有可能出去遊玩,也有可能沒有睡在家裡。
需要找到一種 “跟身份強關聯的且每日都會產生的痕跡”,社交網路上的痕跡就很符合這個要求。
-
獲取社交網路上的痕跡
途徑有兩種:
1. 訪問開放平臺對應的開發者介面
2. 爬蟲爬取對應的資料
複製程式碼
我想了想我每天都會在網際網路上留下哪些痕跡,比較常見的有:刷朋友圈、刷頭條、刷微博、刷頭條等等等
其中有些很難通過上述的兩種方案獲取相關資訊,比如:朋友圈。
朋友圈比較麻煩是因為:沒有網頁版也沒有可供使用的 api,想要獲取評論資訊和點贊資訊預估得走很多彎路
剩餘的資訊源中又能分為三種情況:
-
需要模擬登入獲取記錄的,比如頭條的閱讀記錄,模擬登入又有很多途徑
- Oauth 登入
- 獲取登入態登入
- 模擬輸入賬號密碼登入
-
直接訪問對應使用者的主頁就能獲取活動記錄的,比如知乎
-
提供介面的,比如微博
想要從資訊源中知道我死了沒有,無非就是從檢索一下資訊源中最上方的一條資訊是否和之前的一致,不一致就說明我還活著。
於是這裡又有個問題出現了:
假如我今天沒有產生資訊,但是我刪了一條几年前的資訊,那麼按照上文的規則,我會被認為已死亡。
規避這種情況有兩種方案:
- 獲取我在這個平臺上的所有資料,這樣即使刪除了一條很久之前的資料,也能被認為是「不一致」,但這方案也會帶來一個問題,假如全部資料量十分巨大,指令碼就需要完善對應的「反·反爬蟲機制」
- 從介面中找到能體現「全部資料量」的元素
舉個例子
知乎
這是一個使用者首頁資訊
從中可以看到,我回答了「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 結構永遠不改。