zoukankan      html  css  js  c++  java
  • 利用Aria2构造自己的下载工具(一)

    Aria2 是一款轻量级的跨平台的多线程下载工具,支持 Http/Https、Ftp、BitTorrent、Metalink 等主流协议,功能非常全面。和IDM或EagleGet这些下载工具相比,aria2是一款纯命令行工具,没有图形界面,但可以通过rpc的方式提供交互式下载,这个是它的一个缺点,同时也是它的一个优点。它没有图形界面,使得可以在远程服务器、路由器、nas等平台上运行它,通过rpc交互的方式,实现离线下载。

    虽然上现在已经有webui-aria2, 以及 yaaw等一些第三方的比较成熟的界面工具。但了解一下其交互协议,实现一个更加灵活,更适合自己的功能强大的下载工具,对于程序员来说,还是一个比较指的折腾的的事情。

    配置Aria2

    在启动Aria2前,我们需要进行一些参数的配置,这些配置有两种方式,通过命令行或配置文件。当默认的配置较多的时候,通过命令行的方式显得冗繁和不直观,我们一般是通过配置文件的方式,这里是一个配置文件示例: 

    ## '#'开头为注释内容, 选项都有相应的注释说明, 根据需要修改 ##
    ## 被注释的选项填写的是默认值, 建议在需要修改时再取消注释  ##
    
    ## 文件保存相关 ##
    
    # 文件的保存路径(可使用绝对路径或相对路径), 默认: 当前启动位置
    dir=R:Downloads
    # 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
    disk-cache=32M
    # 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
    # 预分配所需时间: none < falloc ? trunc < prealloc
    # falloc和trunc则需要文件系统和内核支持
    # NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项
    file-allocation=falloc
    # 断点续传
    continue=true
    
    ## 下载连接相关 ##
    
    # 最大同时下载任务数, 运行时可修改, 默认:5
    max-concurrent-downloads=15
    # 同一服务器连接数, 添加时可指定, 默认:1
    max-connection-per-server=15
    # 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
    # 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
    min-split-size=30M
    # 单个任务最大线程数, 添加时可指定, 默认:5
    split=15
    # 整体下载速度限制, 运行时可修改, 默认:0
    #max-overall-download-limit=0
    # 单个任务下载速度限制, 默认:0
    #max-download-limit=0
    # 整体上传速度限制, 运行时可修改, 默认:0
    #max-overall-upload-limit=0
    # 单个任务上传速度限制, 默认:0
    #max-upload-limit=0
    # 禁用IPv6, 默认:false
    disable-ipv6=true
    
    ## 进度保存相关 ##
    
    # 从会话文件中读取下载任务
    input-file=aria2.session
    # 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
    save-session=aria2.session
    # 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
    save-session-interval=60
    
    ## RPC相关设置 ##
    
    # 启用RPC, 默认:false
    enable-rpc=true
    # 允许所有来源, 默认:false
    rpc-allow-origin-all=true
    # 允许非外部访问, 默认:false
    rpc-listen-all=false
    # 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同
    #event-poll=select
    # RPC监听端口, 端口被占用时可以修改, 默认:6800
    rpc-listen-port=6800
    
    ## BT/PT下载相关 ##
    
    # 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
    #follow-torrent=true
    # BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
    listen-port=51413
    # 单个种子最大连接数, 默认:55
    #bt-max-peers=55
    # 打开DHT功能, PT需要禁用, 默认:true
    enable-dht=false
    # 打开IPv6 DHT功能, PT需要禁用
    #enable-dht6=false
    # DHT网络监听端口, 默认:6881-6999
    #dht-listen-port=6881-6999
    # 本地节点查找, PT需要禁用, 默认:false
    #bt-enable-lpd=false
    # 种子交换, PT需要禁用, 默认:true
    enable-peer-exchange=false
    # 每个种子限速, 对少种的PT很有用, 默认:50K
    #bt-request-peer-speed-limit=50K
    # 客户端伪装, PT需要
    peer-id-prefix=-TR2770-
    user-agent=Transmission/2.77
    # 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0
    seed-ratio=0
    # 强制保存会话, 话即使任务已经完成, 默认:false
    # 较新的版本开启后会在任务完成后依然保留.aria2文件
    #force-save=false
    # BT校验相关, 默认:true
    #bt-hash-check-seed=true
    # 继续之前的BT任务时, 无需再次校验, 默认:false
    bt-seed-unverified=true
    # 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
    bt-save-metadata=true
    View Code

    这个配置我也是网上摘录的,完整配置可以参考官方文档。一般的时候调整下dir=R:Downloads这个文件默认保存路径这个选项即可,配置完成后,将其保存为一个文本文件,如aria2.conf。然后可以通过启动参数:--conf-path来启动它:

      .aria2c --conf-path=aria2.conf

    注意:这个配置文件里面有一个配置项,input-file=aria2.session,表示的是保存未完成的会话,启动的时候会读取该文件来获取上次未完成的任务,如果没有缺少这文件会无法启动,因此我们必须判断下这个文件是否存在,如果没有,则需要手动创建一个。

    RPC交互

    Aria2的交互协议是json-rpc,可以通过http和websocket两种方式来进行交互,它支持的交互方法可以参考官方文档Aria2 Methods,一个简单的示例如下:

    {
        "jsonrpc""2.0",
        "id""1",
        "method""aria2.addUri",
        "params": [
            [ "http://127.0.0.1:8000/www/123.jpg" ]
        ]
    }

    也可以加一些参数

    {
        "jsonrpc""2.0",
        "id""1",
        "method""aria2.addUri",
        "params": [
            [ "http://127.0.0.1:8000/www/123.jpg" ]
            "dir""r:/downloads" }
        ]
    }

    返回结果为:

    {
        "id""2",
        "jsonrpc""2.0",
        "result""c470acbc661144b2"
    }

    错误消息:

    {
        "id""2",
        "jsonrpc""2.0",
        "error": {
            "code"1,
            "message""The parameter at 0 has wrong type."
        }
    }

    外,如果是websocket的方式下,还可以收到一些通知消息:

    {"jsonrpc":"2.0","method":"aria2.onDownloadStart","params":[{"gid":"44e38580434f9496"}]}
    {"id":null,"jsonrpc":"2.0","error":{"code":-32600,"message":"Invalid Request."}}

    限于篇幅所限,这里只进行了一些基本的介绍,其rpc都是遵循json-rpc格式的消息,是非常容易解析和理解的,在后面的博文里,我会再详细介绍下其常用接口功能,打造一个简单的下载工具。

    参考文档

    主要文档:

    一些国内的博客文章也是较好快速上手指南

  • 相关阅读:
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    Atitit.文件搜索工具 attilax 总结
    Atitit.文件搜索工具 attilax 总结
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
  • 原文地址:https://www.cnblogs.com/TianFang/p/12823107.html
Copyright © 2011-2022 走看看