in other client

社内LT配信システムの紹介

ドワンゴ 技術コミュニケーション室のsaka1です。

この記事では、社内で用いられているLightningTalk(LT)用のライブストリーミングシステムについて紹介したいと思います。 LTは普段こんな感じで行われています。

エンジニアのLT風景

実は、社内ではLTの開催形式について見直しが行われつつあります。 記事の執筆時点ではまだこのシステムは使われていますが、ライフサイクルとして末期かもしれません。 せっかくなのでシステムがどういったものだったかについての記録を残したいと思い、記事を書くことにしました。

記事ではまず、なぜシステム開発が必要だったかについて簡単に説明し、次にシステムの技術的詳細について紹介していきます。

LT運営にどういった課題があったか

エンジニア有志が参加するLT会はそれまでも定期開催されていたのですが、エンジニアの人数が増えるにつれて、 一つの会議室に全員が物理的に集合してLTを開催するのは難しくなっていました。 同じWebエンジニアであっても働くフロアやビルが違うという状況がある中、 せめて発表はライブストリーミングの形で手軽に見たいよね、という要望がずっと出ていました。

そこでLT運営チームは、ニコニコ生放送(ニコ生)のdev版を使った配信を 試してみたのですが……LTが社内ライブ配信されるのは便利だと分かったものの、課題が見つかりました。

  • あくまで開発環境なので安定している保証がない
    • 例えば次のリリースに向けたデプロイがされると、LT配信が壊れてしまう可能性がある
    • かといってLTのために開発を止めるのは本末転倒になってしまう

つまり、開発環境に開発以外のことを相乗りさせようとしているのが筋悪だということです。 じゃあもう1つニコ生があればいいのか? というとそれも難しそうでした。 ニコ生は非常に多機能なシステムなので、LTのためだけにもう一つのdev環境を準備するのはとても現実的ではありません。

困った上司はsaka1に「社内LT配信のシステム作ってよ!!」 「映像が流れて、あとコメントも出せるといいな!!」と言ってきたのが開発の始まりです。

求められていたシステムはどんなものか?

改めて要件を整理すると、次のようなLT配信システムが求められていることが分かりました。

  • LT現場のカメラ映像をPCブラウザから視聴できるページを作ること
  • コメント(いわゆるニコニコ風の、画面オーバーレイ型の流れるコメントです)を流せること
  • 低コストで作ること
    • インフラにかかる費用を最小化したい(LTしてない時はリソース利用を止めたい)
    • このシステム自体の開発にもあまり工数を割きたくない

早い安いうまいを実現してくれという感じで困った要求ですが、これをなんとか具現化していくことになりました。

何を作らないことにしたか

システムの構成について紹介する前に、何を しなかったか について述べさせてください。 LT配信システムは通常のWebシステム開発ではしないような割り切りを入れています。一般論としてアンチパターンに近いものもあるかもしれません。

  • 中・大規模配信への対応をしない
    • 社内向けなので同時配信数はどんなに多くても100〜200ぐらいという想定でした
    • したがって複数ノードによる配信やCDNの利用は考慮外としました
  • 高可用性は考えない
    • 冗長化などはしませんでした。たとえLTが見れなくなっても業務に支障は出ないためです
  • データの永続化をしない
    • 詳細は後述しますが、コメントはインメモリで保持します。例えばサーバを再起動すると揮発してしまいますが許容することにしました
    • 配信された映像の保存は配信機器側で行うことにしました
  • UIはごく単純に
    • 流すコメントは別で取ってくることにして、視聴画面には映像があるだけという作りにしました

別の言い方をすると、今回の開発ではスコープをできる限り絞り込んだことによって、ごく単純な構成を手に入れているという側面があります。

具体的なシステム構成について

とにかく手早く作ることを求められたので、既製品を最大限に流用することにしました。

LTシステム構成図

システムはアプリケーションサーバと映像配信サーバから構成されます。 アプリケーションサーバ……と言いつつ静的アセットの配信も行うサーバデーモンですが、Sinatraで書かれています。 クライアントにはJavaScriptで書かれた視聴アプリを配信し、 クライアントは映像配信サーバをHLS受信します(ライブラリとしてはhls.jsを用いた普通のHLS配信です)。

