我寫了個工具,能知道我何時死

程序固然沒法預測一我的何時會死,就算人工智能跟各個流派的算命方法結合起來,應該也算不出這個時間。html

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

程序怎麼判斷我死沒死

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

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

    DGW2DU6VwAALa7Z

    拋開瞬間死亡這種場景不說,還存在一個矛盾: 「我在沒死以前,即便是瀕死階段,我不知道我還剩一口氣仍是兩口氣,萬一在還剩三口氣的時候按下了這個按鈕,那結果不許確,程序設計是失敗的」瀏覽器

  2. 每一個人天天都會作一些一樣的事,假若有一段時間沒有作,那是否是能夠判斷這我的可能去世了bash

    這裏又衍生出兩種方案服務器

    • 主動告訴腳本,今天我還活着網絡

      腳本呢必定是跑在服務器上,考慮到可以不限地點,不限設備的告訴腳本我還活着的消息,我最早想到的方案是:訪問一個只有我知道地址的路由,只要這個路由今天被訪問到了,那就證實我今天活着。架構

      那麼這個路由得是一個沒有任何語意的拼寫組合,好比說 https://hostname/whwhqiangdongqiang/23333,且須要在 robots.txt 中配置相應的路由規則,否則在我死了以後,腳本在特定的狀況下,還會認爲我活着。hexo

      縱使一切都循序漸進的完成了,仍然會有泄露地址的可能性,因而這個方案顯得不是合適,且天天都須要手動訪問這個地址,比較麻煩。

    • 腳本自動檢測今天的我有沒有活動痕跡

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

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

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

獲取社交網絡上的痕跡

途徑有兩種:

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 結構永遠不改。

項目地址

博客原文

相關文章
相關標籤/搜索