Open2

ChatGPTのChrome Extensionやツールなど

kazuphkazuph

ChatGPTのチャット履歴をMarkdownでダウンロードする

https://github.com/ryanschiang/chatgpt-export/blob/main/exportMarkdown.min.js

↑を元にしつつ、要望を加えてChatGPTによって出力した。

!function(){
  var chatTitle = document.querySelector("[class='flex py-3 px-3 items-center gap-3 relative rounded-md cursor-pointer break-all pr-14 bg-gray-800 hover:bg-gray-800 group']").textContent.trim().replace(/\s+/g, "-");
  var n = "";
  var e = document.querySelectorAll("[class*='min-h-[20px]']");
  var t = new Date(new Date(new Date(new Date).toISOString()).getTime() - 6e4 * (new Date).getTimezoneOffset())
            .toISOString()
            .slice(0,19)
            .replace("T"," ");
  n += `\`${t}\`\n\n`;
  for(var a = 0; a < e.length; a++){
    var o = e[a].firstChild;
    if(o){
      if(o.nodeType === Node.ELEMENT_NODE){
        var l = o.childNodes;
        if(o.className.includes("request-")){
          n += `_ChatGPT_:\n\n`;
        }
        for(var d = 0; d < l.length; d++){
          var c = l[d].tagName,
              r = l[d].textContent;
          if(l[d].nodeType === Node.ELEMENT_NODE){
            if(c === "P"){
              n += r + `\n\n`;
            }
            else if(c === "OL"){
              l[d].childNodes.forEach((e,t)=>{
                if(e.nodeType === Node.ELEMENT_NODE && e.tagName === "LI"){
                  n += `${t+1}. ${e.textContent}\n`;
                }
              });
              n += `\n`;
            }
            else if(c === "UL"){
              l[d].childNodes.forEach((e,t)=>{
                if(e.nodeType === Node.ELEMENT_NODE && e.tagName === "LI"){
                  n += `- ${e.textContent}\n`;
                }
              });
              n += `\n`;
            }
            else if(c === "PRE"){
              n += `\`\`\`\n${r}\n\`\`\`\n\n`;
            }
            else{
              n += "\n";
            }
          }
        }
      }
      else if(o.nodeType === Node.TEXT_NODE){
        n = (n+=`_Prompt_: ${o.textContent}\n\n`);
      }
    }
  }
  console.save = function(content, fileName) { // ファイル名を指定して保存する関数を追加
    var dateStr = new Date().toISOString().slice(0, 10); // 保存日時から年-月-日を取得
    var formattedFileName = `${dateStr}-${chatTitle}.md`; // ファイル名を指定の形式に整形
    fileName = fileName || formattedFileName;
    var blob = new Blob([content], {type: "text/plain"});
    var elem = document.createElement("a");
    elem.download = fileName;
    elem.href = window.URL.createObjectURL(blob);
    elem.dataset.downloadurl = ["text/plain", elem.download, elem.href].join(":");
    var evt = new MouseEvent("click", {
      canBubble: true,
      cancelable: false,
      view: window,
      detail: 0,
      screenX: 0,
      screenY: 0,
      clientX: 0,
      clientY: 0,
      ctrlKey: false,
      altKey: false,
      shiftKey: false,
      metaKey: false,
      button: 0,
      relatedTarget: null
    });
    elem.dispatchEvent(evt);
  };
 
  console.save(n); // ファイル名を指定して保存する関数を呼び出し
}();

実行はChromeのConsoleでそのまま実行するか、以下のようなページでJSを実行するための拡張を用いる。

https://chrome.google.com/webstore/detail/scripty-javascript-inject/milkbiaeapddfnpenedfgbfdacpbcbam?hl=ja

kazuphkazuph

コマンドライン上でChatGPTを実行したい

https://github.com/mmabrouk/chatgpt-wrapper

有料のAPIも使えますが、無料でやるために内部でヘッドレスブラウザを利用する方法もあるみたいなので、今回はそれを試してみます。

Setup

まずpipのモジュールをインストール

pip install git+https://github.com/mmabrouk/chatgpt-wrapper

次に、playwrightをインストールするのですが、公式のコマンドをそのまま使うとpackage.json等のファイルも生成されてしまうので、一時的につくったディレクトリに移動して実行してください。そのディレクトリは以後不要です。

cd ... # 適当なディレクトリに移動
npm init playwright@latest
playwright install firefox
chatgpt install

ブラウザが立ち上がるのでログインします。

chatgpt install
1> /exit

そして一度exitすると開いたブラウザが閉じます。以降は chatgpt コマンドを使うときには、ヘッドレスで実行されます。

ブラウザ上で実行されているので、ブラウザでChatGPTを開くとログが確認できます。

ですが、プロンプトを直接渡して実行した場合は、chatgptコマンドを実行する度に、新しくチャットが作成されているようです。

色々試してみる

$ cat prompts.txt
こんにちわ
どーも
夕日はなんで赤いの?30文字で答えて

これをパイプで渡してみます。

cat prompts.txt | chatgpt

これは意外でしたが嬉しいことです。一つのコマンドプロンプト上で、パイプで渡した内容を順次実行してくれるので、前回の文脈を考慮してくれています。最高。

例えば有名なスティーブ・ジョブズのスピーチを食わせてみます。
https://www.youtube.com/watch?v=VyzqHFdzBKg&ab_channel=jmicrotube

実行すると、以下の様に表示されました。

$ cat jobs.txt| chatgpt
Warning: Input is not a terminal (fd=0).

                              Provide a prompt for ChatGPT, or type /help or ? to list commands.

1> 以下のYoutubeの書き起こしを1行ずつ渡すので、それぞれ要約してください。要約する際は重要だと思われる箇所だけを箇条書きにしてく
ださい。それではこれから文章を渡します。要約する場合はすべて日本語で書いてください。 わかったらはいと言って下さい。

はい。準備ができています。お送りください。

2> (00:00) University since its founding 114 years ago and we are pleased to have him here today please join me in warmly welco
ming this year&#39;s commencement speaker Steve Jobs thank you I&#39;m honored to be with you today for your commencement from
one of the finest universities in the world truth be told I never graduated from college and this is the closest I&#39;ve ever
gotten to a college graduation today I want to tell you three stories from my life that&#39;s it no big deal just three stories
 the first story is

1. スタンフォード大学の卒業式でのスピーチ。
2. スティーブ・ジョブズが登壇し、自らの人生経験から学んだ3つのストーリーを紹介する。
3. ジョブズは、自分自身が大学を卒業していないことを明かし、ここが最も近い大学卒業式であると述べる。


<以下すべての文章が要約されるまで続く>

パイプで流したいテキストの最初にやってほしいことを書いておくのが味噌です。

以下のYoutubeの書き起こしを1行ずつ渡すので、それぞれ要約してください。要約する際は重要だと思われる箇所だけを箇条書きにしてく
ださい。それではこれから文章を渡します。要約する場合はすべて日本語で書いてください。 わかったらはいと言って下さい。

超便利🚀🚀🚀