Toggle navigation
首页
技术
骑行
羽毛球
资讯
联络我
登录
用 .NET Core 写个小程序来追剧之二 - 添加下载任务到uTorrent客户端
2017-07-08
.NET Core
之前写过一个小程序来监测PT网站剧集是否更新:[用 .NET Core 写个小程序来追剧](/Coding/Details/monitor-episode-using-net-core-console),经过几天的使用,发现还不是很方便: 1. 还是需要人工查看结果 2. 新剧发布之后,还是需要手动下载种子文件并添加下载 有没有什么办法能够让这些事情全部自动完成,不用人工干预? # 可行性研究 PT下载用的是 uTorrent 客户端,目前的版本是 3.4.9,先到官网看看是否有开放API接口一类,可以从外部调用添加下载任务。 经过一番查找,在官方帮助中找到了一条:[Actions - WebAPI](http://help.utorrent.com/customer/en/portal/articles/1573952-actions---webapi) 里面提到: ``` HTTP://[IP]:[PORT]/GUI/?ACTION=ADD-FILE This action is different from the other actions in that it uses HTTP POST instead of HTTP GET to submit data to BitTorrent. The HTTP form must use an enctype of "multipart/form-data" and have an input field of type "file" with name "torrent_file" that stores the local path to the file to upload to BitTorrent. ``` 有机会~ # 下载 webui 插件和启用 uTorrent 的 WebUI 功能 要想使用 uTorrent 的 WebUI 功能,需要先下载插件包,然后在设定中启用 WebUI 功能。 ## webui的插件下载: https://forum.utorrent.com/topic/49588-%C2%B5torrent-webui/ 下载之后,将文件重命名为 webui.zip,然后放入 %appdata%\uTorrent 目录下 ## 设定 uTorrent 打开 uTorrent 的设置 --> 高级 --> 网页界面,并进行如下操作: 1. 在“启动网页界面”选项打上勾,并在身份验证中输入用来连接的用户名和密码。 2. 设置备用链接端口为8080,也可以直接使用客户端的链接端口。 3. 设定可以使用 WebUI 的IP地址白名单 4. 添加下载目录  设置好之后,就可以通过浏览器来访问uTorrent的Web界面了:  # Web API接口 实际的 Web API 调用方法和帮助文档中描述的不一致,比如直接调用返回下载列表的 API : http://ip:8080/gui/?list=1 会提示:invalid request。 只能另外想办法。通过 Web UI的地址 http://ip:8080/gui/ ,手动添加一次种子文件,发现实际的调用过程如下: 1. 访问地址,获取token 2. 调用api,并带上token参数 获取token的方法如下: http://ip:8080/gui/token.html 返回的token隐藏在一个div中: <html><div id='token' style='display:none;'>H1LZWTgh6men6pFmdm_16tqYvc8hOa87Sg6zMyA4vR3tKZo</div></html> 再次访问下载列表: http://ip:8080/gui/?list=1&token=H1LZWTgh6men6pFmdm_16tqYvc8hOa87Sg6zMyA4vR3tKZo 成功返回下载列表的json数据。 # 使用 add-file 接口添加下载任务 假设有种子文件:"d:\\test.torrent",通过 API 添加下载任务的代码如下: ```c# var filename = "d:\\test.torrent"; var bytes = File.ReadAllBytes(filename); using (var torrentDataContent = new MultipartFormDataContent()) { var dataContent = new ByteArrayContent(bytes); torrentDataContent.Add(dataContent, "torrent_file", filename); var boundaryValue = torrentDataContent.Headers.ContentType.Parameters.FirstOrDefault(p => p.Name == "boundary"); boundaryValue.Value = boundaryValue.Value.Replace("\"", String.Empty); using (var message = client.PostAsync("http://ip:8080/gui/?action=add-file&token=" + token, torrentDataContent).Result) { var addTaskResult = message.Content.ReadAsStringAsync().Result; } } ``` 注意修改 boundaryValue 那一段,如果不将双引号替换掉,会导致报 torrent file content not supplied in form parameter 的错误: ```json {"build":43085,"error": "Error - torrent file content not supplied in form parameter"} ``` 这个坑我爬了许久,原因在这里有介绍: http://developers.de/blogs/damir_dobric/archive/2013/09/10/problems-with-webapi-multipart-content-upload-and-boundary-quot-quotes.aspx 总算是可以用程序将种子文件添加到 uTorrent 客户端的下载任务中了!
×
本文为博主原创,如需转载,请注明出处:
http://www.supperxin.com
返回博客列表