アプリケーションサーバはオンプレミスの仮想化環境に、映像配信サーバはAWSにあります。 映像配信サーバは、LTが行われていない時にはインスタンス停止することで無駄な費用が発生するのを避けています。 (意図したわけではないのですが)ハイブリッドクラウドでいいとこ取りをしようというような構成になってしまいました。

以降、機能別にポイントを挙げていきます。

ライブストリーミング

映像配信サーバにはWowza on AWSを使うことにしました。 ドワンゴはVOD/LIVEの映像ストリーミングを業務で扱っている会社ですので、 内製の配信サーバやライブラリもあるのですが、今回はあえて市販品を使うことにしました。

  • 内製の配信サーバは明らかにオーバースペックで、利用するメリットがあまりない
    • 社内LTで1000番組を同時配信!! とかやらないので……
  • WowzaはAMIの有償サブスクリプションで利用できるので、インスタンスを構成するコストが低い

などの理由によります。Wowzaは基本的に扱いやすくいい子です。今回の用途には十分適合してくれました。

コメント

コメントについての問題は2つあり、コメントをクライアントでどう描画するかと、コメントをどこから取得してクライアントに流すかです。

ニコニコ風の画面にオーバーレイする形で流れるコメントですが、実はコメントを正しく描画するのは簡単ではないことが知られています。 筆者もあまりよく知らないのですが、いくつものルールを守らないと「らしく」ならないそうです。

幸いなことに、社内には生放送向けコメント描画エンジンのJavaScriptライブラリが整備されていました。 ライブラリはReactコンポーネントの形になっていたので、ニコ生の開発チームから使い方を聞いて組み込むと、 あっさり本物の描画ができるようになりました。

コメントの取得については、次のような仕組みをざっと作りました。

  • SlackのLTチャンネルへの投稿をリアルタイムで吸い、アプリケーションサーバにPOSTするSlack Appを書く
    • Rubyのgemを使いReal Time Messaging APIから投稿を吸い上げるようにしました
  • APIサーバは最新のコメント何件かをメモリに保持する
  • クライアントはアプリケーションサーバをポーリングし、新着コメントが受信できたら表示する
    • 新着分を認識するために、サーバ側でコメントにシーケンシャルなIDを採番して付けています

非常に原始的な仕組みではあるものの、単純な実装で期待した挙動になってくれているようです。

その他、細かな工夫

映像配信の設定チューニング

映像配信のトランスコード設定などは、ちょっとだけ調整しました。といっても、ほとんどがWowzaのデフォルトです。

LTは動きが少なく文字などが多い傾向にあるため、ビットレートに対して解像度を大きくした方が画質が良く見えるようです。 また、リアルタイム性を改善するため、HLSのセグメント長を多少縮めた気がします(配信の遅延が大きすぎると、現地組と映像視聴組でSlackの話題がずれるという問題がありました)。 あとはABRを有効化しておきました(WowzaのUIをポチポチするだけです)

AWS側の構成管理

AWS側の構成管理はTerraformを使っています。 実際のところインスタンスが一つ立っているだけなのですが、AWSからの配信を社内限定にするために、 アクセス元IPのホワイトリストの管理が必要だったりと、この規模でさえ適当に手構築するよりTerraformを使った方が便利だったように思います

管理機能

アプリケーションサーバにはいわゆる管理機能がついています。具体的には映像配信サーバのインスタンス起動・終了をUIからできるようにしてあります

LT配信システムを導入してみてどうだったか

それなりに便利だと好評を得られました。……さらに、思いがけない副次的な利用が発生することもありました。 このシステムは本来エンジニアのLTのために作られたわけですが、他にも例えばディレクターの発表会など、社内に向けて映像を発信したいという需要はそれなりにあったらしく、LTではない場面で活用されるケースも出てきています。

まとめ

