FreshRSS
看了rz的文章,跟着做了个订阅博客的页面,然后由rz给我将它和友情链接放到了同一个页面,这里记录一下搭建方式,以备日后需要再次使用时查阅(以下内容结合了rz和网友小宋的文章,以宝塔为例搭建):
1、在安装了Docker的宝塔服务器终端输入(此处使用默认8080端口,可按需修改):
docker run -d --restart unless-stopped --log-opt max-size=10m \
-p 8080:80 \
-e TZ=Europe/Paris \
-e 'CRON_MIN=1,31' \
-v freshrss_data:/var/www/FreshRSS/data \
-v freshrss_extensions:/var/www/FreshRSS/extensions \
--name freshrss \
freshrss/freshrss
2、在你的防火墙安全组放行上面设置的端口,我的是8080,然后访问:服务器ip:8080(你的端口)
3、安装过程中数据库那里选择 " SQLite ",不然会报错。
4、在宝塔新建一个站点,域名填你要作为rss后台的域名,数据库不用,PHP设置纯静态即可。
5、创建完毕后,选择站点设置-反向代理,其中目标url可以根据自己实际设置的端口,我是8080,就写 刚刚docker服务器的IP:8080,如果你的反代站和docker在同一个服务器,就写 127.0.0.1:8080
6、给域名申请ssl证书并配置到刚刚新建的站点上,记得给域名做解析,这时候你就可以用这个域名访问后台了。
7、进入后台,在【设置->管理->认证】去开启允许api。
8、在【设置->账户->账户管理->API 管理】设置密码并提交保存,记住设置的api密码
9、在自己站点根目录下创建一个php文件,用于放FreshRSS api调用函数,例如:rss.php,内容:
<?php
/**
* 获取最新订阅文章并生成JSON文件
*/
function getAllSubscribedArticlesAndSaveToJson($user, $password)
{
$apiUrl = 'https://你部署FreshRSS的域名/api/greader.php';
$loginUrl = $apiUrl . '/accounts/ClientLogin?Email=' . urlencode($user) . '&Passwd=' . urlencode($password);
$loginResponse = curlRequest($loginUrl);
if (strpos($loginResponse, 'Auth=') !== false) {
$authToken = substr($loginResponse, strpos($loginResponse, 'Auth=') + 5);
$articlesUrl = $apiUrl . '/reader/api/0/stream/contents/reading-list?&n=1000';
$articlesResponse = curlRequest($articlesUrl, $authToken);
$articles = json_decode($articlesResponse, true);
if (isset($articles['items'])) {
usort($articles['items'], function ($a, $b) {
return $b['published'] - $a['published'];
});
$subscriptionsUrl = $apiUrl . '/reader/api/0/subscription/list?output=json';
$subscriptionsResponse = curlRequest($subscriptionsUrl, $authToken);
$subscriptions = json_decode($subscriptionsResponse, true);
if (isset($subscriptions['subscriptions'])) {
$subscriptionMap = array();
foreach ($subscriptions['subscriptions'] as $subscription) {
$subscriptionMap[$subscription['id']] = $subscription;
}
$formattedArticles = array();
foreach ($articles['items'] as $article) {
$desc_length = mb_strlen(strip_tags(html_entity_decode($article['summary']['content'], ENT_QUOTES, 'UTF-8')), 'UTF-8');
if ($desc_length > 20) {
$short_desc = mb_substr(strip_tags(html_entity_decode($article['summary']['content'], ENT_QUOTES, 'UTF-8')), 0, 99, 'UTF-8') . '...';
} else {
$short_desc = strip_tags(html_entity_decode($article['summary']['content'], ENT_QUOTES, 'UTF-8'));
}
$formattedArticle = array(
'site_name' => $article['origin']['title'],
'title' => $article['title'],
'link' => $article['alternate'][0]['href'],
'time' => date('Y-m-d H:i', $article['published']),
'description' => $short_desc,
);
$subscriptionId = $article['origin']['streamId'];
if (isset($subscriptionMap[$subscriptionId])) {
$subscription = $subscriptionMap[$subscriptionId];
$iconUrl = $subscription['iconUrl'];
$filename = 'https://你部署FreshRSS的域名/'.substr($iconUrl, strrpos($iconUrl, '/') + 1);
$formattedArticle['icon'] = $filename;
}
$formattedArticles[] = $formattedArticle;
}
saveToJsonFile($formattedArticles);
return $formattedArticles;
} else {
echo 'Error retrieving articles.';
}
} else {
echo 'Error retrieving articles.';
}
} else {
echo 'Login failed.';
}
return null;
}
function curlRequest($url, $authToken = null)
{
$ch = curl_init($url);
if ($authToken) {
$headers = array(
'Authorization: GoogleLogin auth=' . $authToken,
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
/**
* 将数据保存到JSON文件中
*/
function saveToJsonFile($data)
{
$json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
file_put_contents('output.json', $json);
echo '数据已保存到JSON文件中';
}
// 调用函数并提供用户名和密码
getAllSubscribedArticlesAndSaveToJson('这里是FreshRSS的用户名', '这里是第3步设置的api密码');
10、在宝塔添加一个计划任务,定时访问url,填写上一步创建的php文件(博客地址/rss.php),时间建议2小时访问一次,以更新订阅数据,如果使用cdn,记得添加白名单,避免被拦截(一般不会)。
11、在你博客需要显示订阅数据的地方插入以下代码。
<?php
// 获取JSON数据
$jsonData = file_get_contents('./output.json');
// 将JSON数据解析为PHP数组
$articles = json_decode($jsonData, true);
// 对文章按时间排序(最新的排在前面)
usort($articles, function ($a, $b) {
return strtotime($b['time']) - strtotime($a['time']);
});
// 设置每页显示的文章数量
$itemsPerPage = 30;
// 生成文章列表
foreach (array_slice($articles, 0, $itemsPerPage) as $article) {
$articles_list ='
图标:' . htmlspecialchars($article['icon']) . '
站点标题:' . htmlspecialchars($article['site_name']) . '
文章标题:' . htmlspecialchars($article['title']) . '
文章内容摘要:' . htmlspecialchars($article['description']) . '
文章链接:' . htmlspecialchars($article['link']) . '
文章发布时间:' . htmlspecialchars($article['time']) . '
';
echo $articles_list;
}
?>
获取到数据之后需要根据自己博客UI调整样式,以下是我的,不含样式文件,仅供参考:
<?php
// 获取JSON数据
$jsonData = file_get_contents('./output.json');
// 将JSON数据解析为PHP数组
$articles = json_decode($jsonData, true);
// 对文章按时间排序(最新的排在前面)
usort($articles, function ($a, $b) {
return strtotime($b['time']) - strtotime($a['time']);
});
// 设置每页显示的文章数量
$itemsPerPage = 15;
// 生成文章列表
foreach (array_slice($articles, 0, $itemsPerPage) as $article) {
?>
<article class="flex comment-body my-2" style="margin-top: 2.5rem;">
<div class="flex-none mr-1">
<div class="relative">
<!--输出头像-->
<img no-view="" class="relative z-10 w-12 object-cover border-2 border-gray-200 rounded-md scrollLoading mr-1" src="<?php echo htmlspecialchars($article['icon']); ?>" alt="up">
</div>
</div>
<div class="flex-initial w-full text-sm">
<div class="comment-author mb-1">
<div class="flex items-center">
<!--输出文章链接和站名-->
<a href="<?php echo htmlspecialchars($article['link']); ?>" target="_blank" rel="external nofollow" class="" data-ajax="false" style="text-decoration: none;"><?php echo htmlspecialchars($article['title']); ?></a><span class="mx-1"></span>
</div>
</div>
<div class="comment-content card mb-2">
<!--输出文章摘要-->
<p><?php echo htmlspecialchars($article['description']); ?> <a href="<?php echo htmlspecialchars($article['link']); ?>" target="_blank" rel="external nofollow" class="" data-ajax="false">
查看全文>>></a></p>
</div>
<div class="flex items-center comment-meta text-xs text-gray-500 mt-1" data-no-instant="">
<!--输出站名-->
<span class="flex items-center comment-reply text-muted comment-reply-link hover:text-blue-500" ><span><?php echo htmlspecialchars($article['site_name']); ?></span></span>・
<div>
<!--输出发布时间-->
<time class="mr-1"><?php echo htmlspecialchars($article['time']); ?></time>
</div>
</div>
</div>
</article>
<?php } ?>
至此,去rss管理后台添加你要订阅的博客就行了。
哇哦教程好详细啊,感谢感谢
期待更多新鲜功能
我把rss的抓取缓存逻辑重写了。(手动狗头)
问一下博主,SQLite的数据库文件放在哪里呢
后面的那部分其实我之前也想搭建在handsome上面,但是步骤太麻烦了,这个看着挺简单,改天有时间尝试一下。
还是太复杂了,希望能直接配置个定时器用单个PHP文件采集,然后WP输出,就可以。
看似复杂实际很简单,有宝塔就能全部一键完成,一键安装docker,然后输入上面命令一键就搭建好了
只是个人理解,本质上是简易的采集程序,一个PHP文件输出给WP就可以,不理解为什么还要独立的域名,还要秘钥通信,做得太高端了。
这是作者搞得docker部署,有能力的手搓一个PHP版的就能实现你说的了
就是没装宝塔,用的命令行面板,很多步骤无从下手
我用的是大佬群里群友开发的moments,晚点看看这个去
moments更简洁一点,我跟着他们搞得,起初不知道这个moments
带佬也上了
这个别人更新了,自己那第一时间看到了,不过如果别人写了色色的东西,你的网站也看到色色的内容
你要知道大部分博友都是备案的网站,谁敢这样,不去喝茶,永久封了都可能,所以这是极端的情况,少加点不正常的网站,就算真有这种情况,我大不了接入第三方api内容鉴别,另外一般不会实时看到,当订阅量大了,实时抓取这是没必要的,基本都是定时抓取。
我搭的不知道什么问题,好多博客抓不了,比如你的
因为我是vue系统,rss生成要自己做,我还没弄,等我朋友圈上了,我再加上。
设置的每两小时更新一遍列表,另外订阅内容是由自己决定的,相信你不会谁的博客都去订阅吧
哈?都在搞这个了,要不我也搞一个?
快去写一个,真滴方便
不会写呢
跟风
抄完作业了