diff --git a/README.md b/README.md index b5312e8..da1206d 100644 --- a/README.md +++ b/README.md @@ -95,11 +95,12 @@ AI活用の記事の末尾には、相談の案内(`/message?topic=ai` への AI に引用される数を増やすため、すべての記事に、AI が丸ごと読める全文ページを足し、記事ページに「AIで読む」ボタンを置いた。人が見る記事ページは変えていない。 - 全文ページ:`/record/{slug}.md`(`src/pages/record/[slug].md.ts`・中身の作り方は `src/lib/fulltext.ts`)。記事の頭に題名・LOG番号・シリーズ・公開日・記事ページの住所・要約を付け、本文を飾りのない Markdown にする。長いコード・ログを分けた記事は、分ける前の全文(`public/files/LOG{N}/LOG{N}_full.md`・`.html`)を使う。Studio から移した記事(本文が HTML)は turndown で Markdown に直す。画像・図解・動画・サイトの中の住所は https://pixelstomotors.com から始まる住所にする - 検索では記事ページを正とする:`worker/index.js` が全文ページに `Link: <記事ページ>; rel="canonical"` と文字コードを付けて返す。記事ページの head の `` と `/llms.txt` は、すべての記事でこの全文ページを指す -- 「AIで読む」:タイトルの下の灰色の帯(`src/pages/record/[slug].astro` の `.ai-read`)。押すと ChatGPT・Claude・Perplexity・Gemini・質問文のコピーが出る。ChatGPT・Claude・Perplexity は住所の後ろの `q=` で質問文(記事と全文ページの住所つき)を入力欄に入れて開く。Gemini は入れる方法がないので、質問文をコピーしてから開く。前回選んだものを見た人のブラウザに覚え(`p2m-site-ai`)、次から一番上に「前回」を付けて出す +- 「AIで読む」:タイトルの下の灰色の帯(`src/pages/record/[slug].astro` の `.ai-read`)。押すと ChatGPT・Claude・Perplexity・Gemini・質問文のコピーが出る。ChatGPT・Claude・Perplexity は住所の後ろの `q=` で質問文(記事と全文ページの住所つき)を入力欄に入れて開く。Gemini は入れる方法がないので、質問文をコピーしてから開く。Gemini のアプリはテキストのファイル(.md)を読まないので、Gemini の質問文だけは全文ページではなく記事ページ(`?via=gemini` 付き)を読ませる(2026-11-03)。前回選んだものを見た人のブラウザに覚え(`p2m-site-ai`)、次から一番上に「前回」を付けて出す - 押した数:`/api/ev-stats` の押したもの(場所 `ai`。`AIで読む chatgpt.com` など)。全文ページを AI のクローラーが読んだ数は `/api/cr-stats` のよく読まれたページ(`.md`) - ボタン経由で AI が読みに来た数:質問文の全文ページの住所には、押した AI の印 `?via=chatgpt`(claude・perplexity・gemini・copy)を付けている。`worker/index.js` がこの印の付いた全文ページへの訪問を、名乗りが一覧にない読み手(Gemini・人のブラウザなど)も「その他」として残す(`AI_VIA`)。数は `/api/cr-stats` の「AIで読む経由」(押した AI ごとに、実際に読みに来たのはだれか・週ごと) - 各社が `q=` の扱いを変えると、入力欄に入らなくなる。そのときは `AI_TARGETS` を直す - 元に戻す:この節を入れた commit を `git revert` する(全文ページ・ボタン・head・llms.txt・worker・turndown がまとめて戻る) +- TOP の「このサイトの楽しみ方」(2026-11-03・`src/components/TopAiGuide.astro`):ヒーローの下の、閉じると1行の帯。開くと質問を4つから選び、AI で開く(ChatGPT・Claude・Perplexity・Gemini・コピー。Gemini のアプリはテキストのファイルを読まないので、Gemini には同じ中身の HTML 版 `/llms`(ファイルは /llms.html。配信の設定で /llms.html は /llms へ転送される。`src/lib/llmsGuide.ts` が共通の中身)を読ませる)。AI にはサイトの案内(`/llms.txt?via=…`)を読ませる。`/llms.txt` の記録の行には公開日を添えている(「前に来たときから」のため)。前に TOP を開いた日は見た人のブラウザに覚える(`p2m-site-top-visit`)。押した数は `/api/ev-stats` の「TOPの楽しみ方:…」、AI が読みに来た数は `/api/cr-stats` の「AIで読む経由」(ページが `/llms.txt` のもの)。質問を変えるときは `QUESTIONS` を直す ## 記事の変換の作り置き(2026-10-30) diff --git a/src/pages/index.astro b/src/pages/index.astro index 0ed2af9..4525703 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -14,6 +14,7 @@ import LoadMore from '../components/LoadMore.astro'; import GuideCards from '../components/GuideCards.astro'; import ThinkingBanner from '../components/ThinkingBanner.astro'; import OneYearBanner from '../components/OneYearBanner.astro'; +import TopAiGuide from '../components/TopAiGuide.astro'; import { allManga } from '../lib/records'; // Studio のトップと同じく、4コマは新しい4話 const mangaCards = allManga.slice(0, 4); @@ -57,6 +58,9 @@ const jsonLd = [ + + +
diff --git a/src/pages/record/[slug].astro b/src/pages/record/[slug].astro index be1a5f6..40fe86e 100644 --- a/src/pages/record/[slug].astro +++ b/src/pages/record/[slug].astro @@ -113,8 +113,15 @@ const nowCard = seriesNow || siteNow; // 前回選んだ AI を見た人のブラウザに覚え(p2m-site-ai)、次から一番上に出す。押した数は /api/ev-stats(場所 ai)で見る const mdUrl = `${SITE}${fullTextPath(r.slug)}`; // 全文ページの住所に ?via=(どの AI から来たか)を付ける。AI が読みに来たとき、ボタン経由だと worker/index.js が分けて数える(/api/cr-stats の「AIで読む経由」) +// Gemini のアプリはテキストのファイル(.md)を読まず HTML だけ読むので、Gemini には記事ページ(HTML)を読ませる(2026-11-03) const aiPromptFor = (via) => { const md = `${mdUrl}?via=${via}`; + if (via === 'gemini') { + const page = `${url}?via=${via}`; + return isEnglish + ? `Please read this article and answer my questions.\nArticle: ${page}\n\nFirst, briefly summarize what was done and what was found. Then tell me what I should check to reproduce it in my own environment.` + : `この記事を読んで、質問に答えてください。\n記事: ${page}\n\nまず、何をして何が分かったのかを短くまとめてください。そのあと、私が同じことを自分の環境で試すときに、確かめることを教えてください。`; + } return isEnglish ? `Please read this article and answer my questions.\nArticle: ${url}\nFull text (including code and logs): ${md}\n\nFirst, briefly summarize what was done and what was found. Then tell me what I should check to reproduce it in my own environment.` : `この記事を読んで、質問に答えてください。\n記事: ${url}\n全文(コード・実行ログを含む): ${md}\n\nまず、何をして何が分かったのかを短くまとめてください。そのあと、私が同じことを自分の環境で試すときに、確かめることを教えてください。`; diff --git a/worker/index.js b/worker/index.js index 3eb8a53..97496c6 100644 --- a/worker/index.js +++ b/worker/index.js @@ -49,7 +49,8 @@ export default { // 検索エンジン・AI のクローラーが読みに来たか(記録の失敗でページを止めない) // 記事の「AIで読む」から来た全文ページ(?via=chatgpt など)は、名乗りが一覧にない読み手(Gemini など)も「その他」として残す(2026-11-01) try { - const via = /^\/record\/[^/]+\.md$/.test(url.pathname) && AI_VIA.has(url.searchParams.get('via') || '') ? url.searchParams.get('via') : ''; + // TOP の「このサイトの楽しみ方」から来た /llms.txt?via=… も同じく数える(2026-11-03) + const via = (/^\/record\/[^/]+\.md$/.test(url.pathname) || (/^\/record\/[^/.]+$/.test(url.pathname) && url.searchParams.get('via') === 'gemini') || url.pathname === '/llms.txt' || url.pathname === '/llms' || url.pathname === '/llms.html') && AI_VIA.has(url.searchParams.get('via') || '') ? url.searchParams.get('via') : ''; const bot = crawlerOf(request, url) || (via ? 'その他' : null); if (bot) ctx.waitUntil(crRecord(request, env, url, bot, res.status, via).catch(() => {})); } catch { /* 数え損ねてもページは返す */ }