生日快乐,亲爱的

今天是属于你的特别日子,愿你的每一天都充满爱与欢笑。

生日快乐

2025年6月20日

装饰
查看照片墙

爱的祝福

来自父母的爱

永远爱你的爸妈

"宝贝,生日快乐!愿你的生活如彩虹般绚丽多彩,每一天都充满阳光和欢笑。我们永远爱你!"

来自朋友

最好的朋友

"生日快乐!感谢你一直以来的陪伴,希望未来的日子里我们继续一起疯一起闹,创造更多美好的回忆!"

来自伴侣

一生的挚爱

"亲爱的,生日快乐!你是我生命中最美好的遇见,愿我们携手走过每一个春夏秋冬,直到永远。我爱你!"

来自同事

团队伙伴

"生日快乐!感谢你在工作中的付出和贡献,愿你的事业蒸蒸日上,生活美满幸福!"

留下你的祝福

生日愿望

"愿今年,我能实现自己的梦想,身体健康,事业有成,家人朋友都幸福快乐。希望每一天都充满阳光和希望,每一个梦想都能成真。"

—— 生日许愿人

愿望清单

身体健康

保持良好的生活习惯,坚持锻炼

事业进步

在工作中取得更好的成绩,实现职业目标

学习成长

不断学习新知识,提升自己的技能

旅行探索

去更多的地方,体验不同的文化和风景

家庭幸福

和家人朋友保持良好的关系,创造更多美好回忆

// 采集微博评论的主要逻辑 window.collectWeiboComments = function() { // 评论区的每条评论元素选择器(需根据微博页面结构调整) const commentSelector = 'div.WB_feed_detail > div.WB_detail > div.WB_text'; const commentNodes = document.querySelectorAll(commentSelector); const comments = []; commentNodes.forEach(node => { // 评论内容 const text = node.innerText.trim(); // 评论用户 let user = ''; const userNode = node.parentElement.querySelector('a.WB_text_a'); if (userNode) user = userNode.innerText.trim(); // 评论时间 let time = ''; const timeNode = node.parentElement.querySelector('a[node-type="feed_list_item_date"]'); if (timeNode) time = timeNode.getAttribute('title') || timeNode.innerText.trim(); // 评论点赞数 let like = ''; const likeNode = node.parentElement.parentElement.querySelector('span[node-type="like_status"] em'); if (likeNode) like = likeNode.innerText.trim(); comments.push({ 用户: user, 内容: text, 时间: time, 点赞数: like }); }); return comments; }; // 采集网页所有页的标题、时间、价格 window.collectWebItemsAllPages = async function() { const results = []; let page = 1; while (true) { // 采集当前页 const items = collectCurrentPage(); results.push(...items); // 查找翻页按钮 const nextBtn = document.querySelector('.el-icon.el-icon-arrow-right'); if (!nextBtn || nextBtn.classList.contains('is-disabled')) break; nextBtn.click(); // 等待页面刷新(可根据实际情况调整等待时间或用更智能的检测) await sleep(1200); page++; if (page > 100) break; // 防止死循环 } return results; }; function collectCurrentPage() { const titles = document.querySelectorAll('.items__txt__title'); const times = document.querySelectorAll('.items__txt__time'); const prices = document.querySelectorAll('.items__txt__price'); const len = Math.max(titles.length, times.length, prices.length); const arr = []; for (let i = 0; i < len; i++) { arr.push({ 标题: titles[i]?.innerText.trim() || '', 时间: times[i]?.innerText.trim() || '', 价格: prices[i]?.innerText.trim() || '' }); } return arr; } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } { "manifest_version": 3, "name": "网页元素采集器", "version": "1.0", "description": "采集网页指定元素(标题、时间、价格),支持多页采集并导出为表格。", "permissions": [ "scripting", "activeTab", "downloads" ], "host_permissions": [ "" ], "action": { "default_popup": "popup.html", "default_title": "采集网页元素" }, "background": { "service_worker": "background.js" }, "content_scripts": [ { "matches": [""], "js": ["content.js"] } ] } document.getElementById('collectBtn').addEventListener('click', async () => { document.getElementById('status').textContent = '正在采集数据(多页)...'; const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }); chrome.scripting.executeScript({ target: { tabId: tab.id }, function: collectAllPages }, (results) => { if (chrome.runtime.lastError) { document.getElementById('status').textContent = '采集失败: ' + chrome.runtime.lastError.message; return; } const items = results[0].result; if (!items || items.length === 0) { document.getElementById('status').textContent = '未采集到数据。'; return; } const csv = convertToCSV(items); const blob = new Blob([csv], { type: 'text/csv' }); const url = URL.createObjectURL(blob); chrome.downloads.download({ url, filename: 'web_items.csv', saveAs: true }); document.getElementById('status').textContent = '采集完成,正在下载...'; }); }); function collectAllPages() { if (window.collectWebItemsAllPages) { return window.collectWebItemsAllPages(); } return []; } function convertToCSV(arr) { if (!arr.length) return ''; const keys = Object.keys(arr[0]); const lines = [keys.join(',')]; arr.forEach(obj => { lines.push(keys.map(k => '"' + String(obj[k]).replace(/"/g, '""') + '"').join(',')); }); return lines.join('\r\n'); }