百度云盘虽然好, 但是保不齐哪天东西就被删除了. 所以打算搭一个自己的离线下载工具

虽然有Windows电脑可以一直开着, 用百度云客户端来实现推送. 但是如果想在Raspberry Pi或OpenWRT等小设备上跑的话, 还是需要用Linux.

1 Aria2 安装

在Linux下可以装aria2跑成daemon方式, 监听jsonrpc

sudo apt-get install aria2
aria2c --enable-rpc --rpc-listen-all --rpc-allow-origin-all --dir ./storage -D

顺便提一句, aria2也是可以独立运行的, 特别值得使用-i参数, 可以从一个URL列表里批量下载.

1.1 安装 webui-aria2

由于默认的aria2是不带GUI的, 所以需要一个WEB UI.

git clone https://github.com/ziahamza/webui-aria2
python -m SimpleHTTPServer 7777 #也可以使用Apache

然后访问这台机器的7777端口就可以了, 注意需要设置一下aria2的地址.

如果需要临时使用的话, 可以直接访问http://ziahamza.github.io/webui-aria2/, 配置数据是存在本地浏览器的, 不需要注册.

1.1.1 或者 YAAW (不推荐,但有Chrome插件)

git clone https://github.com/binux/yaaw
python -m SimpleHTTPServer 7777 #也可以使用Apache

另外, 可以使用http://aria2c.com/, 反正数据是存在浏览器上的, 可以应急用一用.

1.2 OpenWrt 上挂载 NAS 提供服务

参考http://wiki.openwrt.org/doc/howto/cifs.client

opkg install kmod-fs-cifs kmod-nls-utf8 kmod-nls-base kmod-crypto-hmac kmod-crypto-md5 kmod-crypto-misc cifsmount

然后可以这样挂载Samba

mount -t cifs //cifs-server/share /localfolder -o user=username,password=password

mount -t cifs '\\cifs-server\share' /localfolder -o guest,iocharset=utf8,file_mode=0777,dir_mode=0777,nounix,noserverino

mount -t cifs '\\cifs-server\share' /localfolder -o user=username,password=password,iocharset=utf8,file_mode=0777,dir_mode=0777,nounix,noserverino

1.3 jsonrpc 密码验证

使用 --rpc-secret=xxxxxx

  • URL: http://token:xxxxxx@host:port/jsonrpc

使用 --rpc-user=user --rpc-passwd=pwd

  • URL: http://user:pwd@host:port/jsonrpc

v1.18.4新增了 --rpc-secret ,设置的RPC授权令牌, 取代 --rpc-user--rpc-passwd 选项

1.4 在OpenWrt上部署示例

mkdir /etc/aria2/
touch /etc/aria2/aria2.session

把以下内容添加到/etc/rc.localexit 0之前:

aria2c --enable-rpc \
--rpc-listen-all \
--rpc-allow-origin-all \
--dir /mnt/ \
--continue=true \
--disable-ipv6=true \
--input-file=/etc/aria2/aria2.session \
--save-session=/etc/aria2/aria2.session \
--save-session-interval=60 \
--rpc-listen-port=6800 \
--rpc-secret=<your_secret_here> \
--max-tries=0 \  #用于处理如百度云盘不时挂掉的情况
--max-concurrent-downloads=3 \
-D

然后jsonrpc的URL即是http://token:<your_secret_here>@host:6800/jsonrpc

2 Firefox/Chrome+百度云配置

3 Firefox 配置

安装Flashgot.

在Flashgot里新建一个Download Manager, 比如叫aria2rpc, 调用自己写的aria2rpc程序(代码见下面), 然后URL模板如下:

[--cookie COOKIE] [--output FNAME] --rpc http://<URL_TO_aria2_Server>:6800/jsonrpc [URL]

当然, 如果本地电脑上可以装aria2的话, 貌似Flashgot是直接支持的, 内嵌有模板.

配置好之后, 在需要下载的链接上右键, 使用FlashGot下载即可. 快捷键是Alt+Click.

3.1 aria2rpc

以下代码的出处见此页面, 以下搬运Python和Bash版本, 原文中还提供Go版本.

3.1.1 Python版

#!/usr/bin/env python2
   
import json, urllib2, sys
from argparse import ArgumentParser
   
parser = ArgumentParser()
parser.add_argument('-c', '--cookie', help='use cookies', type=str,
                    default='', metavar='COOKIES', dest='cookies')
parser.add_argument('-o', '--output', help='output name', type=str,
                    default='', metavar='NAME', dest='output')
parser.add_argument('-d', '--dir', help='dest dir', type=str,
                    default='', metavar='DIR', dest='dir')
parser.add_argument('-r', '--rpc', help='aria2 rpc (http://localhost:6800/jsonroc)',
                    type=str, default='http://127.0.0.1:6800/jsonrpc',
                    metavar='URL', dest='rpc')
parser.add_argument('URIs', nargs='+', help='URIs', type=str,
                    default='', metavar='URI')
opts = parser.parse_args()
   
jsondict = {'jsonrpc':'2.0', 'id':'qwer',
        'method':'aria2.addUri','params':[opts.URIs]}
   
aria2optsDefault={
        'continue'                  :'true',
        'max-connection-per-server' :'15',
        'split'                     :'15',
        'min-split-size'            :'10M'}
   
aria2opts = {}
aria2opts.update(aria2optsDefault)
   
if opts.output:
    aria2opts['out'] = opts.output
if opts.dir:
    aria2opts['dir'] = opts.dir
if opts.cookies:
    aria2opts['header'] = ['Cookie: {0}'.format(opts.cookies)]
   
jsondict['params'].append(aria2opts)
   
jsonreq = json.dumps(jsondict)
print jsonreq
urllib2.urlopen(opts.rpc, jsonreq)

3.1.2 Bash版

#!/bin/bash
usage='Usage: aria2rpc.sh [-c COOKIE] [-d DIR] [-o NAME] URL [URL..]'
  
while [[ -n "$1" ]];do
  case "$1" in
    -c|--cookie) shift; cookie="$1" ;;
    -d|--dir) shift; dir="$1" ;;
    -o|--out) shift; output="$1" ;;
    -r|--rpc) shift; rpc="$1" ;;
    -h|--help) echo "$usage"; exit ;;
    *) uris[$((i++))]="$1" ;;
  esac
  shift
done
  
if ((${#uris[@]}==0));then
  echo "$usage"
  exit
fi
URIs=$(IFS=, ;echo "${uris[*]}"|sed 's/,/","/g;s/^/"/;s/$/"/')
  
if [[ -z "$rpc" ]];then
  rpc='http://127.0.0.1:6800/jsonrpc'
fi
  
Options="{"
if [[ -n "$cookie" ]];then
  Options="$Options"'"header":["Cookie: '"$cookie"'"],'
fi
if [[ -n "$dir" ]];then
  Options="$Options"'"dir":"'"$dir"'",'
fi
if [[ -n "$output" ]];then
  Options="$Options"'"out":"'"$output"'",'
fi
Options="${Options%,}"
Options="$Options""}"
  
jsonTemplate='{"jsonrpc":"2.0","id":"qwer","method":"aria2.addUri","params":[['"$URIs"'],'"$Options"']}'
  
curl -X POST -d "$jsonTemplate" --header "Content-Type:application/json" "$rpc"

4 参考

4.1 推荐的电影站

TODO

  • FlashGot不依赖脚本, 直接工作
  • OpenWrt 同步 Dropbox