❤️‍🔥

python(PyQt6)でブラウザ作った話

2024/01/12に公開
2

以前から作ると言っていたブラウザを開発したので機能の一部を説明します。
説明するのは広告、トラッカーブロック機能の実装とYouTubeを埋め込んで視聴する機能(埋め込みされた動画は広告が表示されない)です。
(タブの追加とかリロード機能の実装とかは多くのサイトが説明してるので今回はしない予定です。)
~広告ブロック機能の説明~
特定のURLから広告とトラッカーのリストを非同期に取得し、ブロックするためのルールを設定するコードです
コードは以下の通りです。

class AdblockX:
    def __init__(self, page, adBlocker):
        self.page = page
        self.block_lists = []
        self.tracker_lists = []
        self.adBlocker = adBlocker
        self.session = aiohttp.ClientSession()

    async def fetch_lists(self, url):
        try:
            async with self.session.get(url) as response:
                if response.status != 200:
                    raise Exception(f"Failed to fetch lists: {response.status}")
                return (await response.text()).split('\n')
        except Exception as e:
            print(f"An error occurred: {e}")
            return []

    async def update_lists(self):
        block_lists, tracker_lists = await asyncio.gather(
            self.fetch_lists("https://easylist.to/easylist/easylist.txt"),
            self.fetch_lists("https://easylist.to/easylist/easyprivacy.txt")
        )
        if block_lists and block_lists != self.block_lists:
            self.block_lists = block_lists
            await self.blockAds()
        if tracker_lists and tracker_lists != self.tracker_lists:
            self.tracker_lists = tracker_lists
            await self.blockTrackers()

    async def blockAds(self):
        await self.adBlocker.setUrlFilterRules(self.block_lists)

    async def blockTrackers(self):
        await self.adBlocker.setUrlFilterRules(self.tracker_lists)

    async def main(self):
        await self.update_lists()

    async def updateBlockedContent(self, event):
        await self.update_lists()

このPythonコードは、広告とトラッカーをブロックするための非同期クラスAdblockXを定義しています。それでは各メソッドを説明していきます!

  • __init__(self, page, adBlocker): このメソッドはクラスの初期化を行います。pageadBlockerを引数として受け取り、それぞれをインスタンス変数に保存します。また、空のリストをblock_liststracker_listsに割り当て、aiohttp.ClientSession()sessionに割り当てます。

  • fetch_lists(self, url): この非同期メソッドは、指定されたURLからリストを非同期に取得します。HTTPステータスコードが200でない場合、エラーをスローします。成功した場合、レスポンステキストを改行('\n')で分割してリストとして返します。

  • update_lists(self): この非同期メソッドは、広告とトラッカーのリストを非同期に更新します。fetch_listsメソッドを使用して、広告とトラッカーのリストを非同期に取得し、それぞれをblock_liststracker_listsに保存します。リストが更新された場合、対応するブロックメソッド(blockAdsまたはblockTrackers)が呼び出されます。

  • blockAds(self): この非同期メソッドは、広告ブロッカーに広告のURLフィルタルールを設定します。

  • blockTrackers(self): この非同期メソッドは、広告ブロッカーにトラッカーのURLフィルタルールを設定します。

  • main(self): この非同期メソッドは、リストの更新を開始します。

  • updateBlockedContent(self, event): この非同期メソッドは、イベントが発生したときにリストを更新します。

実行するにはaiohttpというライブラリが必要です。
pipを使ってインストールできます。

 pip install aiohttp

余談ですが最初はadblockというライブラリを使って広告ブロック機能の実装をしようとしてましたが使い方が全く分からなかったのでやめました笑
次にYouTube動画を埋め込んで視聴する機能の実装方法を説明していきます。
コードは以下の通りです。

self.youtube_id_bar = QLineEdit()
        self.youtube_id_bar.setPlaceholderText("YouTube Video ID")
        navtb.addWidget(self.youtube_id_bar)
        self.youtube_id_bar.returnPressed.connect(self.play_youtube_video)

まずこのコードでYouTube動画のIDを入力するテキストボックスを作ります。
そしてYouTube動画を再生するための関数を定義するコードを書きます。
コードは以下の通りです。

def play_youtube_video(self):
    video_id = self.youtube_id_bar.text()
    youtube_url = f"https://www.youtube.com/embed/{video_id}?autoplay=1"
    self.add_new_tab(QUrl(youtube_url), 'YouTube Video')
  • video_id = self.youtube_id_bar.text(): この行は、youtube_id_barという名前のオブジェクトからYouTube動画のIDを取得し、それをvideo_idという変数に保存します。

  • youtube_url = f"https://www.youtube.com/embed/{video_id}?autoplay=1": この行は、取得したビデオIDを使用してYouTubeのURLを作成します。このURLは、動画を自動再生する埋め込みリンクです。

  • self.add_new_tab(QUrl(youtube_url), 'YouTube Video'): 最後に、この行は新しいタブを追加し、そのタブでYouTube動画を開きます。add_new_tabは新しいタブを作成し、指定されたURLをそのタブで開くメソッドです。

~余談~
コード全体はgithubに公開しています。
https://github.com/takerin-123/Orb-Browser
インストーラは以下のリンクからダウンロードできます。
https://x.gd/T2wNS

Discussion

ポテトポテト

めっちゃすごいですね!
頑張ってください!!

takerintakerin

ありがとうございます!
お互い頑張りましょうね‼