無駄と文化

実用的ブログ

ココピーからChatGPTを呼んで文章生成させる

ココピー (cocopy) というブラウザ拡張機能がある。

chromewebstore.google.com

Webページを見ていて URL やページタイトルなどをコピー&ペーストしたくなったとき、ココピーを使うと思い思いの形式でクリップボードへのコピーができて便利だ。

ココピーについてはいろいろな人が紹介記事を書いているのでそれを読んでもらうのがいいと思う。

blog.pokutuna.com

motemen.hatenablog.com

 

ココピーは任意の JavaScript コードを実行できる

ココピーは現在見ているページの URL・ページタイトル・コンテンツを JavaScript コードでいい感じに整形してからクリップボードに突っ込めるツールだ。
JavaScript コードはユーザーが好き勝手に書くことができる。fetch() を使って外部 API を叩くこともできる。

 

というわけで ChatGPT (OpenAI API) を呼んでみようと思う。

 

ココピーから OpenAI API を呼ぶ

OpenAI API はエンドポイント https://api.openai.com/v1/chat/completions に POST リクエストを投げるだけで動いてくれる。なので雑に fetch() を呼べば動く。

({ content }) => {
  const endpoint = 'https://api.openai.com/v1/chat/completions';
  const apiKey = '{YOUR_OPENAI_API_KEY}';
  const payload = {
    model: 'gpt-4o',
    messages: [
      { role: 'system', content: '100字で要約してください' }, 
      { role: 'user', content },
    ],
  };

  return fetch(endpoint, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${apiKey}`
    },
    body: JSON.stringify(payload)
  }).then(response => response.text());
}

ChatGPT にページを要約させた結果がクリップボードに入る。

 

前処理と後処理

実際には前処理と後処理をちゃんとやったほうがいい。HTML 文章をそのまま渡すと HTML タグやインデントの空白文字でトークンがかさんでクレジットを消費しまくってしまう。

const parser = new DOMParser().parseFromString(content, 'text/html');
const paragraphs = parser.querySelectorAll('body p');
const article = Array.from(paragraphs)
  .map(p => p.textContent.trim().replace(/\s+/g, ' '))
  .filter(text => text.length > 0)
  .join("\n").slice(0, 10000);

<p> タグだけ取り出して空白をトリミングした。

次は後処理、API からは JSON 形式で結果が返るのでパースしてから結果の部分だけ取り出す。

return fetch(endpoint, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${apiKey}`
  },
  body: JSON.stringify(payload)
})
  .then(response => response.json())
  .then(data => data.choices[0].message.content);

ヨシッ!(雑すぎる)

 

作例

実際に遊んでみよう。

俳句を詠ませる

まずはページ内容を要約した俳句を詠ませてみる。

適当に洗濯のページを開く

俳句ココピー実行!

結果

デリケート 衣類のケアで 賢く洗う

素敵な俳句がクリップボードにコピーされる。

 

3行まとめ

ページをシェアするとき3行まとめがあると便利かも。

3行まとめココピー実行!

結果

洗濯機の「ドライ」って?「ドライコース」でスーツやニットなどデリケートな衣類を洗おう | Lidea(リディア) by LION
https://lidea.today/articles/003999

【3行まとめ】
・洗濯機のドライコースを解説  
・デリケートな衣類を優しく洗う方法  
・ドライクリーニングとの違いも注意  

まとめてくれた。

 

ブクマを任せる

はてなブックマークのタグとコメントを生成させれば、まったく脳みそを使わずにブクマが完了する。

ブクマココピー実行!

結果

[洗濯][家事][ライフスタイル] ドライコースの重要性がよく分かりました。お気に入りの服を守るために、洗濯表示を確認する癖がつきそうです。

 

そのままブクマする

ラクだなー。

 

スクリプトとかプロンプトとか

今回使ったスクリプトの全文をここに置いておこうと思う。

ココピーで実行するには事前に API キーの発行とクレジットチャージ (課金) が必要です。スクリプトの中の {YOUR_OPENAI_API_KEY} のところを各自で発行した API キーで置き換えてください。

 

まとめ

遊んだ。楽しかった。

 

 

私からは以上です。

はてなブログのグローバルヘッダーをダークテーマっぽくする【失敗】

今年の2月にブログのデザインを刷新した。

せっかくなのでダークモードに対応させることにした。

我ながらいい感じである。CSS やってて良かった。CSS を "やる" とは?

 

グローバルヘッダー明るすぎ問題

