BTのダウンロード環境を作ってiPhoneからリクエストできるようにする
ゴール
iPhoneで発見したmanget link(magnet:?〜みたいなやつ)からBitTorrentを使ったダウンロードをできるようにする
使うもの
[aria2](https://aria2.github.io/index-ja.html)
[BeeBotte](https://beebotte.com)
[docker](https://www.docker.com/ja-jp/)
[Node-RED](https://nodered.org)
[iOSのショートカット.app](https://apps.apple.com/jp/app/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88/id915249334)
大雑把な構築の流れ
dockerを使ってaria2を使ったBitTorrentダウンロード環境を作る
BeeBotteでHTTPリクエスト(POST)をMQTTに変換できるようにする
Node-REDを使ってMQTT経由で受け取ったmagnet linkからaria2のJSON-RPCインターフェースを叩けるようにする
iOSのショートカット.appからBeeBotteへHTTPリクエスト(POST)を投げられるようにする
完成時の情報の流れとポイント
[iOSショートカット]-->(HTTP POST)-->[BeeBotte]-->(MQTT Pub)-->[Node-RED(MQTT Sub)]-->(JSON-RPC)-->[aria2]
ポイントはMQTT Pub/Subを使ってるところ。こうするといわゆる外部から内部への通信(というか外部起点の内部への通信)をなくす(いわゆるお家のルーターの穴あけをなくす)ことができる。
暗号化が気になる人もいるかも知れないけど(暗号化されてる経路は皆無)、所詮流れる通信はmagnet linkなので、一切気にしてない。
では作っていく
aria2の構築
docker-composeするだけ(以下、docker-compose.yamlの例)
version: "3.5"
services:
aria2-ui:
restart: unless-stopped
image: wahyd4/aria2-ui:latest
environment:
- ENABLE_AUTH=true
- ARIA2_USER=hello
- ARIA2_PWD=world
ports:
- "8080:80"
volumes:
- ./data:/data
ここで使ってるイメージだとWebUIがついてくるので一応動作検証的に、http://localhost:8080/にアクセスして諸々動作確認する
細かい設定は割愛するけど、「Download Path」と「JSON-RPC Server」が有効になってることは確認しておいたほうが良いと思う
Beebotteの設定
https://beebotte.comはMQTTのPublishができるので、これを使うことで直接ariaが動いてる宅内のLANへ接続しなくても(宅内から見て外→内方向の通信が無くても)いいようになるのがポイント
とりあえずサインアップ(割愛)
channelを作って(ここではariaという名前にする)、「uri」というリソースをその下につくる
![](https://assets.st-note.com/img/1708940824642-xN3qgeS9LX.png?width=1200)
Channel Tokenは後で使うのでメモっておく
とりあえずここまででおk
Node-REDの構築
公式のとおりにNode-RED導入
サービス化して常時起動状態にする
http://localhost:1880/にアクセスしてMQTT Subからaria2のJSON-RPCを叩けるようにする完成図は以下の通り
![](https://assets.st-note.com/img/1708940412992-KrYj7KZHdh.png?width=1200)
Beebotteのchannel作った時に発行されたChannel Tokenを使ってmqtt inの設定をする
トピックは「aria/uri(チャンネル名/リソース名)」にする
サーバとかのFQDNはbeebotteのドキュメントにあると思うけど、とりあえずこれを書いている2024/02/26時点では「mqtt.beebotte.com:8883」で動いてる
セキュリティタブのユーザ名に「Channel Token」を入れる
mqtt inの次はjsonノードでjavascriptオブジェクトにして、templateノードでaria2のjson-rpcが受け取れるようにする
{
"jsonrpc":"2.0",
"id":"1",
"method":"aria2.addUri",
"params":[
[
"{{{payload.data}}}"
]
]
}
最後はhttp requestでaria2のjson-rpcへリクエスト
完成品のフローのJSONは以下の通りまんまコピーしても使えるはず
[
{
"id": "f6f2187d.f17ca8",
"type": "tab",
"label": "Flow 1",
"disabled": false,
"info": ""
},
{
"id": "ed079068ca074d7d",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "aria/uri",
"qos": "2",
"datatype": "auto",
"broker": "841a0512cf92129a",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 70,
"y": 280,
"wires": [
[
"f0ad7a3db4e97033"
]
]
},
{
"id": "f0ad7a3db4e97033",
"type": "json",
"z": "f6f2187d.f17ca8",
"name": "",
"property": "payload",
"action": "obj",
"pretty": false,
"x": 210,
"y": 280,
"wires": [
[
"dfcb8badf8f97a44"
]
]
},
{
"id": "dfcb8badf8f97a44",
"type": "template",
"z": "f6f2187d.f17ca8",
"name": "",
"field": "payload",
"fieldType": "msg",
"format": "handlebars",
"syntax": "mustache",
"template": "{\n\t\"jsonrpc\":\"2.0\",\n\t\"id\":\"1\",\n\t\"method\":\"aria2.addUri\",\n\t\"params\":[\n\t\t[\n\t\t\t\"{{{payload.data}}}\"\n\t\t]\n\t]\n}",
"output": "json",
"x": 380,
"y": 340,
"wires": [
[
"44840953b3e63355"
]
]
},
{
"id": "44840953b3e63355",
"type": "http request",
"z": "f6f2187d.f17ca8",
"name": "",
"method": "POST",
"ret": "obj",
"paytoqs": "ignore",
"url": "http://hogehoge.local:8080/jsonrpc",
"tls": "",
"persist": false,
"proxy": "",
"authType": "",
"senderr": false,
"credentials": {},
"x": 550,
"y": 340,
"wires": [
[
"e00daa5d901a360d"
]
]
},
{
"id": "9a8237ad841952a1",
"type": "http in",
"z": "f6f2187d.f17ca8",
"name": "",
"url": "/aria_add",
"method": "get",
"upload": false,
"swaggerDoc": "",
"x": 190,
"y": 360,
"wires": [
[
"dfcb8badf8f97a44"
]
]
},
{
"id": "e00daa5d901a360d",
"type": "http response",
"z": "f6f2187d.f17ca8",
"name": "",
"statusCode": "",
"headers": {},
"x": 710,
"y": 340,
"wires": []
},
{
"id": "841a0512cf92129a",
"type": "mqtt-broker",
"name": "beebotte",
"broker": "mqtt.beebotte.com",
"port": "8883",
"tls": "",
"clientid": "",
"autoConnect": true,
"usetls": true,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willPayload": "",
"willMsg": {},
"sessionExpiry": "",
"credentials": {}
}
]
iOSのショートカット.appの設定
力尽きてきたので、もっと元気がある時に追記するけど、要はbeebotteのエンドポイント(http://api.beebotte.com/v1/data/publish/aria/uri)にmagnet linkの文字列をPOSTすればおk
POSTする時に気をつけるのはContent-Typeはapplication/jsonにすること、X-Auth-Tokenにbeebotteで発行されたChannel Tokenを入れること
POSTするときには{"data":"magnet linkの文字列"}になるように
最後に
幸運をいのる。ってかマジでこれじゃ俺の備忘録だな。