Hệ thống Báo cáo Tự động Google Trends (Pipedream + Scrapeless + Discord)

Advanced Data Extraction Specialist
Trong lĩnh vực tiếp thị kỹ thuật số, SEO và phân tích xu hướng mới nổi, việc cập nhật với những thay đổi trong Google Trends là rất quan trọng. Tuy nhiên, việc kiểm tra và tổng hợp dữ liệu xu hướng từ khóa bằng tay rất tốn thời gian, dễ mắc lỗi và không hiệu quả. Để giải quyết vấn đề này, chúng tôi đã xây dựng một hệ thống báo cáo tự động tích hợp Pipedream, Scrapeless API và Discord Webhook để tối ưu hóa toàn bộ quy trình – từ thu thập từ khóa và xử lý dữ liệu đến giao nhận kết quả.
Bài viết này sẽ hướng dẫn bạn chi tiết về các thành phần và cách triển khai hệ thống tự động này.
Tính Năng Chính
-
Phân Tích Xu Hướng Từ Khóa Tự Động: Lấy dữ liệu xu hướng trong tháng trước bằng Scrapeless.
-
Tính Toán & Xử Lý Thông Minh: Tự động tính toán độ phổ biến trung bình và biến động xu hướng cho mỗi từ khóa.
-
Báo Cáo Phân Tích Trực Quan: Tạo báo cáo có cấu trúc với hình ảnh và gửi trực tiếp đến Discord.
Điều Kiện Tiên Quyết
- Đăng ký trên Scrapeless và lấy API Key của bạn.
- Tìm API Token của bạn và sao chép để sử dụng sau.

⚠️ Lưu ý: Giữ API Token của bạn an toàn và không chia sẻ với người khác.
- Đăng nhập vào Pipedream
- Nhấp vào "+ New Workflow" để tạo một workflow mới.

Cách Tạo Hệ Thống Báo Cáo Tự Động Google Trends (Pipedream + Scrapeless + Discord)
Cấu Trúc Workflow
Tên Bước | Loại | Chức Năng |
---|---|---|
trigger |
Lịch trình | Kích hoạt workflow theo lịch (ví dụ, mỗi giờ) |
http |
Mã Node.js | Gửi tác vụ thu thập dữ liệu đến Scrapeless và lấy kết quả |
code_step |
Mã Node.js | Phân tích và xử lý dữ liệu đã thu thập |
discord_notify |
Mã Node.js | Gửi kết quả phân tích đến Discord thông qua webhook |
Bước 1: Kích hoạt theo lịch
Chọn loại kích hoạt là Lịch trình và đặt thời gian kích hoạt để tự động thực hiện workflow này mỗi Chủ nhật lúc 16:00 theo giờ UTC.

Bước 2 - http (yêu cầu Scrapeless thu thập xu hướng từ khóa)

