以前ツイキャス配信を見ていて、お茶をカウントするアプリを作ったら便利なんじゃないかなと思って、作成した。
プログラミングに興味ない人も、目次から気になるところだけでも見てほしい。
ちなみに現状これを配布するつもりはない。そのへんの理由についても説明できたらと思う。
また、コードを載せもしないので、そのつもりで見に来た人はごめんなさい。もっとライトな読み物だと思って欲しい。
今回のコンセプト
今回のコンセプトは「楽して作る」である。
依頼されて作るわけでもなく、自分で作ってみようと思ってノリと勢いで作り始めたものである。
なので手間や時間をかけたくない。まずこの前提があったことを覚えておいて欲しい。
それ故にちゃんとした設計もせず、いきなり実装している。この後実現方法でも書くが、今回行った方ではまあ実用レベルにはならないだろうなーと思いながら作り進めた。そんな言い訳がましい前置きをさせてもらう。
実現方法
自分の中で、パッと思いついた方法がいくつかあった。
①APIを使って、リアルタイムで投げられてきたアイテムの数を数える
②Webスクレイピングを使って、リアルタイムで投げられてきたアイテムの数を数える
③Webスクレイピングを使って、枠開始時点でのアイテムの数を数えておき、リアルタイムでその増えた量を数える
④Webスクレイピングを使って、アイテム履歴から開始時間~のアイテムの数を数える
実現方法①:APIでのリアルタイムカウント
①は、面倒くさそうと思ったが、一度調べてみた。似た様な事をスクリプト言語でやっている人がいた気がする。
スクリプト言語は使ったことないので、あんまり読みたくないし、使いたくないなーと思った。
ツイキャスAPIのドキュメントを読んでもみたが、アイテム取得に関する記載を見つけられなかった。
①が王道のパターンで、作成できたら一番実用的だとは思うが、以上の理由により他の方法での検討を進めることにした。
実現方法②:Webスクレイピングでのリアルタイムカウント
②は、視聴者目線だとアイテムは配信画面内に表示されるだけである。これに関してはWebスクレイピングで取得できないものと思われる。(ただのアニメーションだし)
配信者目線だと、コメント欄の部分にアイテム内容が表示されるとかあるのだったら可能と思った。
自分は配信者じゃないので、そこらへんががよく分からない。
配信者に聞く選択肢もあったが、実装するには自分で配信テストする必要があるため、ひとまずこの案は保留とした。
実現方法③:Webスクレイピングでのアイテム増量カウント
③は、最初にまあ簡単にできそうだなーと思った案である。
私は、ツイキャスの仕様をちゃんと把握しているわけではない。だが、おそらくこれは案として破綻しているのではないかなと思った。
なぜかと言うと、アイテムには有効期限がある。
枠開始時のアイテムの数が、枠終了まで有効である保証はないと思ったからである。
アイテム無効が、日が変わったタイミングなのであれば、日をまたぐ配信では使えないことになる。
上記理由からこの案は没となった。
実現方法④:Webスクレイピングでのアイテム履歴からのカウント
ここまで読んだ方なら分かるだろう。今回使用した方法は④となる。
本アプリでは、Webスクレイピングを使って、アイテム履歴から開始時間~のアイテムの数を数えている。
パッと見、実装で手詰まりになるようなことはなさそうである。
この方法については、次で説明する。
本アプリの仕組み
今回は、Webスクレイピングを使っている。
今まで説明を端折ってすまなかった。そもそもWebスクレイピングを説明していなかった。(実現方法を読んでくれる人は、知識のある人だと思ったので。。)
Wikipedia先生の言葉を借りると、ウェブスクレイピング(英: Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。
まあサイトの文字や画像タイトルなんかを取得できる方法…みたいな感じのイメージで良いと思う。
この方法を使うに当たり、プログラミング言語のPythonを使います。
Pythonの説明なんかをしだすときりがないので、端折らせてほしい。詳しく知りたい人は調べてみてね。
アイテム履歴ページの説明もまだだった。
以下のページで、そのユーザーが獲得したアイテムの履歴を見ることができる。
https://twitcasting.tv/【ユーザー名】/gifts
今回のやり方をまとめると、
このアイテム履歴のページから、必要な情報(アイテムの種類・そのアイテムを獲得した時間)をWebスクレイピングで取得し、
枠開始時間までカウントを続けるものとなる。
はあ、ここまでの説明長かったね。ちゃんと全部読んでくれた方ありがとう。書いた甲斐があるってもんだ。
まあ俺は端折って読むことを推奨してるので、読んでくれただけでうれしいですよ。
この後は、動作は結局どうなのってことを説明する。
本アプリの動作について
本アプリは、ユーザー名と枠開始時刻を入力して実行する。
一応CUI版とGUI版を作った。
CUI版はこんなの。
で、GUI版はこんなの。
CUI版はコメントで流したい時用。GUI版は純粋に数数えたい時だけ用って感じ。
CUI版をまず最初に作り、その結果をGUIで表示するようにしたのがGUI版。
GUI版のカウントの処理はCUI版のものってことです。まあおまけでGUIも作りたくなっただけかなw
ここまで色々説明してきたが、本アプリには問題点がある。察しの良い人であれば気づいてるかもしれない。
問題点のうち一つは、プログラミング知識がない人でも、気付けるかもしれない。
問題点
①リアルタイムで流れるお茶の数を特定条件下で正確にカウントできない
②カウント終了までに、時間がかかる
は?コイツ何言ってんの?バグじゃんと思った方。申し訳ない。ただ私としては仕様と言わせていただきたい。
理由について説明する。
理由
①については、回線速度およびアイテムの連投の問題である。
Webページから情報を取得する関係上、回線速度が遅いと情報取得中にアイテムを投げられた際にカウント数にずれが発生する可能性がある。
回線速度が速くても、連投状態の際にカウントを行った場合、ずれが発生する可能性がある。
ただ、回線速度が問題なく、アイテム投げの流れが落ち着いているときであればか正常にカウントでき、値は収束する。リアルタイムでカウントするものと違い、枠開始時からの数をカウントするので、何度でも最初から実行可能である。
値が収束するのであればつくり的に仕様として良いだろうということである。
対策として、一度に一気にWebページの情報を取得し、そこから必要な情報を抽出することでずれを防ぐことは可能かもしれない。
だが、②の問題があるのと修正が面倒なのとで、対応するまでに至っていない。
②については、PythonでのWebスクレイピングがそもそも遅いというものである。
一応parserを早いものにしたりするなど、簡単にできそうなことは試したが、それでも遅いのである程度仕方ないと思っている。
今回の方法を使用する以上、妥協しなければいけない内容になる。
まとめ
今回作成したアプリは、あくまで配布できるようなレベルに達していないと思う。
今回説明した理由を理解して使えば、一応使うことができる。
だが、わざわざ説明するのも面倒だし、配布するメリットが俺にはない。
俺だけが使うものとして持っておこうと思う。
今後このアプリを修正することもあると思うが、この方法には限界があるので、一から作らない限り配布はないかもしれない。
今の方法でも、修正することで正常に動作しそうな案があれば教えてほしい。
<追記>
手動カウンタが需要あるかも?と思ったのでアップします。たいしたことはしていないので、誰でも作れると思います。ですので、ソースコードの公開はしません。気になることあれば聞いてください。
※ダウンロード数の関係上、危険かもしれませんといった注意メッセージ出るかもしれません。
コメント