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」というリソースをその下につくる

  • Channel Tokenは後で使うのでメモっておく

  • とりあえずここまででおk

Node-REDの構築

  • 公式のとおりにNode-RED導入

  • サービス化して常時起動状態にする

  • http://localhost:1880/にアクセスしてMQTT Subからaria2のJSON-RPCを叩けるようにする完成図は以下の通り

MQTTで受け取ってJSON-RPCをhttpリクエストで叩く
  • 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の文字列"}になるように

最後に

幸運をいのる。ってかマジでこれじゃ俺の備忘録だな。

この記事が気に入ったらサポートをしてみませんか?