构建一个霓虹浸染的 Last.fm 吐槽机器人,费用仅 $1.75/年
Source: Dev.to
我们每个人的听歌历史中都有那首我们不希望别人看到的歌曲。与其隐藏我的羞耻,我决定把它自动化!
我最近在 Poe 上构建了自己的自定义 AI 机器人,名为 lastfm-roaster。它唯一的工作就是查看某人的 Last.fm 音乐品味(如果你感兴趣,这里是我的示例 这是我的),并彻底嘲讽他们。
但出现了问题: 这些嘲讽被困在聊天机器人界面中。我希望它们每天早晨直接发送到我的收件箱,这样我就可以轻松地把最(最糟)的吐槽转发给朋友们笑一笑。
于是,我构建了一个流水线。
今天,我将向你展示我如何将自定义的 Poe 机器人连接到一个 Python 脚本,该脚本调用 API,分析我的听歌历史,并使用 Regex 将随机的霓虹色注入到精美的 HTML 邮件中。
最棒的是? 它完全免费运行在 GitHub Actions 上,且 API 的费用不足一杯咖啡的费用 全年。
前进!
构建机器人 🤖
我前往 Poe,使用他们的 ScriptBot 功能创建了一个新机器人。我给它设定了一个大致如下的系统提示:
“你是一个自命不凡的音乐评论家。你的任务是分析 Last.fm 个人资料并毫不留情地嘲讽它们。要讽刺、使用俚语,且毫不保留。”
在与 ScriptBot 来回迭代,直到我对结果满意后,我得到了智能体 (lastfm-roaster),但我需要将输出从 Poe 导出并发送到我的电子邮件。

密钥和凭证 🗝️
我们将使用 GitHub Actions 来运行此脚本,这意味着必须确保 API 密钥的安全。切勿在脚本中硬编码密码!
1️⃣ 获取密钥
| 密钥 | 获取方式 |
|---|---|
| Poe API Key | 前往并复制你的密钥。 |
| Gmail 应用密码 | 在 Google 账户 → 安全性 → 两步验证 → 应用密码,为 “Mail” 生成一个 16 位字符的密码。 |
2️⃣ 在 GitHub 中存储
- 在 GitHub 上创建一个 私有 仓库。
- 前往 Settings → Secrets and variables → Actions。
- 添加以下三个 secret:
POE_API_KEYEMAIL_ADDRESSEMAIL_PASSWORD

