どこでも見れるメモ帳

とあるSEの備忘録。何かあれば気軽にコメントください〜

Gemini会話履歴のJavaScript取得(Chromeデベロッパーツール経由)

概要

GeminiのWebアプリ版は、Geminiとの会話履歴をエクスポートする機能が標準でありません。 そこで、Chrome等の開発者ツールのコンソール機能(JavaScript)を通じて無理やりエクスポートさせよう、というのが本記事の主旨です。

やり方・実装

Geminiから取得する箇所(コア要素)

const xpathExpr = '//*[starts-with(@id, "message-content-id-")] | //*[starts-with(@id, "user-query-content-")]';

const result = document.evaluate(xpathExpr, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

for (let i = 0; i < result.snapshotLength; i++) {
  const node = result.snapshotItem(i);
  console.log(node.id, node.innerText);  // 例:idとテキストをログ出力
}

CSV形式でダウンロードする

// CSVダウンロード処理:
// - 参考にさせていただきました: https://qiita.com/ooooooo_q/items/69d67aabf78820d45e46
var downloadCsv = (function() {

    var tableToCsvString = function(table) {
        var str = '\uFEFF';
        for (var i = 0, imax = table.length - 1; i <= imax; ++i) {
            var row = table[i];
            for (var j = 0, jmax = row.length - 1; j <= jmax; ++j) {
                str += '"' + row[j].replace(/"/g, '""') + '"';
                if (j !== jmax) {
                    str += ',';
                }
            }
            str += '\n';
        }
        return str;
    };

    var createDataUriFromString = function(str) {
        return 'data:text/csv,' + encodeURIComponent(str);
    }

    var downloadDataUri = function(uri, filename) {
        var link = document.createElement('a');
        link.download = filename;
        link.href = uri;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    };

    return function(table, filename) {
        if (!filename) {
            filename = 'output.csv';
        }
        var uri = createDataUriFromString(tableToCsvString(table));
        downloadDataUri(uri, filename);
    };

})();

// Gemimiからメッセージ取得
const xpathExpr = '//*[starts-with(@id, "message-content-id-")] | //*[starts-with(@id, "user-query-content-")]';
const result = document.evaluate(xpathExpr, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
let result_for_csv = [];
for (let i = 0; i < result.snapshotLength; i++) {
    const node = result.snapshotItem(i);
    let user_or_bot = '';
    if (node.id.startsWith('message-content-id-')) {
        user_or_bot = 'bot';
    } else if (node.id.startsWith('user-query-content-')) {
        user_or_bot = 'user';
    }
    result_for_csv.push([user_or_bot, node.id, node.innerText]);
}

// CSV形式でダウンロード
downloadCsv(result_for_csv);

注意

  • 現在画面に表示されている要素しかダウンロードできません。そのため、会話履歴が長い場合は、先頭までスクロールした後に実行する必要があります。
  • 「開く」より参照するワード形式のようなものだったり、添付画像についてはここでは取得していません。