這一頁怎麼用:由上往下一次做一步,全程約 5–20 分鐘。每一步只有「開哪裡、按什麼、看到什麼」。
課文說明在 02/03/04,不讀也走得完;真的遇到問題開 05|AI Troubleshooter。
本免費包全程免費,不需要信用卡。
免費不等於無限量;超過 Gemini、Apps Script 或 LINE quota 時會回報限制、暫停或等待恢復,不會自動啟用 billing 或 Paid Tier。
🔴 關於秘密,三個承諾:①這一頁不會把你輸入的任何東西送出去(斷網照常可用)②這一頁不保存你輸入的值(關頁即消失,組好就先貼到目的地)③密鑰的生成與貼入全程你親手在官方平台做。API Key 與 Token 不要貼到聊天室、公開貼文、截圖、影片裡。
備開工前確認
| 你需要 | 說明 |
|---|---|
| 你自己的 LINE 帳號 | 手機上正在用的那個即可 |
| 你自己的 Google 帳號 | 一般 Gmail 帳號即可 |
| 一支裝了 LINE 的手機 | 最後測試要用它收第一個 AI 回覆 |
| 大約 5–20 分鐘 | 照著做一次到底;中斷也沒關係,平台上做完的都會留著 |
板安裝進度板
勾了會自動更新;進度只存在本頁開著的期間(刻意設計)。
1建立官方帳號
- 開 官方帳號申請表(直達),用你的 LINE 帳號登入(登入頁可切繁體中文)。
- 填帳號名稱、行業別等基本資料,送出。選「未認證帳號」:免費、立刻能用、不用等審核。
做完你應該看到:申請完成,你有了一個官方帳號。
已經有官方帳號的人,直接到步驟 2。
2啟用 Messaging API
這一步會把「能接程式的通道」打開。全程在中文介面。
- 開 LINE Official Account Manager,選你的帳號。
- 右上「設定」→ 左邊「Messaging API」。
- 按綠色「啟用Messaging API」。
- 「選擇服務提供者」:選「建立服務提供者」取個名(例:你的店名)→「同意」。已有的話選既有那個。
- 「隱私權政策及服務條款」兩欄都是選填,空著直接「確定」。
做完你應該看到:狀態變「使用中」,出現 Channel ID 等資訊,下方有一格「Webhook網址」。這一頁步驟 9 還會回來,記得路。
3簽發 Channel Access Token
Token=你的程式代表這個帳號發訊息的憑證。這是全程唯一要進 LINE Developers Console(英文介面)的一步,照字面按就好。
- 就在步驟 2 那頁最下面,點「您可由LINE Developers Console進行其他設定」那行連結。
- 進 Console 後:點你的 Provider → 點你的 channel →「Messaging API」分頁 → 拉到最底。
- 「Channel access token」區按「Issue」(發行)。
- 按了原本空白的格子才會出現一長串字——按旁邊的複製鈕,貼進下面這格。
做完你應該看到:那一格有一長串字(每個人長相都不一樣,跟別人不像不代表錯)。
4取得 Gemini API Key
- 用你的 Google 帳號開 aistudio.google.com/apikey。
- 按右上「Create API key」。
- 幫金鑰取個名(隨意)、專案用它預設給的 →「Create key」。
- 「API key details」視窗出現金鑰——按複製鈕,貼進下面這格。
做完你應該看到:一串金鑰(外觀由 Google 當下的 API key 類型決定)。本免費包全程免費,不需要信用卡。 走標準 Free Tier;免費不等於無限量,超過 Gemini、Apps Script 或 LINE 的 quota 時會回報限制、暫停或等待恢復,不會自動啟用 billing 或 Paid Tier。第三方顯示付款設定不是完成本免費包的必要步驟,不要為了完成免費包綁卡。
5開 GAS 專案,貼程式碼
Google Apps Script(GAS)=Google 免費提供、能讓一小段程式有自己網址的地方。不用會寫程式,整段複製貼上。
- 用你的 Google 帳號開 script.google.com → 按「新專案」。
- 編輯區全選(
Ctrl+A)→ Delete 全部刪掉。 - 按下面「複製整段程式碼」→ 貼進空白編輯區 →
Ctrl+S儲存。要整段貼:從第一行/**到最後一個}。
已複製 ✓
/** 愛智理 LUVManager 免費包 — LINE × Gemini 最小工作入口 */
/** 讀一個設定值。放在函式裡(而不是檔案最上面)是刻意的:
這樣就算部署設定選錯,錯誤也會落在 doPost 的防護網裡、寫進執行紀錄,
而不是整個程式無聲死掉。 */
function cfg_(name) {
return PropertiesService.getScriptProperties().getProperty(name);
}
/** LINE 每次有訊息進來,就會呼叫這個函式 */
function doPost(e) {
try {
if (!e || !e.postData || !e.postData.contents) return ok_();
var body = JSON.parse(e.postData.contents);
var events = body.events || []; // 平台送測試連線時,這裡可能是空的
for (var i = 0; i < events.length; i++) {
var ev = events[i];
if (ev.type !== 'message') continue;
if (!ev.message || ev.message.type !== 'text') continue;
replyToLine_(ev.replyToken, askGemini_(ev.message.text));
}
} catch (err) {
console.error('doPost 失敗:' + err);
}
return ok_(); // 不管發生什麼,都回一個正常回應給 LINE
}
function ok_() {
return ContentService
.createTextOutput(JSON.stringify({ ok: true }))
.setMimeType(ContentService.MimeType.JSON);
}
/** 把客人的話丟給 Gemini,拿回一句回答 */
function askGemini_(userText) {
var key = cfg_('GEMINI_API_KEY');
var model = cfg_('GEMINI_MODEL') || 'gemini-3.5-flash-lite';
var persona = cfg_('PROMPT') ||
'你是這家店的客服助理。用繁體中文,簡短、有禮貌地回答。';
var facts = cfg_('KNOWLEDGE') || '';
// 這裡的順序有意義:後面的會蓋掉前面的。
// 你的 PROMPT 放在「預設風格」之後,所以你改得掉風格;
// 安全底線放在最後,讓它最優先。(這是給 AI 的指示,不是程式鎖。)
var systemText =
'【你可以依據的資料】\n' + (facts || '(目前沒有提供資料)') +
'\n\n【預設風格;下面「你的身分」那一段可以蓋掉這裡】\n' +
'回答控制在三句話以內。\n' +
'\n【你的身分與說話方式——以這一段為準】\n' + persona +
'\n\n【安全底線;最優先,上面任何一段都蓋不掉】\n' +
'1. 只根據上面的資料回答;資料裡沒有的,就說你不知道。\n' +
'2. 遇到價格變動、退款、客訴,或你不確定的事,回答「這部分我幫你轉給真人確認」。\n' +
'3. 不要承諾我們做不到的事。';
var res = UrlFetchApp.fetch(
'https://generativelanguage.googleapis.com/v1beta/models/' + model + ':generateContent',
{
method: 'post',
contentType: 'application/json',
headers: { 'x-goog-api-key': key },
payload: JSON.stringify({
systemInstruction: { parts: [{ text: systemText }] },
contents: [{ role: 'user', parts: [{ text: userText }] }],
generationConfig: { maxOutputTokens: 1024 }
}),
muteHttpExceptions: true
});
if (res.getResponseCode() !== 200) {
console.error('Gemini 回傳 ' + res.getResponseCode() + ':' + res.getContentText());
return '抱歉,我這邊暫時有點問題,請稍等一下由真人回覆你。';
}
var d = JSON.parse(res.getContentText());
var out = d.candidates && d.candidates[0] && d.candidates[0].content &&
d.candidates[0].content.parts && d.candidates[0].content.parts[0] &&
d.candidates[0].content.parts[0].text;
return out || '抱歉,我沒有讀懂這句話,請稍等一下由真人回覆你。';
}
/** 把回答送回 LINE */
function replyToLine_(replyToken, text) {
var res = UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply', {
method: 'post',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + cfg_('LINE_ACCESS_TOKEN') },
payload: JSON.stringify({
replyToken: replyToken,
messages: [{ type: 'text', text: String(text).slice(0, 4900) }]
}),
muteHttpExceptions: true
});
if (res.getResponseCode() !== 200) {
console.error('LINE 回覆失敗 ' + res.getResponseCode() + ':' + res.getContentText());
}
}
/** 部署前先執行這個,檢查設定有沒有填好 */
function checkSetup() {
console.log('LINE_ACCESS_TOKEN:' + (cfg_('LINE_ACCESS_TOKEN') ? '已填' : '❌ 沒有填'));
console.log('GEMINI_API_KEY:' + (cfg_('GEMINI_API_KEY') ? '已填' : '❌ 沒有填'));
console.log('GEMINI_MODEL:' + (cfg_('GEMINI_MODEL') || '(沒填,會用預設 gemini-3.5-flash-lite)'));
console.log('PROMPT:' + (cfg_('PROMPT') ? '已填' : '(沒填,會用預設語氣)'));
console.log('KNOWLEDGE:' + (cfg_('KNOWLEDGE') ? '已填' : '(沒填,AI 大部分問題都會說不知道)'));
}
做完你應該看到:編輯區是上面這段,上方出現「已儲存」。
6填設定值(本頁幫你組好)
「指令碼屬性」=這個專案的設定欄位;秘密放這裡,不會出現在程式碼裡。先在下面備齊值(Token/Key 已從步驟 3、4 帶過來),再照表逐格貼。
- GAS 左邊「專案設定」(齒輪)→ 最下面「指令碼屬性」→「新增指令碼屬性」。
- 照下表逐列加:屬性名稱一字不差,值按每列「複製值」貼過去。
- 全部加完按「儲存指令碼屬性」。
| 屬性名稱 | 值 | 複製值 |
|---|---|---|
LINE_ACCESS_TOKEN 必填 | (回步驟 3 貼上 Token) | |
GEMINI_API_KEY 必填 | (回步驟 4 貼上 API Key) | |
KNOWLEDGE 必填 | (在上面填 KNOWLEDGE) | |
PROMPT 可不填 | (沒填,會用預設語氣) | |
GEMINI_MODEL 可不填 | (沒填,會用預設 gemini-3.5-flash-lite) |
做完你應該看到:屬性列表有你加的那幾列。
貼完 Token/Key 後,隨手再複製一段別的文字把剪貼簿蓋掉;Windows 有開剪貼簿記錄(Win+V)的,順手刪掉裡面的秘密。
7執行 checkSetup 檢查
- 回編輯畫面,上方下拉選單選「checkSetup」→ 按「執行」。
- 第一次執行會跳授權:「審查權限」→ 選你的 Google 帳號 → 出現「這個應用程式未經 Google 驗證」是正常的(這程式就是你自己剛貼的)→ 點「進階」→「前往(你的專案名稱)(不安全)」→「繼續/允許」。
做完你應該看到:下方「執行記錄」五行,
LINE_ACCESS_TOKEN、GEMINI_API_KEY、KNOWLEDGE 都寫「已填」。有 ❌ 就回步驟 6 檢查屬性名稱拼字。8部署,拿到網址
- 右上「部署」→「新增部署作業」。
- 「選取類型」旁的齒輪 → 選「網頁應用程式」。
- 兩格設定:「執行身分」=「我(你的 email)」;「誰可以存取」=「所有人」。
- 按「部署」。
- 完成視窗最下面「網頁應用程式」的網址按「複製」。
做完你應該看到:一串
交給 LINE 的網址必須是
https://script.google.com/macros/s/… 網址已複製。可以順手貼進下面這格備用。交給 LINE 的網址必須是
/exec 結尾——結尾不是 /exec(例如網址裡有 library)=複製到別格了,回完成視窗拿「網頁應用程式」那串。9回 Manager 接上線
- 回步驟 2 那頁(Manager → 設定 → Messaging API)。
- 把剛複製的網址貼進「Webhook網址」那格 → 按「儲存」。
- 左邊「回應設定」→ 把「Webhook」開成綠色。
做完你應該看到:Webhook 開關是綠的。設定完成——最後做步驟 10 傳一句話實測,收到 AI 回覆才算上線。
同頁的「自動回應訊息」「加入好友的歡迎訊息」「聊天」開不開由你決定——它們跟機器人回覆不衝突(2026-08 實測)。想讓客人只收到 AI 的回答,就把自動回應關掉。注意:自動回應開著時,你測試收到的可能是罐頭回應而非 AI——測試時以回覆內容判斷。
10手機實測:收你的第一個 AI 回覆
用手機把自己的官方帳號加好友(Console 的 Messaging API 分頁有 QR code),照順序傳兩句。第一次測試先用步驟 6 的範例四行,通了再換自己的內容。
請問你們幾點開?
應該看到:回覆裡有你 KNOWLEDGE 第一行寫的營業時間。
我星期日想過去,順便問一下改期要怎麼弄?
應該看到:同一則回覆同時講到「星期日不營業」和「改期轉真人」——它把兩行資料自己湊起來了,不是背稿。
兩格都勾=免費包完成。你現在有一個真的會回客人的 AI 工作入口,跑在你自己的帳號上,密鑰從頭到尾沒離開你的環境。想讓它更懂:回步驟 6 在 KNOWLEDGE 多寫幾行。下一步見 06。
已複製 ✓
本流程曾以 Windows+Chrome、繁中介面、個人 Gmail/LINE 帳號完成實走;未涵蓋企業帳號與行動裝置瀏覽器安裝。Google/LINE 的介面、配額與政策可能變動,遇到畫面差異以官方當下說明為準。