# คู่มือตั้งค่า YouTube API สำหรับ Erika คู่มือนี้ใช้สำหรับเชื่อมช่อง YouTube หนึ่งช่องกับหน้า `/admin/upload` เพื่ออ่านรายการวิดีโอล่าสุด อัปโหลดวิดีโอ ตั้งภาพปก และตั้งเวลาเผยแพร่ ## 1. สร้าง Google Cloud Project 1. เข้า [Google Cloud Console](https://console.cloud.google.com/) 2. กดชื่อโปรเจกต์ด้านบน แล้วเลือก **New project** 3. ตั้งชื่อ เช่น `Erika YouTube Uploader` 4. กด **Create** และเลือกโปรเจกต์ที่สร้างใหม่ ## 2. เปิดใช้ YouTube Data API v3 1. เปิด [YouTube Data API v3](https://console.cloud.google.com/apis/library/youtube.googleapis.com) 2. ตรวจสอบว่าเลือกโปรเจกต์ถูกต้อง 3. กด **Enable** API นี้ใช้ทั้งอ่านวิดีโอล่าสุดและอัปโหลดวิดีโอ โดยคำขอทุกแบบจะใช้โควตาของโปรเจกต์ ดูรายละเอียดได้ที่ [YouTube Data API Overview](https://developers.google.com/youtube/v3/getting-started) ## 3. ตั้งค่า OAuth consent screen 1. ไปที่ **Google Auth Platform** → **Branding** 2. ใส่ชื่อแอป อีเมลซัพพอร์ต และอีเมลติดต่อผู้พัฒนา 3. ไปที่ **Audience** 4. ถ้าใช้ส่วนตัว ให้เลือก **External** และสถานะ **Testing** 5. เพิ่มบัญชี Google ที่เป็นเจ้าของช่อง YouTube ในรายการ **Test users** 6. ไปที่ **Data Access** และเพิ่ม scope: ```text https://www.googleapis.com/auth/youtube.upload ``` scope นี้อนุญาตให้ Erika จัดการวิดีโอที่อัปโหลดไปยังช่อง ดูรายละเอียด OAuth ของ YouTube ได้ที่ [OAuth 2.0 for Web Server Applications](https://developers.google.com/youtube/v3/guides/auth/server-side-web-apps) ## 4. สร้าง OAuth Client 1. ไปที่ **Google Auth Platform** → **Clients** 2. กด **Create client** 3. เลือกชนิด **Web application** 4. ตั้งชื่อ เช่น `Erika Admin` 5. ใน **Authorized redirect URIs** เพิ่ม URL นี้ โดยเปลี่ยนโดเมนให้ตรงกับ `BASE_URL`: ```text https://your-domain.com/api/auth/youtube/callback ``` ตัวอย่าง production: ```text https://erika.sudloh.com/api/auth/youtube/callback ``` ถ้าทดสอบในเครื่องและ `BASE_URL=http://localhost:4000` ให้เพิ่ม: ```text http://localhost:4000/api/auth/youtube/callback ``` 6. กด **Create** แล้วคัดลอก **Client ID** และ **Client secret** ## 5. สร้าง API Key สำหรับรายการวิดีโอล่าสุด 1. ไปที่ **APIs & Services** → **Credentials** 2. กด **Create credentials** → **API key** 3. เปิด **Edit API key** 4. ใน **API restrictions** เลือก **Restrict key** 5. เลือกเฉพาะ **YouTube Data API v3** แล้วบันทึก หา Channel ID ได้จาก YouTube Studio หรือ URL/ข้อมูลขั้นสูงของช่อง ## 6. เพิ่มค่าในไฟล์ environment เพิ่มค่าต่อไปนี้ใน `.env` และ `.env.local` ตามฐานข้อมูล/สภาพแวดล้อมที่ใช้งาน: ```env BASE_URL=https://your-domain.com YOUTUBE_API_KEY=your_api_key YOUTUBE_CHANNEL_ID=your_channel_id YOUTUBE_CLIENT_ID=your_oauth_client_id YOUTUBE_CLIENT_SECRET=your_oauth_client_secret ``` อย่าใส่ secret ในตัวแปรที่ขึ้นต้นด้วย `NEXT_PUBLIC_` และอย่า commit ไฟล์ `.env` ## 7. ขอ Refresh Token 1. รีสตาร์ตแอปหลังเพิ่ม environment variables 2. ล็อกอินด้วยบัญชี Discord ที่อยู่ใน `ADMIN_DISCORD_IDS` 3. เปิด URL: ```text https://your-domain.com/api/auth/youtube ``` 4. เลือกบัญชี Google ที่เป็นเจ้าของช่อง YouTube 5. อนุญาตสิทธิ์อัปโหลดวิดีโอ 6. หน้า callback จะแสดง `YOUTUBE_REFRESH_TOKEN` 7. คัดลอกไปใส่ `.env` หรือ `.env.local`: ```env YOUTUBE_REFRESH_TOKEN=your_refresh_token ``` 8. รีสตาร์ตแอปอีกครั้ง Refresh token เป็นข้อมูลลับ ห้ามส่งให้ผู้อื่นหรือบันทึกลง Git ## 8. ทดสอบ 1. เปิด `/admin/upload` 2. ไปแท็บ **Recent videos** และตรวจสอบว่าวิดีโอ YouTube ล่าสุดแสดงขึ้นมา 3. ไปแท็บ **Upload** เลือกไฟล์วิดีโอและรอแถบ Background upload ครบ 100% 4. กรอกชื่อ รายละเอียด และตั้งค่า YouTube 5. กด **Upload to both platforms** หรือเลือกวันเวลาแล้วกด **Schedule both uploads** 6. ตรวจสอบผลในแท็บ **History** ## แก้ปัญหาที่พบบ่อย ### `redirect_uri_mismatch` ค่า redirect URI ใน Google Cloud ต้องตรงกับ `${BASE_URL}/api/auth/youtube/callback` ทุกตัวอักษร รวม `http/https` โดเมน พอร์ต และ path ### ไม่ได้รับ Refresh Token ลบสิทธิ์แอปเดิมจากบัญชี Google แล้วเปิด `/api/auth/youtube` ใหม่ ระบบของ Erika ส่ง `access_type=offline` และ `prompt=consent` เพื่อขอ refresh token ใหม่ ### เห็นหน้า “Google hasn’t verified this app” ถ้าแอปอยู่ในโหมด Testing ให้เพิ่มบัญชี Google เป็น Test user ก่อน สำหรับแอปสาธารณะอาจต้องผ่านขั้นตอน OAuth verification ของ Google ### วิดีโอถูกจำกัดเป็น Private โปรเจกต์ API ที่ยังไม่ผ่านการตรวจสอบจาก YouTube อาจถูกจำกัดให้อัปโหลดเป็น Private จนกว่าจะผ่าน API audit ### Quota เต็ม ตรวจสอบที่ **Google Cloud Console** → **APIs & Services** → **YouTube Data API v3** → **Quotas** การอัปโหลดวิดีโอใช้โควตาสูงกว่าการอ่านข้อมูลทั่วไป