diff --git a/lib/routes/aqicn/aqi.ts b/lib/routes/aqicn/aqi.ts
new file mode 100644
index 0000000000..62a5e04040
--- /dev/null
+++ b/lib/routes/aqicn/aqi.ts
@@ -0,0 +1,82 @@
+import got from '@/utils/got';
+import { parseDate } from '@/utils/parse-date';
+
+export const route: Route = {
+ path: '/:city/:pollution?',
+ categories: ['other'],
+ example: '/aqicn/beijing/pm25',
+ parameters: {
+ city: '城市拼音或地区 ID,详见[aqicn.org](http://aqicn.org/city/)',
+ pollution: '可选择显示更详细的空气污染成分',
+ },
+ radar: [
+ {
+ source: ['aqicn.org'],
+ },
+ ],
+ name: '实时 AQI',
+ maintainers: ['ladeng07'],
+ handler,
+ url: 'aqicn.org',
+ descriptions: `
+| 参数 | 污染成分 |
+| -------- | -------- |
+| pm25 | PM2.5 |
+| pm10 | PM10 |
+| o3 | O3 |
+| no2 | NO2 |
+| so2 | SO2 |
+| co | CO |
+
+举例: [https://rsshub.app/aqicn/beijing/pm25,pm10](https://rsshub.app/aqicn/beijing/pm25,pm10)
+
+1. 显示单个污染成分,例如「pm25」, [https://rsshub.app/aqicn/beijing/pm25](https://rsshub.app/aqicn/beijing/pm25)
+2. 逗号分隔显示多个污染成分,例如「pm25,pm10」,[https://rsshub.app/aqicn/beijing/pm25,pm10](https://rsshub.app/aqicn/beijing/pm25,pm10)
+3. 城市子站 ID 获取方法:右键显示网页源代码,搜索 "idx" (带双冒号),后面的 ID 就是子站的 ID,如你给的链接 ID 是 4258,RSS 地址就是 [https://rsshub.app/aqicn/4258](https://rsshub.app/aqicn/4258)
+`,
+};
+
+async function handler(ctx) {
+ const city = ctx.req.param('city');
+ const pollution = ctx.req.param('pollution') || [];
+ const pollutionType = {
+ so2: 'so2',
+ no2: 'no2',
+ co: 'co',
+ o3: 'O3',
+ pm25: 'PM2.5',
+ pm10: 'PM10',
+ };
+ const area = Number.isNaN(Number(city)) ? city : `@${city}`;
+
+ const response = await got({
+ method: 'get',
+ url: `http://aqicn.org/aqicn/json/android/${area}/json`,
+ });
+ const data = response.data;
+ const pollutionDetailed =
+ pollution.length === 0
+ ? ''
+ : pollution
+ .split(',')
+ .map((item) => {
+ const pollutionValue = typeof data.historic[pollutionType[item]] === 'object' ? data.historic[pollutionType[item]][Object.keys(data.historic[pollutionType[item]])[0]] : data.historic[pollutionType[item]][0];
+ return `${pollutionType[item].toUpperCase()}:${pollutionValue}
`;
+ })
+ .join('');
+
+ return {
+ title: `${data.namena}AQI`,
+ link: `https://aqicn.org/city/${data.ids.path}`,
+ description: `${data.namena}AQI-aqicn.org`,
+ item: [
+ {
+ title: `${data.namena}实时空气质量(AQI)${data.utimecn}`,
+ description: `${data.infocn}
风力:${data.cwind[0]}级
AQI:${data.aqi}
${pollutionDetailed}
`,
+ pubDate: parseDate(data.time * 1000),
+ guid: `${data.time}-${city}-${pollution}`,
+ link: `https://aqicn.org/city/${data.ids.path}`,
+ },
+ ],
+ };
+}
diff --git a/lib/routes/aqicn/namespace.ts b/lib/routes/aqicn/namespace.ts
new file mode 100644
index 0000000000..e370267b48
--- /dev/null
+++ b/lib/routes/aqicn/namespace.ts
@@ -0,0 +1,6 @@
+import type { Namespace } from '@/types';
+
+export const namespace: Namespace = {
+ name: '空气质量',
+ url: 'aqicn.org',
+};