社内で用いられているLTライブストリーミングシステムについて紹介しました。 Wowzaを立ててブラウザに映像配信という程度であればとても簡単にできるので、おすすめです。

Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siS7kijk6O939yp8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siS7kijk6O939yy8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siS7kijk6Ogpt908dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSUCOs6oTki7b-F6IXYu8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSUCjk8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=1118nFXXi6sdqk8FCSBdkFuSBdkFuF8TdTHT6Bnw1118nFXXi6sdqk8FCST6Bntpt55t000SbB6sw0bCXawbnXnYuwhV-5hO-NhO-8-hO-O-h8-ghO-LhO-NJh8-tJhO-R-hO-yh8-yhO-O-hO-R-
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSUCjkOttN58dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSUCjkOttNg8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2skYYjksq8UkiPX8s6oSkinXj6nSWuFXI7s6auHBuFXkYc-awpIN5ajNp0Nt0tyatMsMt905IytM55MNpOtsMIy0uItNI99N5yjs95903ja9psNI50bs6auwMMbBXUiwMj9tgMpI3gaMyu3jMjp30M9uusp0yN9gbikouBTksuwUkiPXOuBsOYXBnOTsbCFYwdnnTh3LhM8-hM8-TkiPXi8UkiPX8s6ohM8-rXiaXkia6iUsduhM8-
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSUCjkOttNp8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSUCjkOttNy8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSUCjkOtttN8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2kinuiik8uF6nuFuBn8iunSH16FawhO-gh50hp8-
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2Ukou8T6FnkYVT6quo6i8s6oSiu1T6quo6iBikTSnsS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSi6nXsuO3y005p8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2uPPu81ujYX68PTSFkiqXiUSs6oTCnuFSsoT7USMNtyNpt9
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSi6nXsuO3y00pN8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSi6nXsuO3y9p908dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=uF6IYkBdg8jY6UtMN8IsM8s6oSjY6UVuinF7VgN38dnoYvo6Fu
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSi6nXsuO3y9p9g8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=21118U66UYunkUokikUuF8s6oSiB8dnoYHXaw4-G-l-Vv-R-l-yMv-
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSi6nXsuO3y9py38dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=211181ujYX68PTSFkiqXiUSnFkXiSqjBqESMNttNgNy
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSi6nXsuO3y9py98dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN95p8dN8siSi6nXsuO3y9pyM8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=k7kNMNy8BokFnVa6CUk8o6jXSjY6UVuinF7VMptpM8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2uPPu81ujYX68PTSFkiqXiUSs6oTCnuFSsoT7USMNt3N0M0
Better site: ProxyBot webproxy https://proxybot.cc/b?q=21118U66UYunkUokikUuF8s6oSiB8dnoYHXaw4-G-l-Vv-R-l-yMv-
Better site: ProxyBot webproxy https://proxybot.cc/b?q=BkoCFkXU6kY8a66FjY6U8PTSHTw9
Better site: ProxyBot webproxy https://proxybot.cc/b?q=sFukn6F8a1kiU68s68PTSt30p38dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9908dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9958dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9998dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9M08dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9M38dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1ui8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1uiOt30M0Mt8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1uiOt3930t58dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1uiOt3995N08dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1uiOt3M353g8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1uiOt3tggNN8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2BTkiqjkiU8s6oS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1uiOt3y9g9g8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2uPPu81ujYX68PTSFkiqXiUSs6oTCnuFSsoT7USMNt9tNNM
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1uiOt3yM0gy8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1uiOt3yM5308dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1uiOtM9pt3M8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1uiOtMpy5508dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS1uiOtMytNg58dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS7kijk6Oyp9308dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=PT8kW98Q7ESWSfSS1118ndXBkW8s6oSWXau6Stg593MS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS7kijk6Oyp93y8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siS7kijk6Oyp99t8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSUCjk8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSUCjkO5598dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSUCjkO55N8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSUCjkO55t8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2rda8y58s6oSBdkiUTCsBS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSUCjkO55y8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSi6nXsu8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSi6nXsuO30ygt98dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSi6nXsuO30ygtM8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSi6nXsuO3303008dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSi6nXsuO3303098dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSi6nXsuO33030y8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSi6nXsuO33Ny9M8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSi6nXsuO33Ny9t8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9MM8dN8siSi6nXsuO3yypp58dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=IkTT6Fi8ouSuBStNpgMy00SR-kCskBXkiOd66quFOf-uBn7Of-XsuOICsquaOjFCnkYY7OXi
Better site: ProxyBot webproxy https://proxybot.cc/b?q=21118U66UYunkUokikUuF8s6oSiB8dnoYHXaw4-G-l-Vv-R-l-yMv-
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9N08dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9N58dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=1118UkiPX8s6oSUP1BkYus3tMS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9NN8dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9g08dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9gy8dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p38dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS1ui8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS1uiOt30y5N98dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS1uiOt393t9t8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS1uiOt399M5p8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS1uiOt399MpN8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS1uiOt39gg598dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=211181ujYX68PTSFkiqXiUSkskauoXsS6nFqBSMNtNN9MM
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS1uiOt3gMMpg8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=IXiqXdkiaokau8jY6UBT6n8s6oS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS7kijk6O595NN8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS7kijk6O59MN98dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=TCFuY6YXVduinkX8Q7ESTkUuSpS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS7kijk6O5MMN38dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS7kijk6O5MN5t8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siS7kijk6O5Mp958dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siSUCjkOtMMM8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siSUCjkOtMMN8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=211181ujYX68PTSFkiqXiUSkskauoXsS6nFqBSMNNpNpty
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siSUCjkOtMMt8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2uPPu81ujYX68PTSFkiqXiUSs6oTCnuFSsoT7USMNt0NpMt
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2T6quo6iouEkBnkF8s6oSuWuinS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2ui81XqXTuaXk86FUS1XqXS2-okYYVn66nduaOTkYoOsXWun
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siSi6nXsu8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2WFo8auWS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=1118o7j6iuF8s6oSTYS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siSi6nXsuOM0gyy38dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2IXCVWF681XqXTuaXk86FUS1XqXS2-6nXokk
Better site: ProxyBot webproxy https://proxybot.cc/b?q=Y6WuBdkoC8jY6UBT6n8s6oS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2uPPu81ujYX68PTSFkiqXiUSs6oTCnuFSsoT7USMNtyN0Mp
Better site: ProxyBot webproxy https://proxybot.cc/b?q=NNXkoUCiakoNN8jY6U8IsM8s6oSjY6UVuinF7V3g8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siSi6nXsuOM0gyyN8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2CUk8T6Bns6aujkBu8s6oSi6auS99y3
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2uPPu81ujYX68PTSFkiqXiUSs6oTCnuFSsoT7USMNt9tttg
Better site: ProxyBot webproxy https://proxybot.cc/b?q=21118U66UYunkUokikUuF8s6oSiB8dnoYHXaw4-G-l-Vv-R-l-yMv-
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siSi6nXsuOM0p3tt8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siSi6nXsuOM5gy998dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2uPPu81ujYX68PTSFkiqXiUSs6oTCnuFSsoT7USMNtytMMg
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9p58dN8siSi6nXsuOMg505g8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9pN8dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9pp8dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2n18T6FnkYVT6quo6i8s6oSnuFo6ICBuS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9py8dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=21118U66UYunkUokikUuF8s6oSiB8dnoYHXaw4-G-l-Vv-R-l-yMv-
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9t58dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9y58dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=21118iuq6QQQ8s6oSWXau6SMg00Vhuyh5yh5ahu5hjMhjjhu5hkphk0hu5h5th5khuyhkahj5hu0h5php3huphkjhp5hugh55hjuhuyhk9hkjhu0hkahk3huyhk0hjphuyh5ahjjhu0h55hpNhu5h5Nh5thuyhj5hkjhughpkh59hu0h5Nhkghu9hjshj9hu9hjuhj08dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9yM8dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9yp8dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2sB81XqXTuaXk86FUS1XqXSZ-YXB
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NN9yy8dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NNM058dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NNM0M8dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NNM0N8dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NNM0t8dN8si
Better site: ProxyBot webproxy https://proxybot.cc/b?q=okjCsdXgg8jY6Ut3N8IsM8s6oS
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NNM0y8dN8siS1uiOt3399MM8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NNM0y8dN8siS1uiOt3399Mt8dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NNM0y8dN8siS1uiOt390t338dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=0NNM0y8dN8siS1uiOt3Mp3N08dnoY
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2uPPu81ujYX68PTSFkiqXiUSs6oTCnuFSsoT7USMNt0tNMp
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2ui81XqXTuaXk86FUS1XqXS8-6BBXYODCnnuOf-knX6ikYOl-6iCouin
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2jk6o6X8s6oSnkUSb-dVG-C8uTX
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2jk6o6X8s6oSnkUSA-6nnuFXk8uTX
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2jk6o6X8s6oSnkUSb-dsVf-dVZ-dkiU8uTX
Better site: ProxyBot webproxy https://proxybot.cc/b?q=2a1kiU68UXndCj8X6SkFnXsYuBSauWuY6TVYnVB7BnuoS