Claudeがブラウジングできないので自作アプリをClaudeで作った話

Claudeがブラウジングできないので自作アプリをClaudeで作った話 AI

Claude AIにはウェブページを直接読み込む機能がありません。
そのため、読み込ませたいページをPDFに変換してアップロードしていました。

しかし、PDFは容量が大きく、Claudeの容量制限(10MB)に引っかかることが多々あります。

そこで、ウェブページの内容をテキストファイルに保存できるChrome拡張機能を探しました。
しかし、なかなか良いものが見つかりません。

それに、よくわからない拡張機能はインストールしたくありません。
それなら、自分でアプリを作ろうと思い立ったということです。

これまでなら、問答無用でChatGPTを利用していました。

ただ、そんなChatGPT 4にもClaude 3 Opusという強力なライバルが現れました。

ベンチマークでは、多くの項目でClaude 3 OpusがChatGPT 4を超えています。
その中でも、「Code」では大きな差が付いています。

そのことから、今回はClaude 3 Opusを開発に利用します。
やったことは、以下のプロンプトを入力しただけです。

from unstructured.partition.html import partition_html url = “https://www.cnn.co.jp/fringe/35216284.html” elements = partition_html(url=url) print(“\n\n”.join([str(el) for el in elements]))
===
上記コードをベースにして、以下の仕様を満たす個人用アプリを作成したい。
[仕様]
・指定したURLのページのテキスト情報を取得する
・取得したテキストはタイムスタンプを名称とするtxtファイルとして保存する
・URLは入力することができる
・URLが入力されていれば「取得」ボタンを押すことが可能
・「取得」ボタンをクリックするとデータ取得の処理が行われる
・PythonのGUIアプリである
上記仕様を満たすアプリのコードを書いてください。
出来る限り保守性の高いソースコードでお願いします。

最初にヒントとなるコードを入力しています。
このコードは、次の記事に記載されているモノです。

そして、アプリに求める仕様を追記しています。
その結果として出力されたコードは、以下となります。

import tkinter as tk
from tkinter import messagebox
from unstructured.partition.html import partition_html
import datetime
import os

class WebTextExtractor:
    def __init__(self, master):
        self.master = master
        master.title("Web Text Extractor")

        self.url_label = tk.Label(master, text="URL:")
        self.url_label.pack()

        self.url_entry = tk.Entry(master, width=50)
        self.url_entry.pack()

        self.extract_button = tk.Button(master, text="Extract", command=self.extract_text)
        self.extract_button.pack()

    def extract_text(self):
        url = self.url_entry.get().strip()
        if not url:
            messagebox.showwarning("Warning", "Please enter a URL.")
            return

        try:
            elements = partition_html(url=url)
            text = "\n\n".join([str(el) for el in elements])

            timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
            filename = f"{timestamp}.txt"

            with open(filename, "w", encoding="utf-8") as file:
                file.write(text)

            messagebox.showinfo("Success", f"Text extracted and saved as {filename}")
        except Exception as e:
            messagebox.showerror("Error", f"An error occurred: {str(e)}")

root = tk.Tk()
app = WebTextExtractor(root)
root.mainloop()

上記コードは、本当に1発目の返答です。
いきなり、エラー無しで動きます。

ChatGPTであれば、何らかのエラーが出ていると思います。
数回やり取りを行って、動くモノができるという感じです。

しかし、Claude 3 Opusでは初っ端からこのレベルのコードを出力します。
ただ、保存されるテキストがカレントディレクトリであるコードになっています。

確かに、保存先に関しては仕様にも記載していません。
そこで、次のように確認してみました。

txtファイルはアプリが実行される直下に保存されるのですね。

また、その返答が素晴らしい。

上記に加えて、保存先を選択できるコードを返答してくれています。
ただ、アプリの起動毎に保存先を選択するのは面倒です。

そこで、次のように確認(依頼)してみました。

デフォルトでアプリのカレントディレクトリにすることはできますか?

結果として、次のコードが出力されました。
回数にすると、3回目のコードです。

import tkinter as tk
from tkinter import messagebox, filedialog
from unstructured.partition.html import partition_html
import datetime
import os

class WebTextExtractor:
    def __init__(self, master):
        self.master = master
        master.title("Web Text Extractor")

        self.url_label = tk.Label(master, text="URL:")
        self.url_label.pack()

        self.url_entry = tk.Entry(master, width=50)
        self.url_entry.pack()

        self.directory_button = tk.Button(master, text="Select Save Directory", command=self.select_directory)
        self.directory_button.pack()

        self.directory_path = tk.StringVar()
        self.directory_label = tk.Label(master, textvariable=self.directory_path)
        self.directory_label.pack()

        self.extract_button = tk.Button(master, text="Extract", command=self.extract_text)
        self.extract_button.pack()

    def select_directory(self):
        directory = filedialog.askdirectory()
        if directory:
            self.directory_path.set(directory)

    def extract_text(self):
        url = self.url_entry.get().strip()
        if not url:
            messagebox.showwarning("Warning", "Please enter a URL.")
            return

        directory = self.directory_path.get()
        if not directory:
            messagebox.showwarning("Warning", "Please select a save directory.")
            return

        try:
            elements = partition_html(url=url)
            text = "\n\n".join([str(el) for el in elements])

            timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
            filename = f"{timestamp}.txt"
            file_path = os.path.join(directory, filename)

            with open(file_path, "w", encoding="utf-8") as file:
                file.write(text)

            messagebox.showinfo("Success", f"Text extracted and saved as {filename} in {directory}")
        except Exception as e:
            messagebox.showerror("Error", f"An error occurred: {str(e)}")

root = tk.Tk()
app = WebTextExtractor(root)
root.mainloop()

ちゃんと、仕様通りに動きます。
ヤバ過ぎませんかね。。。

時間にすると、10分もかかっていません。
仕様検討、動作確認、Claude AI上のやり取り全て含めてです。

ChatGPT 4の時でも、衝撃はありました。
でも、Claude 3 Opusはそれをさらに上回るほどの衝撃です。

なお、最も時間がかかったのはexe化にする部分になります。
20分程度は、調査と検証を繰り返しました。

Windowsの場合、最新版Pyinstallerだと次のようなエラーが出ます。

**win32ctypes.pywin32.pywintypes.error: (225, 'BeginUpdateResourceW', 'Operation did not complete successfully because the file contains a virus or potentially unwanted software.')**

エラー回避のために、次のバージョンを利用する必要があります。

私の環境では、以下のコマンドでexe化に成功しています。

pyinstaller page_to_txt.py  --onefile --noconsole --hidden-import unstructured --hidden-import unstructured.partition.html --hidden-import unstructured.partition --add-data "venv\Lib\site-packages\unstructured;unstructured"

このexeは、どこに設置しても動きます。
Pythonがインストールされていないマシンでも動作可能です。

トータル30分程度で、このアプリが完成しています。
次回以降は、Pyinstallerの部分をショートカットできるはずです。

そうなれば、10分程度で自作アプリを作れるようになります。
モノによっては、もっとかかる可能性もありますけどね。

AIを使えば、このようなことが可能という時代になっているのです。

タイトルとURLをコピーしました