一つ問題が残っている。はてなブログのグローバルヘッダーが白基調で明るすぎるのだ。

ダークな UI の中で白く輝くグローバルヘッダー

これをどうにかしてダークテーマっぽくしようと思う。
ちなみに結論を先に書くと、やってみたけど上手くいかなかった 。悲しいね。

 

グローバルヘッダーのカスタマイズは難しい

色調を変えたいだけなのでカスタム CSS を書けばいけるかと思ったがなかなか難しい。
グローバルヘッダーは <iframe> で表示されているし、クロスオリジンなので JavaScript でコンテンツを改変しようにも制限がかかる。

クロスオリジンの <iframe> で表示されている

よって <iframe> の外から調整してやるしかない。

CSS filter でがんばる

CSS の filter プロパティ でがんばることにした。

@media (prefers-color-scheme: dark) {
    #globalheader-container {
        filter: invert(80%);
    }
}

このように、グローバルヘッダー全体に { filter: invert(80%); } で色調反転を施してみる。

なかなか良い

かなり "っぽく" なった。
ただ、右上の「購読リスト」のところに出ている新着バッジが青緑で気持ち悪い。
幸いにこの箇所以外は無彩色なので { filter: hue-rotate(180deg); } で色相を反転させてあげれば赤っぽい色に戻るはずだ。

@media (prefers-color-scheme: dark) {
    #globalheader-container {
        filter: invert(80%) hue-rotate(180deg);
    }
}

invert(80%) してから hue-rotate(180deg) している。するとこうなる。

いいじゃんいいじゃん

とてもいい。

 

アバター画像が大変なことになっている

と思ったら、はてなアカウントのアバター画像が大変なことになっていた。

デデーン!

 

これではいけませんね?

はい、ダメでした。

 

どうにかなりませんか?

私には難しかった。一応使えそうなネタとしては、

  • サイドパネルが開いているときだけ親ドキュメント (ブログ全体) の <body>globalheader-expanded という class がつくので CSS を上手く分岐してあげればいいのかも
  • SVG フィルターってやつで何か上手いことできないかな?(ジャストアイデア)

といったところか。

 

まとめ

たぶんはてな社のブログチームにはたらきかけたほうが早い。

 

 

私からは以上です。

 

おまけ: はてなスターをダークテーマっぽくする【成功】

invert(90%) からの hue-rotate(270deg) すれば良い感じではなかろうか。

@media (prefers-color-scheme: dark) {
    [data-hatena-star]::part(star-button-container) {
        filter: invert(90%) hue-rotate(270deg);
    }
}

こうなる。

Before After

まぁいいんじゃない?

Tシャツを煮る

Rust 言語のキャラクター「フェリスくん」のTシャツ

ここに黒い T シャツがある。

suzuri.jp

ちなみにここで買える。

 

この T シャツがなんだか嫌な匂いになってしまった。洗濯して干した直後でも袖を通すと なんか生臭い 。カニのフェリスくんのせいではなく、私の皮膚の油脂分と細菌のせいだと思われる。

というわけで T シャツを煮よう と思う。いわゆる煮洗いというやつ。

 

煮るぞ

デカめの鍋、3リットルくらいの湯

デカめの鍋に3リットルくらいの湯を沸かす。

 

漂白系の洗濯洗剤をちょっと引くくらい入れる

お湯が沸いたら漂白系の選択洗剤を入れる。1人×2日分くらいの洗濯物をイメージしてほしい、それを洗うときに使う量をこの鍋に投入する。ちょっと引くくらいの量。熱湯なので溶け残りの心配は無用。
この量使うって合ってるのか?と思うけど完全な我流なので答え合わせできない。

 

Tシャツを投入!

続いて T シャツを投入する。ちなみに我が家ではこの煮洗い専用の鍋と菜箸を用意している。

 

弱火で15分くらい煮る

弱火でコトコトと15分くらい煮た。あとは普通に洗濯機に入れて すすぎ → 脱水 をすればいい。

 

煮洗い後の汁

ちなみに煮洗い後の汁はバカ黒い。こんなにも汚れが溜まっていたのか?いや、たぶん染料が落ちてるだけ。ともかくバカ黒い。

 

すすいで干す

すすいだら干す。全体的に急激に色褪せた。フェリスくんも満身創痍。まぁ臭いまま着るよりマシなので。

 

まとめ

煮洗いしたらまったく臭くなく、爽やかな T シャツに生まれ変わった。ありがとう。万物に感謝🙏✨

 

 

私からは以上です。