Flow LauncherのプラグインをPythonで作る
今やこれなしでのPC生活は考えられないランチャーアプリですが、個人的には長らくLaunchyを使っていたものの更新されなくなったため、近年はFlow Launcherを使用しています。移行時点ではWoxからフォークした初期のPowerToys Runと比較して、こちらの方が機能的に優れていたからですが、そのまま現在でも使用中です。
このFlow Launcherの便利な機能のひとつとしてPluginによる拡張機能があります。これを用いるとランチャーの引数を任意のプログラムに渡すことが可能になり、さらに使い勝手がアップします。ここでは備忘録を兼ねてPythonでプラグインを作る場合の流れを説明します。
例として取り上げるのは引数をWebブラウザに渡してAmazonやヤフオクから串刺し検索を行うケースです。環境はFlow Launcher 2.1.0とPython 3.14.2です。
ちなみにAIとのペアプロで作業しましたが、やはり一部で正しくない回答がありました。しかしエラーの分析などでは非常に便利でした。
ディレクトリ作成
プラグインは「C:\Users\<ユーザ名>\AppData\Roaming\FlowLauncher\Plugins\」以下にプラグイン名でディレクトリを作成します。ここでは「buy」という名前です。またアイコンを入れるimagesディレクトリを更に作成します。
Plugins
└buy
├plugin.json
├buy.py
└images
└icon.png
JSON作成
プラグイン名のディレクトリに「plugin.json」を以下の内容で作成します。このファイル名は固定です。JSON内の名前などは適宜変更してください。ActionKeywordがFlow Launcherから呼び出すコマンド名になります。またIconPathやWebsiteは省略できませんので、下記が最小構成となります。
// plugin.json
{
"ID": "<任意のUUID>",
"Name": "python buy command",
"ActionKeyword": "buy",
"Description": "python buy command",
"Author": "tadano",
"Version": "0.1.0",
"IcoPath": "images/icon.png",
"Website": "https://kaimei.org/",
"Language": "python",
"ExecuteFileName": "buy.py"
}
このときIDには任意のUUIDをセットします。これはPowerShellで以下を実行すると生成できます。
> [Guid]::NewGuid()

合わせてアイコンとして64x64の適当なpngファイルをimagesディレクトリ内にicon.pngとして入れておきます。
Pythonスクリプト作成
先にPythonがFlow Launcherとやりとりをするために、flowlauncherモジュールをインストールします。
> pip install flowlauncher
それからプラグイン名ディレクトリに、JSONのExecuteFileNameで指定した名前のPythonスクリプトを作成します。
// buy.py
from flowlauncher import FlowLauncher
import sys
from urllib.parse import quote
import subprocess
class Buy(FlowLauncher):
def query(self, query):
return [{
"Title": "buy",
"SubTitle": f"{query}",
"IcoPath": "images/icon.png",
"JsonRPCAction": {
"method": "open",
"parameters": [query]
}
}]
def open(self, query):
urls = []
urls.append("https://www.amazon.co.jp/s?k=") # Amazon
urls.append("https://auctions.yahoo.co.jp/search/search?&p=") # ヤフオク
urls.append("https://fril.jp/s?query=") # ラクマ
urls.append("https://jp.mercari.com/search?keyword=") # メルカリ
# 引数をURLエンコード
url_encoded = quote(query)
searchs = []
for url in urls:
searchs.append(url + url_encoded)
ff = r"C:\Program Files\Mozilla Firefox\firefox.exe "
for search in searchs:
ff += (search + " ")
subprocess.Popen(ff)
if __name__ == "__main__":
Buy()
query()の引数queryにFlow Launcherのコマンド名以降で渡された引数が入っています。ここで実際の処理を行うメソッド名を指定し(ここではopen())、その関数を作成します。
open()では引数をURLエンコードして各サイトの検索文字列にセットしWebブラウザ(Firefox)をコマンドラインから起動しています。
ですので、後は今回のopen()で行っている処理を目的に応じて書き換えれば、Flow Launcherの引数を受け取る任意の処理が可能になります。
実行
作成が終わったらFlow Launcher自身を再起動します。この再起動もFlow Launcherで「flow」と入れれば候補に表示されます。
以下は上記を実行してみた様子です。


もっともこれが単一のWebサイトへの検索であれば、標準プラグインの方をいじった方が早いかもしれません。
