본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 05. 06. 21:55

「アップデート」に怒ったから、PHP で歌リク管理ツールを自作した話

요약

특정 스트리밍 앱 '토피아'의 업데이트(무과금 리스너 포인트에 90일 소비 기한 부여)에 불만을 품은 개발자가, 무과금 팬들의 노력이 제대로 보상받지 못하는 상황을 개선하기 위해 직접 노래 요청 관리 및 포인트 시스템을 갖춘 대체 도구 '포이포이토피아'를 개발하게 된 이야기입니다. 이 과정에서 PHP 버전 문제 해결, Google Sheets API 연동, iTunes API 활용 등 다양한 웹 개발 기술과 노하우를 습득하고 적용했습니다.

핵심 포인트

  • 서비스의 정책 변화(90일 포인트 기한)가 개인 프로젝트 개발의 강력한 동기 부여가 될 수 있음을 보여줍니다.
  • AI 코딩 도구(DeepSeek 등)와 협업하여 기술적 구현을 진행하는 현대적인 개발 워크플로우를 경험했습니다.
  • iTunes API, Google Sheets API 등을 활용하여 단순 요청 관리 기능을 넘어선 고도화된 사용자 경험(자동 완성, 포인트 자동 기록)을 구축할 수 있습니다.
  • PHP 버전 문제나 세션 ID 설계 등 실제 운영 환경에서 발생하는 기술적 난관들을 해결하는 과정이 중요합니다.

はじめに

事の発端は、ある配信アプリのアップデートだった。

そのアプリは「トピア」。カラオケ配信に特化したアプリで、リスナーがリクエストした曲を歌う「歌凸」文化が根付いている。配信者とリスナーの交流を支える、いいアプリだった。あのアップデートまでは。

その日、無課金リスナーの努力が「消滅」することになった

ある日、運営からこんな告知が出た。

「ギフトポイントに 90 日の消費期限をつけました!」

つまり何が起きるのか。

毎日配信に通って、無料のギフトポイントをコツコツ貯めてくれていた無課金リスナーが、90 日間配信に来られなくなったら──その努力が全部ゼロになる。

彼らは「お金じゃ測れない応援」を形にしてくれていた。その気持ちに、運営は「90 日で消えます」と言ったのだ。

正直なところ、私は運営でもないし、責任を感じる立場でもない。

ただ──「気に入らんにゃ」と思った。

無課金でコツコツ応援してくれるリスナーが報われない仕組みが、どうしても許せなかった。

ならば自分で作ろう。運営がダメなら、こっちで受け皿を作ればいい。

そうして「ぽいぽいトピア」の開発が始まった。

求めていたもの

トピアの代替として、以下の機能を備えたツールが必要だった。

機能内容
🎵 歌凸リクエスト管理誰が何の曲をリクエストしたか記録
📊 ポイント管理リスナーに還元できる仕組み
🌐 サーバー不要ブラウザだけで動く

開発パートナーは AI

開発のパートナーは DeepSeek(通称クジラ)。私はコードを書けるわけではない。だから「ああしろ、こうしろ」と仕様を伝え、AI がコードを書く。動かなければ「動かない」と伝え、修正させる。この役割分担が、結果的にうまく機能した。

最初は HTML/JavaScript のみでプロトタイプを作成。PWA 対応させれば、スマホのホーム画面に追加してアプリのように使える。

「動いた!」という感動もつかの間、問題が発生した。

500 エラーとの戦い

ロリポップサーバーにアップロードした途端、HTTP ERROR 500。

原因は PHP のバージョンだった。ロリポップの初期設定は PHP 5.6。しかし自作ツールは PHP 7.4 以上が必要。管理画面から PHP バージョンを変更し、無事に動作。レンタルサーバーあるあるをまた一つ学んだ。

Google Sheets との連携

実は Google Sheets API との連携は、以前開発した「ポイぼっくす」で経験済みだった。今回はその知見を流用し、リクエスト受付や歌唱完了時のポイント自動記帳を実装。一度経験した技術を使い回せるのも、自作ツールの強みだ。

こだわりの機能ベスト 5

  • 🎵 iTunes API で曲名検索&ジャケ写表示

曲名の手入力は面倒だし、タイプミスも起きやすい。そこで iTunes Search API を使って、曲名の一部を入力するだけで候補をリスト表示するようにした。選択した曲のジャケ写は NOW SINGING 表示時に自動で表示される。

  • 👤 リスナー名サジェスト

同じリスナーが何度もリクエストしてくれるのは嬉しいが、毎回名前を手打ちするのは負担になる。一度入力した名前を localStorage と datalist で保存し、次回からは頭文字を打つだけで候補が出るようにした。

  • 📡 配信セッション ID で日付またぎ問題を解決

深夜配信で 0 時を超えるとログが別ファイルになる問題を、配信ごとにユニークなセッション ID を発行することで解決した。

function get_stream_session_id() {
    $key = session_key('stream_session_id');
    if (!isset($_SESSION[$key])) {
        ...
    }
}
  • 🖼️ NOW SINGING にアートワーク表示

iTunes 検索時に取得したジャケ写を NOW SINGING に表示。たったこれだけで配信画面のクオリティが一段上がる。

  • 🔑 URL パラメータでマルチユーザー対応

同じサーバーで複数の配信者が使えるよう、URL パラメータでユーザー ID を切り替えられるようにした。セッションもログも Google Sheets も、ユーザー ID ごとに完全分離される。

現在の「ぽいぽいトピア」

機能実装
🎵 曲名検索iTunes API で自動補完+ジャケ写表示
👤 名前サジェスト過去の入力から自動候補表示
📡 配信セッション管理日付またぎ問題を完全解決
📊 Google Sheets 連携ポイぼっくすの知見を流用
🔑 マルチユーザーURL パラメータで完全分離
📁 過去ログ DLいつでも過去の配信を振り返り

まとめ

クソアップデートは、時に人を動かす。

あの日、トピアが無課金リスナーの努力に「90 日の消費期限」をつけなければ、私は PHP のバージョンを調べることも、iTunes API を叩くことも、配信セッション ID を設計することもなかった。

「気に入らんにゃ。なら自分で作るにゃ」 その一念が、今の私を形作っている。

このツールは完全無料で公開している。 同じように困っている配信者がいたら、ぜひ使ってみてほしい。

さく猫 - 配信ツール作者 / 元トピア難民

#PHP #配信ツール #個人開発 #トピア #ポエム #やってみた

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
1

댓글

0