开发一个美剧自动嗅探下载器:TVDragon(上)

  • 从今天开始我们来写一个美剧自动嗅探下载器, 名为 TVDragon, 为我们提供美剧‘一条龙服务’。 其工作原理是根据已订阅的美剧名称(英文名),自动搜索当天的美剧播放表, 从种子网站搜索 torrent 列表, 筛选,自动下载该种子,接着上传torrent到树莓派的 transmission 上进行bt下载。

一、背景

本人是个美剧爱好者,平时几乎每天都有一部美剧更新,而我每天我要做的事情是上 <zimuzu.tv> 去查看当天的美剧播放表, 然后到<torrentz2.eu>搜索所追美剧的种子, 然后根据清晰度筛选,下载,上传后 transmission 进行资源下载。整个过程虽耗时不长, 但有时当天的美剧有好几部, 而且不一定资源已上传, 这就需要重复上述的步骤了。有时之后就会忘记了, 因此造成晚上下班后才去下载,不能好好的享用“美剧大餐”了。这就是 TVDragon 诞生的背景了。

二、必备条件(材料)

若要TVDragon 成功运行, 需要满足以下条件

  • 7x24小时运行的Linux服务器(树莓派)
  • 宽带网络
  • transmission 软件
  • PHP7.0+

三、APi 分析

既然我们需要爬取美剧播放表和搜索美剧种子等, 就需要用到Charles这个抓包神器。关于 Charles 的用法可自行搜索,这里不作描述。

1、许多网站都有美剧的播放表,我选择 <zimuzu.tv>上的,而且这里我选用了字幕组IOS非 App Store 版 app作为抓包目标。

经分析, App 上面的播放表 api 是https://api1.ousns.net/index.php ,其需要的参数是

1
2
3
4
5
6
7
8
9
{
"accesskey": "519f9cab85c8059d17544947k36113fd3g",
"client": "1",
"g": "api/v2",
"m": "index",
"a": "tv_schedule",
"start": "2017-12-10",
"end": "2017-12-11"
}

我们这里只需要改变 start 和 end 的值即可获取不同日期的当天美剧播放列表, 但不包含 end 日期的数据

响应内容是
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

{
"status": 1,
"info": "",
"data": {
"2017-12-24": [
{
"id": "35673",
"cnname": "谷中十日",
"enname": "Ten Days In the Valley",
"poster": "http://tu.zmzjstu.com/ftp/2017/1001/88292ec7121c82fd6f432f3509411913.jpg",
"season": "1",
"episode": "7",
"play_time": "2017-12-24",
"poster_b": "http://tu.zmzjstu.com/ftp/2017/1001/b_88292ec7121c82fd6f432f3509411913.jpg",
"poster_m": "http://tu.zmzjstu.com/ftp/2017/1001/m_88292ec7121c82fd6f432f3509411913.jpg",
"poster_s": "http://tu.zmzjstu.com/ftp/2017/1001/s_88292ec7121c82fd6f432f3509411913.jpg"
}
]
}
}

status=1 表示请求成功。data 字段里的数据就是我们真正需要的,里面包含了每部美剧的中文名、英文名和剧集数量等等

2、根据美剧英文名搜索 torrent 种子列表。

这里选择https://torrentz2.eu/search作为搜索的工具。请求参数很简单:

1
2
3
4
{
"f": "the+flash+2014+s04e09",
"save": true
}

f 表示搜索的关键字,关键字中的空格转变为+或 urlEcode ;例如:the flash 2014 s04e09 搜索时变为:the%2Bflash%2B2014%2Bs04e09;
save 表示是否开启安全搜索,默认开启。


##### 返回结果

![d.png](http://ww4.sinaimg.cn/large/a15b4afegy1fmjw8ki15ij20ya0ba782)

更多的搜索结果可查看
<https://torrentz2.eu/search?f=the%2Bflash%2B2014%2Bs04e09>

#### 3、查看可用的 torrent 列表

经过上面的搜索后, 我们可以选择清晰度较高的一个资源查看其可用的 torrent 下载列表。
选择这个资源<The.Flash.2014.S04E09.720p.HDTV.x264-SVA[rarbg]>,之后可以看到如下的 torrent 列表:

![torrent 列表](http://ww4.sinaimg.cn/large/a15b4afegy1fmjwdvfcswj20yv0j50zn)

这里的 torrent 列表可能每一次都不一致的, 因此需要找一个资源列表最多的站点, 对每个站点都分析其下载 torrent 的按钮元素和事件, 方可自动下载 torrent 文件。

``
这里建议若有 rarbg 站点, 首选这个。大多数情况 rarbg 都会比较快更新资源。

``
更快捷的方法是:根据搜索列表中的 title 中 hash 值解析出 torrent 的真实地址。 规则:
``
http://itorrents.org/torrent/hash 值.torrent
``


### 四、Transmission 远程调用接口
##### 关于树莓派是什么?如何购买树莓派?如何在树莓派安装 transmission等等问题,可自行摸索。这里假设一切条件就绪。

 通过上面的步骤我们已经能够实现自动下载 torrent 文件了。既然这样我们需要把 torrent 文件上传到 Transmission 上进资源下载。<transmission.com>上的文档有说明RPC 的方法, 还推荐了几个比较好的类库。

这里我们使用 PHP 实现的transmission RPC类库, <https://github.com/vohof/transmission>. 

### 五、结束
到这里为止, 我们基本分析了TVDragon 的工作流程和梳理如何实现这些需求,关键之处就是如何分析所需要的目标程序, 拆分各个功能需求, 搜索是否已有类似的类库, 这样可减少我们的前期工作量。调研工作已基本结束, 后面的事情就是如何搭建一个开发框架了。这将在下一盘文章中阐述。