Discord を巨大な無料クラウドストレージに変えるPythonプログラムを作ってみた!

Discord を巨大な無料クラウドストレージに変えるPythonプログラムを作ってみた!

はじめに:PCのストレージが一杯!? 意外な解決策とは?

皆さん、こんにちは! 最近、ゲームのアップデート中に「ストレージ容量不足」というエラーメッセージに遭遇しました。 ダウンロードフォルダには22,000個ものファイル… 削除するのも面倒だし、新しいSSDを買うお金もない!そんな時、閃いたんです。

「Discordを巨大な無料クラウドストレージとして使ってみよう!」

この記事では、その発想から、Discordを巧みに利用してファイルを保存・復元するPythonプログラムを作成するまでの過程を、詳細に解説します。 決して実用的な方法ではありませんが、技術的な挑戦として非常に興味深い実験となりました。

なぜDiscordを選んだのか?

多くのソーシャルメディアサイトは、事実上無料のクラウドストレージを提供しています。 YouTubeもその一つですが、動画ファイルしかアップロードできないという制約があります。 一方、Discordは、一定サイズ以下のファイルであれば様々な種類のファイルをアップロードできるため、今回の実験には最適なプラットフォームでした。

プログラムの設計:画像への変換と分割アップロード

Discordのファイルアップロード制限(25MB)を回避するために、プログラムは下記のステップで動作します。

  1. ファイルの読み込みと分割: Pythonの組み込み関数を使って、対象ファイルのバイナリデータを読み込みます。 その後、25MB以下のチャンクに分割します。

  2. バイナリデータから画像への変換: 各チャンクのバイナリデータは、画像に変換されます。 1ピクセルあたり24ビット(3バイト)のデータが格納できるので、1920x1080ピクセルの画像に約6MBのデータを埋め込むことができます。 この変換により、Discordに画像としてアップロードします。 見た目はノイズのような画像ですが、実際にはバイナリデータが格納されています。

    # これは簡略化した例です。実際のプログラムはより複雑です。
    import imageio
    
    def binary_to_image(binary_data):
        # バイナリデータから画像を作成する処理
        # ...
        return imageio.imwrite("image.png", image_array)
    
  3. Discordへのアップロード: 作成された画像は、自作のDiscordボットを使ってDiscordサーバーに自動的にアップロードされます。 アップロードされた画像のURLはテキストファイルに保存されます。

    # これは簡略化した例です。実際のプログラムはより複雑で、Discord APIの利用が必要です。
    import discord
    
    client = discord.Client()
    
    @client.event
    async def on_ready():
        # Discordボットの起動処理
        # ...
    
    @client.event
    async def on_message(message):
        # 画像アップロード処理
        # ...
    
  4. ダウンロードと復元: ダウンロード時に、テキストファイルから画像のURLを取得し、画像をダウンロードします。 その後、画像からバイナリデータを取り出し、元のファイルに再構成します。

プログラムの実装:Pythonの威力を活用

プログラムの実装にはPythonを使用しました。 Pythonは豊富なライブラリと簡潔な構文を持つため、このプロジェクトに最適でした。 特に、ファイルのバイナリデータの読み込みや画像処理には、imageioなどのライブラリが非常に役立ちました。 Discordボットの作成には、discord.pyライブラリを利用しました。

ファイル読み込みとバイナリデータ処理

ファイルのバイナリデータの読み込みは、Pythonの組み込み関数open()read()を使って簡単に実現できました。 大きなファイルは一度に読み込むのではなく、適切なサイズに分割して処理することで、メモリ不足を防ぎました。

# ファイルをチャンクに分割する関数
def chunk_file(filepath, chunk_size):
    with open(filepath, "rb") as f:
        while True:
            chunk = f.read(chunk_size)
            if not chunk:
                break
            yield chunk

画像への変換とDiscordへのアップロード

バイナリデータから画像への変換は、各バイトをRGB値に変換することで行いました。 この処理は計算コストが高いため、効率的なアルゴリズムの選定が重要でした。 Discordへのアップロードは、作成したDiscordボットを通じて行い、アップロードされた画像のURLをテキストファイルに保存することで、後のダウンロードを可能にしました。

ダウンロードとファイルの再構築

ダウンロード処理は、テキストファイルに保存されたURLを使って、requestsライブラリを利用して行いました。 ダウンロードした画像から、ピクセルのRGB値を元のバイナリデータに戻すことで、元のファイルを再構築しました。

完成!しかし課題も…

最終的に、任意サイズのファイルをDiscordにアップロードしてダウンロードできるプログラムが完成しました。 しかし、いくつかの課題も明らかになりました。

セキュリティの問題

Discordにアップロードされたファイルは、公開されているため、誰でもアクセス可能です。 サーバーを非公開にすることでリスクを軽減できますが、URLを知っていれば誰でもアクセスできるという問題が残ります。 そのため、この方法は機密性の高いデータの保存には絶対に使用すべきではありません

アップロード速度の問題

バイナリデータの画像への変換と、画像のアップロードは非常に時間がかかります。 私のWi-Fi環境が悪いこと、画像変換処理自体が遅いことも影響しています。 実用的なファイルストレージとしては、全く現実的ではありません。

まとめ:実験の意義

このプロジェクトは、Discordを無料クラウドストレージとして利用するという、突拍子もないアイデアを実現するための技術的な挑戦でした。 完全な成功とは言えませんが、Pythonを使ったファイル処理、画像処理、Discordボット開発、そしてそれらの統合を通して、多くのことを学ぶことができました。 この経験は、今後のプログラミング活動に活かされるでしょう。

今後の展望

このプログラムをさらに改善するために、以下の点を検討しています。

  • セキュリティの強化: プライバシーを考慮したより安全なファイル保存方法の検討。例えば、暗号化技術の導入。
  • 速度の向上: 画像変換アルゴリズムの最適化や、並列処理の導入によるアップロード速度の向上。
  • エラー処理の改善: ネットワークエラーなど、予期せぬ状況への対応を強化。
  • GUIの開発: コマンドラインインターフェースではなく、より使いやすいグラフィカルユーザーインターフェースの開発。

このプログラムは実用的なファイルストレージとしては不向きですが、技術的な可能性を探求する上で非常に興味深い実験となりました。 皆さんも、独自のアイデアで、プログラミングの楽しさを体験してみてはいかがでしょうか?

おわりに

最後まで読んでいただき、ありがとうございました! もしこの記事が面白かった、あるいは参考になったと感じたら、ぜひコメントやシェアをお願いします。 そして、今後の動画にもご期待ください! チャンネル登録もよろしくお願いします!