mirror of
https://github.com/DIYgod/RSSHub.git
synced 2026-09-24 23:12:34 +08:00
feat: add Craigslist search subscription (#6433)
This commit is contained in:
@@ -2447,6 +2447,15 @@
|
||||
},
|
||||
],
|
||||
},
|
||||
'craigslist.org': {
|
||||
_name: 'Craigslist',
|
||||
'.': [
|
||||
{
|
||||
title: '商品搜索列表',
|
||||
docs: 'https://docs.rsshub.app/shopping.html#craigslist',
|
||||
},
|
||||
],
|
||||
},
|
||||
'saraba1st.com': {
|
||||
_name: 'Saraba1st',
|
||||
bbs: [
|
||||
|
||||
@@ -36,6 +36,19 @@ pageClass: routes
|
||||
|
||||
</Route>
|
||||
|
||||
## Craigslist
|
||||
|
||||
### 商品搜索
|
||||
|
||||
<Route author="lxiange" example="/craigslist/sfbay/sso?query=folding+bike&sort=rel" path="/craigslist/:location/:type?" :paramsDesc="['位置,即Craigslist的子域,如sfbay', '搜索类型,如sso']"/>
|
||||
|
||||
> 由于 Craigslist 取消了 RSS 订阅搜索功能,因此用 RSSHub 来实现了类似效果。
|
||||
> 一个完整原始搜索会像这样:
|
||||
> <https://sfbay.craigslist.org/search/sso?query=folding+bike&sort=rel>
|
||||
>
|
||||
> /search/xxx 后跟的 "xxx" 为搜索类型,直接参考原始请求即可。
|
||||
> query string 是实际的搜索内容。
|
||||
|
||||
## Furstar
|
||||
|
||||
### 最新售卖角色列表
|
||||
|
||||
@@ -3704,4 +3704,7 @@ router.get('/asml/press-releases', require('./routes/asml/press-releases'));
|
||||
// 中国机械工程学会
|
||||
router.get('/cmes/news/:category?', require('./routes/cmes/news'));
|
||||
|
||||
// Craigslist
|
||||
router.get('/craigslist/:location/:type', require('./routes/craigslist/search'));
|
||||
|
||||
module.exports = router;
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const queryParams = ctx.request.querystring;
|
||||
const queryUrl = `https://${ctx.params.location}.craigslist.org/search/${ctx.params.type}?${queryParams}`;
|
||||
const { data } = await got.get(queryUrl);
|
||||
const $ = cheerio.load(data);
|
||||
const items = $('.result-row')
|
||||
.slice(0, 20)
|
||||
.map((_, _item) => {
|
||||
const item = $(_item);
|
||||
const info = item.find('.result-info').first();
|
||||
const titleNode = info.find('.result-title').first();
|
||||
const price = info.find('.result-price').first().text();
|
||||
const hood = info.find('.result-hood').first().text();
|
||||
const date = info.find('time').first().attr('datetime');
|
||||
|
||||
const dataIds = item.find('.result-image').first().attr('data-ids');
|
||||
let desc = '';
|
||||
if (dataIds) {
|
||||
const imageList = dataIds.split(',').map((id) => `<img src="https://images.craigslist.org/${id.split(':')[1]}_1200x900.jpg"/>`);
|
||||
desc = imageList.join('');
|
||||
}
|
||||
return {
|
||||
title: price + ' - ' + titleNode.text() + hood,
|
||||
link: titleNode.attr('href'),
|
||||
description: desc,
|
||||
pubDate: date,
|
||||
guid: titleNode.attr('id'),
|
||||
};
|
||||
})
|
||||
.get();
|
||||
const urlParams = new URLSearchParams(queryParams);
|
||||
let itemName = urlParams.get('query');
|
||||
if (!itemName) {
|
||||
itemName = '';
|
||||
} else {
|
||||
itemName = itemName.replace('+', ' ');
|
||||
}
|
||||
ctx.state.data = {
|
||||
title: itemName + ' - Craigslist',
|
||||
link: queryUrl,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user