- Thêm một bước mã Node.js. Dưới đây là một ví dụ mã tích hợp logic gọi API Scrapeless.
import { axios } from "@pipedream/platform"
export default defineComponent({
async run({ steps, $ }) {
const keywords = ["AI", "Học Máy", "Khoa Học Dữ Liệu"];
const allResults = {};
for (const keyword of keywords) {
console.log(`Đang xử lý từ khóa: ${keyword}`);
const payload = {
actor: "scraper.google.trends",
input: {
q: keyword,
date: "hôm nay 1-tháng",
data_type: "interest_over_time",
hl: "vi",
tz: "420",
geo: "",
cat: "",
property: "",
},
proxy: {
country: "",
}
};
try {
const response = await axios($, {
method: 'POST',
url: 'https://api.scrapeless.com/api/v1/scraper/request',
headers: {
'Content-Type': 'application/json',
'x-api-token': 'Scrapeless API KEY'
},
data: payload
});
console.log(`Phản hồi cho ${keyword}:`, response);
if (response.job_id) {
console.log(`Công việc đã được tạo cho ${keyword}, ID: ${response.job_id}`);
let attempts = 0;
const maxAttempts = 12;
let jobResult = null;
while (attempts < maxAttempts) {
await new Promise(resolve => setTimeout(resolve, 10000));
attempts++;
try {
const resultResponse = await axios($, {
method: 'GET',
url: `https://api.scrapeless.com/api/v1/scraper/result/${response.job_id}`,
headers: {
'x-api-token': 'Scrapeless API KEY'
}
});
console.log(`Cố gắng ${attempts} cho ${keyword}:`, resultResponse);
if (resultResponse.status === 'completed') {
jobResult = resultResponse.result;
```javascript
console.log(`Công việc đã hoàn thành cho ${keyword}:`, jobResult);
break;
} else if (resultResponse.status === 'failed') {
console.error(`Công việc thất bại cho ${keyword}:`, resultResponse);
break;
} else {
console.log(`Công việc vẫn đang chạy cho ${keyword}, trạng thái: ${resultResponse.status}`);
}
} catch (error) {
console.error(`Lỗi kiểm tra trạng thái công việc cho ${keyword}:`, error);
}
}
if (jobResult) {
allResults[keyword] = jobResult;
} else {
allResults[keyword] = {
error: `Công việc hết thời gian hoặc thất bại sau ${attempts} lần thử`,
job_id: response.job_id
};
}
} else {
allResults[keyword] = response;
}
} catch (error) {
console.error(`Lỗi cho ${keyword}:`, error);
allResults[keyword] = {
error: `Yêu cầu thất bại: ${error.message}`
};
}
}
console.log("Kết quả cuối cùng:", JSON.stringify(allResults, null, 2));
return allResults;
},
})
Here is the translation of the provided text into Vietnamese:
từ khóa,
trung bình: 0,
xu hướng: 0,
xu hướng hàng tuần: 0,
giá trị: [],
tối đa: 0,
tối thiểu: 0,
điểm dữ liệu: 0,
là một phần: sai,
lỗi: "Không tìm thấy dữ liệu thời gian",
trạng thái: 'lỗi',
các khóa có sẵn: dữ liệu ? Object.keys(data) : []
};
}
}
tóm tắt = {
dấu thời gian,
tổng số từ khóa: Object.keys(processedData).length,
từ khóa thành công: Object.values(processedData).filter(d => d.status === 'success').length,
khoảng thời gian: "hôm nay 1-m",
dữ liệu: processedData
};
console.log("Dữ liệu đã xử lý cuối cùng:", JSON.stringify(tóm tắt, null, 2));
return tóm tắt;
},
})
Nó sẽ tính toán các chỉ số sau dựa trên dữ liệu được trả lại bởi Scrapeless:
- Giá trị trung bình
- Thay đổi xu hướng hàng tuần (7 ngày qua so với 7 ngày trước)
- Giá trị tối đa / tối thiểu
- Biến động
Lưu ý:
- Mỗi từ khóa sẽ tạo ra một đối tượng phân tích chi tiết, giúp dễ dàng cho việc trực quan hóa và thông báo thêm.
Bước 4 - discord_notify (Đẩy báo cáo phân tích lên Discord)

- Thêm bước Node.js cuối cùng, dưới đây là đoạn mã ví dụ
import { axios } từ "@pipedream/platform"
xuất mặc định defineComponent({
async run({ steps, $ }) {
const processedData = steps.Code_step.$return_value;
const discordWebhookUrl = "https://discord.com/api/webhooks/1380448411299614821/MXzmQ14TOPK912lWhle_7qna2VQJBjWrdCkmHjdEloHKhYXw0fpBrp-0FS4MDpDB8tGh";
console.log("Đang xử lý dữ liệu cho Discord:", JSON.stringify(processedData, null, 2));
const currentDate = new Date().toLocaleString('en-US');
const keywords = Object.values(processedData.data);
const successful = keywords.filter(k => k.status === 'success');
let bestPerformer = null;
let worstPerformer = null;
let strongestTrend = null;
if (successful.length > 0) {
bestPerformer = successful.reduce((max, curr) => curr.average > max.average ? curr : max);
worstPerformer = successful.reduce((min, curr) => curr.average < min.average ? curr : min);
strongestTrend = successful.reduce((max, curr) => Math.abs(curr.weeklyTrend) > Math.abs(max.weeklyTrend) ? curr : max);
}
const discordMessage = {
content: `📊 **Báo cáo Google Trends** - ${currentDate}`,
embeds: [
{
title: "🔍 Phân tích Xu hướng",
color: 3447003,
timestamp: new Date().toISOString(),
fields: [
{
name: "📈 Tóm tắt",
value: `**Thời gian:** Tháng trước\n**Từ khóa đã phân tích:** ${processedData.totalKeywords}\n**Thành công:** ${processedData.successfulKeywords}/${processedData.totalKeywords}`,
inline: false
}
]
}
]
};
if (successful.length > 0) {
const keywordDetails = successful.map(data => {
const trendIcon = data.weeklyTrend > 5 ? '🚀' :
data.weeklyTrend > 0 ? '📈' :
data.weeklyTrend < -5 ? '📉' :
data.weeklyTrend < 0 ? '⬇️' : '➡️';
const performanceIcon = data.average > 70 ? '🔥' :
data.average > 40 ? '✅' :
data.average > 20 ? '🟡' : '🔴';
return {
name: `${performanceIcon} ${data.keyword}`,
value: `**Điểm:** ${data.average}/100\n**Xu hướng:** ${trendIcon} ${data.weeklyTrend > 0 ? '+' : ''}${data.weeklyTrend}\n**Phạm vi:** ${data.min}-${data.max}`,
inline: true
};
});
discordMessage.embeds[0].fields.push(...keywordDetails);
}
if (bestPerformer && successful.length > 1) {
discordMessage.embeds.push({
title: "🏆 Điểm nổi bật chính",
color: 15844367,
fields: [
{
name: "🥇 Người thực hiện hàng đầu",
value: `**${bestPerformer.keyword}** (${bestPerformer.average}/100)`,
inline: true
},
{
name: "📊 Điểm thấp nhất",
value: `**${worstPerformer.keyword}** (${worstPerformer.average}/100)`,
inline: true
},
{
name: "⚡ Xu hướng mạnh nhất",
value: `**${strongestTrend.keyword}** (${strongestTrend.weeklyTrend > 0 ? '+' : ''}${strongestTrend.weeklyTrend})`,
inline: true
}
]
});
}
const failed = keywords.filter(k => k.status === 'error');
if (failed.length > 0) {
discordMessage.embeds.push({
title: "❌ Lỗi",
color: 15158332,
fields: failed.map(data => ({
name: data.keyword,
value: data.error || "Lỗi không rõ",
inline: true
}))
});
Feel free to ask if you need any further assistance!
vi
}
console.log("Tin nhắn Discord để gửi:", JSON.stringify(discordMessage, null, 2));
try {
const response = await axios($, {
method: 'POST',
url: discordWebhookUrl,
headers: {
'Content-Type': 'application/json'
},
data: discordMessage
});
console.log("Phản hồi webhook Discord:", response);
return {
webhook_sent: true,
platform: "discord",
message_sent: true,
keywords_analyzed: processedData.totalKeywords,
successful_keywords: processedData.successfulKeywords,
timestamp: currentDate,
discord_response: response
};
} catch (error) {
console.error("Lỗi webhook Discord:", error);
const simpleMessage = {
content: `📊 **Báo cáo Google Trends - ${currentDate}**\n\n` +
`📈 **Kết quả (${processedData.successfulKeywords}/${processedData.totalKeywords}):**\n` +
successful.map(data =>
`• **${data.keyword}**: ${data.average}/100 (${data.weeklyTrend > 0 ? '+' : ''}${data.weeklyTrend})`
).join('\n') +
(failed.length > 0 ? `\n\n❌ **Lỗi:** ${failed.map(d => d.keyword).join(', ')}` : '')
};
try {
const fallbackResponse = await axios($, {
method: 'POST',
url: discordWebhookUrl,
headers: {
'Content-Type': 'application/json'
},
data: simpleMessage
});
return {
webhook_sent: true,
platform: "discord",
message_sent: true,
fallback_used: true,
discord_response: fallbackResponse
};
} catch (fallbackError) {
console.error("Lỗi dự phòng Discord:", fallbackError);
return {
webhook_sent: false,
platform: "discord",
error: error.message,
fallback_error: fallbackError.message,
data_summary: {
keywords: processedData.totalKeywords,
successful: processedData.successfulKeywords,
best_performer: bestPerformer?.keyword,
best_score: bestPerformer?.average
}
};
}
}
},
})
- Thay thế ĐỊA CHỈ WEBHOOK DISCORD CỦA BẠN bằng địa chỉ Webhook của riêng bạn.
- Nhấp vào Triển khai để chạy quy trình làm việc của bạn và nhận thông tin theo thời gian thực.
Bước 5 - Nhận thông tin Google Trends theo thời gian thực
Bạn có thể nhận dữ liệu để kiểm tra từ khóa trực tiếp trên Discord:

Dưới đây là sơ đồ liên kết hoàn chỉnh:

✅ Hiện tại: Tích hợp chính thức Scrapeless trên Pipedream
Scrapeless hiện đã có sẵn trên trung tâm tích hợp của Pipedream! Chỉ với vài cú nhấp chuột, bạn có thể gọi API Google Trends mạnh mẽ của chúng tôi trực tiếp từ các quy trình làm việc của Pipedream—không cần thiết lập, không cần máy chủ.
Dù bạn đang xây dựng bảng điều khiển theo thời gian thực, tự động hóa thông tin tiếp thị, hay cung cấp phân tích tùy chỉnh, tích hợp này mang đến cho bạn con đường nhanh nhất đến việc theo dõi xu hướng chất lượng sản xuất.
👉 Bắt đầu xây dựng ngay: pipedream.com/apps/scrapeless
Kéo, thả và triển khai quy trình làm việc dựa trên xu hướng tiếp theo của bạn—ngày hôm nay.
Hoàn hảo cho các nhà phát triển, nhà phân tích và đội ngũ phát triển cần thông tin có thể hành động, nhanh chóng.
Tóm tắt
Thông qua sự kết hợp mạnh mẽ của Pipedream, Scrapeless API và Discord, chúng tôi đã xây dựng một hệ thống báo cáo Google Trends không cần can thiệp thủ công và được thực hiện tự động hàng ngày. Điều này không chỉ cải thiện đáng kể hiệu suất làm việc, mà còn giúp quyết định tiếp thị dựa trên dữ liệu nhiều hơn.
Nếu bạn cũng cần xây dựng một hệ thống phân tích tự động tương tự, hãy thử nghiệm sự kết hợp công nghệ này!
Scrapeless hoạt động hoàn toàn tuân thủ các luật và quy định áp dụng, chỉ truy cập dữ liệu công khai có sẵn theo điều khoản dịch vụ của nền tảng. Giải pháp này được thiết kế cho mục đích thông tin và nghiên cứu kinh doanh hợp pháp.
Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.