我写了个工具,能知道我何时死

程序固然没法预测一我的何时会死,就算人工智能跟各个流派的算命方法结合起来,应该也算不出这个时间。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 结构永远不改。

项目地址

博客原文

相关文章
相关标签/搜索