获取每日新闻api
九月份的时候,因为每天上班时候坐电梯想看下昨天发生了啥,就寻思写个接口获取一下新闻,然后推送过来;找了好几家接口都更新速度太慢了,索性自己来了;基本逻辑:
是抓包知乎里的一个大佬每天更新,他差不多每天凌晨更新, 我早8更新肯定木得问题;
知乎地址:https://www.zhihu.com/api/v4/columns/c_1261258401923026944/items
然后根据获取的数据进行解析:
// 将HTML字符串转换为DOM对象
const parser = new DOMParser();
const doc = parser.parseFromString(html, 'text/html');
// 选择所有的<p>元素
const paragraphs = doc.querySelectorAll('p');
// 遍历每个<p>元素并提取文本内容
const texts = [];
// 输出提取的文本内容
paragraphs.forEach((p) => { const text = p.textContent.trim(); texts.push(text); });
// 输出数据
console.log(texts);根据这个解析数据写node脚本
const express = require('express');
const https = require('https');
const cheerio = require('cheerio');
const app = express();
const port = 3000;
app.get('/api/data', (req, res) => {
// 发起GET请求获取API数据
https.get('https://www.zhihu.com/api/v4/columns/c_1261258401923026944/items', (response) => {
let data = '';
// 接收数据块并拼接
response.on('data', (chunk) => {
data += chunk;
});
// 数据接收完毕后进行处理
response.on('end', () => {
try {
const jsonData = JSON.parse(data); // 解析返回的JSON数据
const firstItem = jsonData.data; // 获取第一条数据
const content = firstItem.content; // 获取content字段
// 使用cheerio加载HTML字符串
const $ = cheerio.load(content);
// 选择所有的<p>元素
const paragraphs = $('p');
// 遍历每个<p>元素并提取非空文本内容
const texts = [];
paragraphs.each((index, element) => {
const text = $(element).text().trim();
if (text !== '') {
texts.push(text);
}
});
// 添加当前时间和返回状态
const result = {
status: response.statusCode,
timestamp: new Date().toLocaleString(),
data: texts
};
// 返回结果
res.json(result);
} catch (error) {
console.error('Error:', error.message);
res.status(500).json({ error: 'Internal Server Error' });
}
});
}).on('error', (error) => {
console.error('Error:', error.message);
res.status(500).json({ error: 'Internal Server Error' });
});
});
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});后来闲着没事,写了个脚本推送给wx测试程序, 我写了定时,每天早8推给我
const axios = require('axios');
const cron = require('node-cron');
// 配置参数
const config = {
appId: 'xxxxx',
appSecret: 'xxxxx',
openId: 'xxxxxx',
templateId: 'xxxxx',
};
// 获取 access_token
async function getAccessToken() {
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${config.appId}&secret=${config.appSecret}`;
try {
const response = await axios.get(url);
return response.data.access_token;
} catch (error) {
console.error(error);
throw error;
}
}
// 调用接口获取数据
async function getDate() {
const url = `接口地址`;
try {
const response = await axios.get(url);
return response.data;
} catch (error) {
console.error(error);
throw error;
}
}
// 发送
async function sendTemplateMessage(token, config, configdate) {
const url = `https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${token}`;
const data = {
touser: config.openId,
template_id: config.templateId,
url: 'http://new.v60s.cn',
data: {
nowDate: {
value: configdate.data,
color: '#57E6E2',
},
low: {
value: configdate.data,
color: '#7CD47D',
},
high: {
value: configdate.data,
color: '#CBA476',
},
loveDate: {
value: configdate.data,
color: '#AEC5C8',
},
},
};
try {
const response = await axios.post(url, data);
console.log('sendTemplateMessage response:', response.data);
} catch (error) {
console.error(error);
throw error;
}
}
// 调用发送模板消息函数
async function main() {
const configdate = await getDate();
const token = await getAccessToken();
await sendTemplateMessage(token, config, configdate);
}
// 每天早上8点执行
cron.schedule('0 8 * * *', () => {
main();
});最/后配一个html页面;
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>每天一分钟,知晓天下事</title>
<style>
/* 样式可以根据需要自行定制 */
body {
font-family: Arial, sans-serif;
background-color: #f1f1f1;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
border-radius: 5px;
}
h1 {
color: #333;
text-align: center;
}
.data-list {
list-style: none;
padding: 0;
}
.data-item {
margin-bottom: 10px;
padding: 10px;
background-color: #f9f9f9;
border-radius: 5px;
}
.data-item .content {
margin-bottom: 10px;
}
.data-item .content p {
margin: 0;
padding: 0;
}
.timestamp {
text-align: center;
color: #666;
}
</style>
</head>
<body>
<div class="container">
<h1>每天一分钟,知晓天下事</h1>
<div class="data-list" id="dataList"></div>
<p class="timestamp" id="timestamp"></p>
</div>
<script>
// 使用异步请求获取数据
fetch('http://42.123.125.40:3000/api/data')
.then(response => response.json())
.then(data => {
const dataList = document.getElementById('dataList');
const timestamp = document.getElementById('timestamp');
// 渲染数据列表
data.data.forEach(item => {
const listItem = document.createElement('div');
listItem.className = 'data-item';
const content = document.createElement('div');
content.className = 'content';
item.split('\n').forEach(paragraph => {
const p = document.createElement('p');
p.textContent = paragraph;
content.appendChild(p);
});
listItem.appendChild(content);
dataList.appendChild(listItem);
});
// 显示时间戳
timestamp.textContent = `数据最/新更新时间:${data.timestamp}`;
})
.catch(error => console.error(error));
</script>
</body>
</html>
6666666666666666666666666
页:
[1]