python(PyQt6)でブラウザ作った話
以前から作ると言っていたブラウザを開発したので機能の一部を説明します。
説明するのは広告、トラッカーブロック機能の実装と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)
: このメソッドはクラスの初期化を行います。page
とadBlocker
を引数として受け取り、それぞれをインスタンス変数に保存します。また、空のリストをblock_lists
とtracker_lists
に割り当て、aiohttp.ClientSession()
をsession
に割り当てます。 -
fetch_lists(self, url)
: この非同期メソッドは、指定されたURLからリストを非同期に取得します。HTTPステータスコードが200でない場合、エラーをスローします。成功した場合、レスポンステキストを改行('\n')で分割してリストとして返します。 -
update_lists(self)
: この非同期メソッドは、広告とトラッカーのリストを非同期に更新します。fetch_lists
メソッドを使用して、広告とトラッカーのリストを非同期に取得し、それぞれをblock_lists
とtracker_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に公開しています。
インストーラは以下のリンクからダウンロードできます。
Discussion
めっちゃすごいですね!
頑張ってください!!
ありがとうございます!
お互い頑張りましょうね‼