403となっているのかを調査しましょう。HTTPプロキシを立てて通信を観察することにします。通常のHTTP通信は以下のように行われます。今回は、通信内容を確認するため、以下のようにプロキシを経由するようにします。プロキシソフトウェアは、インタラクティブな操作で通信内容を確認できるmitmproxyを使います。mitmはman-in-the-middle(中間者)の略です。インストール方法やプロキシの設定方法は以下の記事などに書いてありますが、この記事でも説明します。https://qiita.com/wtotw/items/69290b178371c4d7cf76前提条件PCとiPhoneは同一ネットワークに接続しておいてください。iPhoneからPCに到達可能ならOKです。PCのIPアドレスは固定しておいたほうが良いです(必須ではありません)。mitmproxyでインストールできます。mitmproxyでも入ります。「手動」を選んで以下のようにプロキシを設定します。プロキシを設定したあとは必ず右上の「保存」ボタンを押しましょう。mitmproxyだけで起動します。証明書のインストールと有効化ニコニコ動画の通信は最近HTTPS化されました。HTTPS通信の内容を見るためには、証明書のインストールと有効化が必要です。アクセスしてAppleのマークをタップすることで証明書をインストールします。この証明書はインストールしただけでは使えません。証明書の有効化(信頼設定)が必要です。オンにしておきましょう。使い方mitmproxyを起動している状態でiPhoneから適当なサイトを開いてみましょう。コンソールにHTTP通信のリストがずらずらと表示されるはずです。上下キー(もしくはj/kキー)でカーソルを移動してEnterキーを押すとその通信の詳細を見ることができます。qキーを押すと元の画面に戻ることができます。iNicoの通信エラーを確認するそれでは、iNicoを開いて適当な動画を再生してみましょう。403が返ってくることが確認できました。APIにアクセス動画本体にアクセスという通信を行っていることが分かります。APIのレスポンスから取得しています。getflvのレスポンス例は以下の通りです。以降のURLを動画URLとして再生しようとしているようです。403エラーとなってしまいます。動画の新仕様ニコニコ動画の新しい仕様は以下の記事にまとまっています。https://qiita.com/tor4kichi/items/91550a71119f3878bfbaこの記事によると、動画再生ページ(/watch/smXXXXXXXX)の中に動画情報がJSONで埋め込まれているとの記述があるので、PCのウェブブラウザで確認してみましょう。適当な動画ページをPCで開いて開発者ツールを起動し、コンソールに以下のコードを打ち込みます。JSON.parse(document.querySelector('#js-initial-watch-data').attributes['data-api-data'].value)このコードはページに埋め込まれているJSONをパースしているだけです。実行すると、動画情報がツリー形式でコンソールに表示されるはずです。従来の動画サーバーに関する情報がそれぞれ格納されています。双方の特徴は以下の通りです。403エラーにならず、正しく再生されることが分かります。APIは仕様変更に追従していなかったのでしょう。通信内容を書き換えるmitmproxyは通信内容を見るだけでなく書き換えることもできます。レスポンスを書き換えることで、iNicoで動画を再生できるようになると考えられます。mitmproxyでレスポンスを書き換えるには、iキーを押して中断する通信のパターンを入れて通信を止めてから、Enterキーを押して通信を表示してeキーで入力を編集して......と手動で行うこともできますが、編集している間にタイムアウトして失敗してしまいます。mitmproxyはPythonスクリプトで通信の書き換えなどを自動化することができるので、これを使いましょう。以下にコードを示します。通信1件に関するやり取り(リクエストやレスポンス)が格納されています。内のURLをスクレイピングして辞書に格納する関数です。APIのレスポンスを書き換える関数です。Pythonで正規表現やJSONを扱う程度のコードなのでそこまで難しいことはやっていないはず。したとき、mitmproxyを以下のように起動すると自動でレスポンスが書き換わります。script.pyまた、動画本体はHTTPSの暗号化および復号化処理の負荷が大きく、そもそも不要なので、動画を配信するホストはプロキシを無視するオプションを加えておきましょう。".sv.nicovideo.jp:443"これでiNico上で動画が正常に再生されるようになりました。VPNに透過プロキシを置くしかしまだまだ問題点はあります。外出中に動画を見ることができません。VPNはWi-Fi接続かどうかにかかわらず使用することができます。そこで自分は、自前VPN接続の経路の後にmitmproxyを透過プロキシモードにして通信を通すようにしました。VPNの構成は千差万別ですのでVPNサーバーの構築方法はこの記事では割愛しますが、iptablesの設定によるルーティングは参考になりそうなので共有しておきます。チェインのルールは以下の通りとなります。12345mitmproxyのコマンドラインは以下の通りとなります。コマンドを使用しています。systemdなどでデーモン化しておくと良いでしょう。これで外出先からでも簡単に動画を楽しむことができます。用いてURLを書き換えました。用いたURL書き換えはハートビート処理など複雑な処理が多いので本記事では割愛させていただきますが、スクリプトはGistに全部載せましたので参考にどうぞ。自分はこれを実際に使っています。30件ほどしか表示されない視聴履歴の件数を100件に増やす処理もオマケでつけました(プレミアム会員のみ?)。https://gist.github.com/gssequence/c7c90d0c16a3e7a30fa5c27cbd7ac5e9〆お気に入りのアプリが(非公式だから仕方ないとはいえ)いきなり使えなくなってしまったのはショックでしたが、意外となんとかなって安心しました。スマートフォン上などで盛んに行われているHTTP通信。どのような通信があるのかを眺めてみるだけでも楽しいですよ。試してみてください2。