前言
- 在没启动notion-rss的时候在本地添加不了订阅源,又不想放在服务器开一个监听端口,所以想到在cloudflare的云函数上实现,和本地的一样,只不过是将代码用javascript重新写了一遍,主要是构造post请求麻烦了一点,最后抓包看才写出来。
路由触发
- cloudflare云函数有多种触发机制,这里选择绑定子域名使用路由触发

- 处理路由过来的请求,这里在入口判断是否以
API_TOKEN
,和bookmarklet
,为路径,这个路径是Miniflux的,排在rsshub插件的第二个,和Tiny Tiny RSS作为区分,可以让用户自己选择使用那一种提交订阅源的方式。
async function fetchAndApply(request) {
if (request.method === "OPTIONS") {
return handleOptions(request);
}
let url = new URL(request.url);
if (url.pathname === "/" + API_TOKEN + "/bookmarklet") {
let response = new Response(await add_subscribe(url.searchParams));
response.headers.set("Content-Type", "text/html;charset=UTF-8");
return response;
}
let response;
let err_body = pages.replace(
"Kali-Team",
"Path error, please check Token parameter."
);
response = new Response(err_body);
response.headers.set("Content-Type", "text/html;charset=UTF-8");
return response;
}
判断是否已经存在
- 在调用
add_subscribe
函数的时候会先判断这个订阅URL在不在。如果存在就返回标题,在后面的HTML中展示。
async function filter_from_database(rss_url) {
const options = {
method: "POST",
headers: {
"Notion-Version": "2022-02-22",
"Content-Type": "application/json",
Authorization: "Bearer " + NOTION_TOKEN,
},
body:
'{"filter":{"or":[{"property":"Link","rich_text":{"equals":"' +
rss_url +
'"}}]}}',
};
let response = await fetch(
"<https://api.notion.com/v1/databases/>" + SOURCE_ID + "/query",
options
);
let body = await response.json();
let results = body.results;
let title = null;
if (results.length > 0) {
let titles = results[0].properties.Title.title;
if (titles.length > 0) {
title = titles[0].plain_text;
} else {
title = "";
}
}
return title;
}
添加订阅
- 在上面判断订阅不存在,进入添加订阅函数,创建
Link
和Enabled
两个属性,默认开启爬取。
async function create_page(rss_url) {
const options = {
method: "POST",
headers: {
"Notion-Version": "2022-02-22",
"Content-Type": "application/json",
Authorization: "Bearer " + NOTION_TOKEN,
},
body:
'{"parent":{"database_id":"' +
SOURCE_ID +
'"},"properties":{"Link":{"url":"' +
rss_url +
'"},"Enabled":{"checkbox":true}}}',
};
let response = await fetch("<https://api.notion.com/v1/pages>", options);
let body = await response.json();
let properties = body.properties;
let title = null;
if (properties.length > 0) {
let titles = properties.Title.title;
if (titles.length > 0) {
title = titles[0].plain_text;
rss_url = rss_url + title;
} else {
rss_url = null;
}
}
return rss_url;
}
部署云函数
- 将项目https://github.com/cn-kali-team/notion-rss/ 中的src/plugins/worker.js文件复制到已经创建好的worker编辑框中

- 修改配置,和客户端里面的配置一样,
NOTION_TOKEN
是你的notion api集成token,SOURCE_ID
是你的订阅源数据库ID,API_TOKEN
是你的API路径上面的标志,不要让别人知道,不然别人可以往你的notion订阅源中添加数据。
const NOTION_TOKEN = "secret_xxx";
const SOURCE_ID = "8a49af58-5aa8-4420-8ee0-85b3814e1a0d";
const API_TOKEN = "14fe27c312f2828deb73bb1c7bfd92dc";


参考