第三步:代码 🐍
requirements.txt
openai
markdown
(是的,我们使用 openai!Poe 的 API 与 OpenAI 客户端兼容,使其使用起来非常简便。Gemini 2.5 Flash 通过 Poe API 引用,这样我就不必管理单独的密钥了。)
“霓虹”脚本 – lastfm_roast.py
import os
import smtplib
import markdown
import re
import itertools
from email.message import EmailMessage
from openai import OpenAI
# Configs (loaded safely from GitHub Secrets)
POE_API_KEY = os.environ.get("POE_API_KEY")
EMAIL_ADDRESS = os.environ.get("EMAIL_ADDRESS")
EMAIL_PASSWORD = os.environ.get("EMAIL_PASSWORD")
LASTFM_URL = "https://www.last.fm/user/profoundlypaige"
# --- NEON PALETTE ---
# A list of bright colors that look good on dark backgrounds
# (Pink, Cyan, Green, Orange, Purple, Yellow)
COLORS = ["#FF79C6", "#8BE9FD", "#50FA7B", "#FFB86C", "#BD93F9", "#F1FA8C"]
def get_roast():
"""Pings the Poe API to get the roast."""
client = OpenAI(api_key=POE_API_KEY, base_url="https://api.poe.com/v1")
try:
print("🔥 Fetching roast from Poe...")
response = client.chat.completions.create(
model="lastfm-roaster",
messages=[{"role": "user", "content": f"Roast my music taste: {LASTFM_URL}"}],
)
return response.choices[0].message.content
except Exception as e:
return f"Error fetching roast: {e}"
def inject_colors(html_content):
"""
Finds every <b> tag and injects a different color from the palette.
"""
color_cycle = itertools.cycle(COLORS)
def replace_match(match):
next_color = next(color_cycle)
# Returns <b style="color: #...">...</b>
return f''
# Regex to replace <b> with the colored version
return re.sub(r'', replace_match, html_content)
def create_html_email(roast_text):
# 1. Convert Markdown to basic HTML
raw_html = markdown.markdown(roast_text)
# 2. Inject the rotating neon colors into bold tags
colorful_html = inject_colors(raw_html)
# 3. Wrap in the styled container
html_template = f"""
body {{ margin: 0; padding: 0; background-color: #121212; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; }}
.container {{
max-width: 600px;
margin: 40px auto;
background-color: #1e1e1e;
border-radius: 8px;
padding: 20px;
color: #f8f8f2;
}}
a {{ color: #8be9fd; }}
{colorful_html}
"""
return html_template
def send_email(html_content):
msg = EmailMessage()
msg["Subject"] = "Your Daily Last.fm Roast"
msg["From"] = EMAIL_ADDRESS
msg["To"] = EMAIL_ADDRESS
msg.set_content("Your email client does not support HTML.", subtype="plain")
msg.add_alternative(html_content, subtype="html")
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
smtp.send_message(msg)
print("📧 Email sent!")
if __name__ == "__main__":
roast = get_roast()
html_email = create_html_email(roast)
send_email(html_email)
GitHub Actions 工作流
创建 .github/workflows/roast.yml:
name: Daily Last.fm Roast
on:
schedule:
- cron: "0 8 * * *" # Runs every day at 08:00 UTC
workflow_dispatch: # Allows manual runs
jobs:
roast:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run roast script
env:
POE_API_KEY: ${{ secrets.POE_API_KEY }}
EMAIL_ADDRESS: ${{ secrets.EMAIL_ADDRESS }}
EMAIL_PASSWORD: ${{ secrets.EMAIL_PASSWORD }}
run: python lastfm_roast.py
提交所有更改,推送到 GitHub,工作流将每天早晨触发,将新鲜、霓虹色的吐槽直接发送到你的收件箱。
TL;DR
- 创建一个 Poe ScriptBot (
lastfm-roaster)。 - 在 GitHub Secrets 中存储 API 密钥。
- 编写
lastfm_roast.py– 获取吐槽内容,注入霓虹色彩,并通过电子邮件发送。 - 添加 GitHub Actions 工作流,每日运行脚本。
现在你再也不必隐藏那首尴尬的曲目——只要每天收到一剂讽刺、色彩斑斓的羞辱,即可随时与朋友分享。祝玩得开心!
清理后的 Markdown 内容
以下是原始 Markdown 片段的清理后版本。所有标题、代码块、图片及其他元素均已保留,但排版已整理以提升可读性。
CSS 与 HTML 模板
.container {
max-width: 800px;
margin: 0 auto;
background: #1e1e1e;
color: #d1d5db;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
border-radius: 16px;
overflow: hidden;
box-shadow: 0 10px 30px rgba(0,0,0,0.5);
border: 1px solid #333;
}
.header {
background: linear-gradient(135deg, #2b2b2b 0%, #1a1a1a 100%);
padding: 30px;
text-align: center;
border-bottom: 2px solid #333;
}
/* Gradient title text */
.header h1 {
margin: 0;
font-size: 28px;
letter-spacing: 2px;
text-transform: uppercase;
background: -webkit-linear-gradient(#FF79C6, #8BE9FD);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.content {
padding: 30px;
color: #d1d5db;
line-height: 1.7;
font-size: 16px;
}
h2 {
color: #ffffff;
border-left: 5px solid #BD93F9; /* Purple accent */
padding-left: 15px;
margin-top: 30px;
text-transform: uppercase;
font-size: 18px;
letter-spacing: 1px;
}
ul { padding-left: 20px; }
li { margin-bottom: 10px; }
/* Link styles */
a {
color: #8BE9FD;
text-decoration: none;
border-bottom: 1px dotted #8BE9FD;
}
.footer {
background-color: #121212;
padding: 20px;
text-align: center;
font-size: 12px;
color: #555;
}
🔥 每日燃烧
{colorful_html}
由 Poe API、Gemini 2.5 Flash 和 GitHub Actions 新鲜提供
[查看您悲剧的 Last.fm 个人资料]({LASTFM_URL})
### Python 电子邮件发送脚本
```python
def create_html_email(roast_text):
html_template = f"""
Daily Roast
{CSS_BLOCK}
🔥 每日燃烧
{colorful_html}
由 Poe API、Gemini 2.5 Flash 与 GitHub Actions 新鲜提供
[查看你那悲催的 Last.fm 个人资料]({LASTFM_URL})
"""
return html_template
def send_email(roast_text): msg = EmailMessage() msg[“Subject”] = “你的每日 Last.fm 调侃 🎸” msg[“From”] = EMAIL_ADDRESS msg[“To”] = EMAIL_ADDRESS msg.set_content(roast_text) msg.add_alternative(create_html_email(roast_text), subtype=‘html’)
try:
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
smtp.send_message(msg)
print("✅ 邮件发送成功!")
except Exception as e:
print(f"❌ 邮件发送失败: {e}")
if name == “main”: roast = get_roast() send_email(roast)
### 使用 GitHub Actions 自动化 🤖
我不想手动运行——我想让调侃每天自动发送。下面的工作流文件正是如此。
创建 `.github/workflows/daily_roast.yml`:
```yaml
name: Daily Lastfm Roast
on:
schedule:
- cron: '0 12 * * *' # UTC 中午 12 点,每天
jobs:
roast:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.9'
- run: pip install -r requirements.txt
- run: python lastfm_roast.py
env:
POE_API_KEY: ${{ secrets.POE_API_KEY }}
EMAIL_ADDRESS: ${{ secrets.EMAIL_ADDRESS }}
EMAIL_PASSWORD: ${{ secrets.EMAIL_PASSWORD }}
值得吗? 💸
这是我最喜欢的部分。Poe 会收取 计算点数 来运行模型(我使用的是 Gemini 2.5 Flash)。经过几次测试后,我记录了费用:
| 指标 | 数值 |
|---|---|
| 模型 | Gemini 2.5 Flash |
| 每次请求费用 | ~161 计算点 |
| 美元费用 | ~0.0048 美元/次调侃 |
全年费用:
$0.0048 × 365 天 = $1.75
每年 $1.75 —— 不到两块钱,你就能拥有一款最先进的 LLM,每天早上分析你的听歌趋势并告诉你你的独立流行音乐口味是“千篇一律且悲伤”。高回报率! 📈
结果:前后对比
之前(聊天界面):
- 被困在应用里。
- 难以分享。
- 纯 markdown 文本。
之后(霓虹升级版):

现在邮件展示一个时尚的暗色卡片。乐队名称(被调侃的目标)以 粉红、青色、绿色 高亮显示,毫不含糊地告诉你 谁 成了被嘲笑的对象。因为是邮件,你可以立刻转发给朋友,让他们也一起笑你的痛苦。
收尾
这段话…… (原文在此截断,如有需要请自行补全)
# (Custom Bot + API + HTML Generation + Actions)
这是我几乎所有个人自动化的首选方案。它稳健、免费托管,并能创造真正有趣的每日互动。
提到的仓库
如果你尝试了,请在评论中告诉我,或者分享 AI 给你的最糟糕的吐槽。祝编码愉快! ✨