搜索
查看: 3017|回复: 8

[网络] 使用WebSocket/RPC协议调用aria2,据说比迅雷强10倍

[复制链接]

170

主题

2505

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13758
发表于 2017-12-15 06:42:12 | 显示全部楼层 |阅读模式
这东西跟chrome一样,也是使用WebSocket + JSON-RPC 2.0协议,
使用标准库中新增的 web.socket.jsonClient 可以轻松搞定,我写几个简单的调用,更多的接口大家可以看看文档:
https://aria2.github.io/manual/en/html/aria2c.html#rpc-interface
其实接口挺简单的。

为了偷懒,直接把 chrome的例子复制过来改了几句:
import win.ui;
/*DSG{{*/
var winform = win.form(text="调用aria2 JSON-RPC接口";right=770;bottom=467)
winform.add(
btnConnect={cls=
"button";text="连接aria2";left=592;top=325;right=734;bottom=370;db=1;dr=1;z=5};
btnSend={cls=
"button";text="调用aria2下载文件";left=592;top=381;right=734;bottom=426;db=1;dr=1;z=3};
txtData={cls=
"edit";text="http://download.aardio.com/aardio/aardio.7z";left=29;top=384;right=582;bottom=423;db=1;dl=1;dr=1;edge=1;multiline=1;z=2};
txtMessage={cls=
"edit";left=29;top=22;right=741;bottom=318;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;z=1};
txtUrl={cls=
"edit";text="ws://127.0.0.1:6800/jsonrpc";left=29;top=329;right=582;bottom=368;db=1;dl=1;dr=1;edge=1;z=4}
)
/*}}*/

import web.socket.jsonClient;
var ws = web.socket.jsonClient();

//生成并自动添加API密钥
ws.token = string.random(10);
ws.rpc.beforeRequest =
function(reqData){
    table.insert(reqData.params,
"token:" + ws.token);
   
return reqData;
}

//监听aria2事件
ws.on("aria2.onDownloadStart",function(param){
   
    winform.txtMessage.print(
"aria2.onDownloadStart,原因:"+web.json.stringify(param));
})

//打开连接触发的事件
ws.on("open",function(){
    winform.txtMessage.print(
"已打开连接")      
})

ws.on(
"close",function(){
    winform.txtMessage.print(
"已关闭连接")      
});

ws.on(
"error",function(err){
    winform.txtMessage.print(
"出错了",err);
});  

//调用aria2打开一个网页
winform.btnSend.oncommand = function(id,event){
   
    ws.aria2.addUri({winform.txtData.text}).end =
function(result,err){
        
if(err)
            winform.txtMessage.print(
"下载出错了",web.json.stringify(err))
        
else {
            winform.txtMessage.print(
"成功添加任务",web.json.stringify(result))
        }
        
    }
}

//连接aria2
winform.btnConnect.oncommand = function(id,event){
    ws.connect(winform.txtUrl.text);
}  

winform.onClose =
function(hwnd,message,wParam,lParam){
    ws.aria2.shutdown();
}

import process.popen;
var prcsAria2c = process.popen("\aria\aria2c.exe"
    ,
`--enable-rpc --rpc-listen-all `
    +
` --dir="` + io.createDir("/downloads") //默认下载目录
    +`"  --rpc-listen-port=` + 6800 + ` --rpc-secret=`+ws.token )
   

winform.show();
win.loopMessage();


回复

使用道具 举报

170

主题

2505

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13758
 楼主| 发表于 2017-12-15 15:48:28 | 显示全部楼层
aria2虽然使用GPL开源许可证,但GPL有一个例外是隔离的进程使用套接字、命令行通信不受传染,两个隔离的进程聚合在一起也不受GPL传染,一个例子aria2官网上的 webui-aria2 也是使用宽松的MIT开源许可证、未受GPL影响。而且aria2启动后未在命令行窗口输出任何版权声明,所以可以直接管道后台调用,不显示窗口不违反GPL。

回复

使用道具 举报

1

主题

62

帖子

1457

积分

新手入门

积分
1457
发表于 2017-12-15 08:14:31 | 显示全部楼层
测试无法成功下载,信息:
已打开连接
成功添加任务        "c5fbd3a1d7529c04"
aria2.onDownloadStart,原因:[{"gid":"c5fbd3a1d7529c04"}]
出错了        Failed to execute "_recvData"
出错了        Failed to execute "send/sendData"
已关闭连接

使用的是官网的最新版(aria2-1.33.1-win-32bit-build1)和一个稍早的版本(返回结果相同),系统版本是win7 32bit
回复

使用道具 举报

170

主题

2505

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13758
 楼主| 发表于 2017-12-15 08:18:55 | 显示全部楼层
松江 发表于 2017-12-15 08:14
测试无法成功下载,信息:

使用的是官网的最新版(aria2-1.33.1-win-32bit-build1)和一个稍早的版本(返回结 ...

从你提供的信息,你已经成功添加下载了,
下载成功才有gid,onDownloadStart就是下载开始了,

你后面的send出错,是断线了。
断线就重新连接一下。

我只是演示一下,怎么隐藏aria2的窗口,
你可以把process.popen改成process,不要用管道,看具体的错误原因。

回复

使用道具 举报

1

主题

62

帖子

1457

积分

新手入门

积分
1457
发表于 2017-12-15 08:32:12 | 显示全部楼层
Jacen.He 发表于 2017-12-15 08:18
从你提供的信息,你已经成功添加下载了,
下载成功才有gid,onDownloadStart就是下载开始了,

谢谢,按您的指点,查看出错信息提示居然是不支持ws??
12/15 08:27:49 [NOTICE] IPv4 RPC: listening on TCP port 6800                       
                                                                                   
12/15 08:27:57 [ERROR] CUID#9 - Download aborted. URI=ws://127.0.0.1:6800/jsonrpc  
Exception: [AbstractCommand.cc:351] errorCode=1 URI=ws://127.0.0.1:6800/jsonrpc   
  -> [InitiateConnectionCommandFactory.cc:88] errorCode=1 ws is not supported yet.
                                                                                   
12/15 08:27:57 [NOTICE] Download GID#03a3edbf1d4608f6 not complete:               
                                                                                   
           

但我下载的是最新版的呀?
能否共享您用的版本呢?
回复

使用道具 举报

170

主题

2505

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13758
 楼主| 发表于 2017-12-15 08:34:20 | 显示全部楼层
松江 发表于 2017-12-15 08:32
谢谢,按您的指点,查看出错信息提示居然是不支持ws??

但我下载的是最新版的呀?

这句话的意思不是说不支持ws,
而是你去下载ws://127.0.0.1:6800/jsonrpc  这个地方,这玩意怎么下载?!
所以他说不支持, 你是不是把网址什么东西搞错了地方
回复

使用道具 举报

170

主题

2505

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13758
 楼主| 发表于 2017-12-15 08:35:13 | 显示全部楼层
哦是我写错了,添加下载的地方,写成了下载 ws://127.0.0.1:6800/jsonrpc
应当是 ws.aria2.addUri({winform.txtData.text})
回复

使用道具 举报

1

主题

62

帖子

1457

积分

新手入门

积分
1457
发表于 2017-12-15 08:38:31 | 显示全部楼层
Jacen.He 发表于 2017-12-15 08:35
哦是我写错了,添加下载的地方,写成了下载 ws://127.0.0.1:6800/jsonrpc
应当是 ws.aria2.addUri({winfo ...

嗯,对的,谢谢
回复

使用道具 举报

0

主题

1

帖子

17

积分

新手入门

Rank: 1

积分
17
发表于 2017-12-15 13:36:39 | 显示全部楼层
aria2 是个好东西 一直在用 以前就写了个 批量下载小工具 用来下载资源 尤其对现今各大网盘的无脑限速 有特效
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-7-17 21:54 , Processed in 0.062500 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表