feat: add Craigslist search subscription (#6433)

This commit is contained in:
Xiang Li
2020-12-14 12:12:24 +00:00
committed by GitHub
parent 60f79e8989
commit d308622070
4 changed files with 71 additions and 0 deletions
+9
View File
@@ -2447,6 +2447,15 @@
},
],
},
'craigslist.org': {
_name: 'Craigslist',
'.': [
{
title: '商品搜索列表',
docs: 'https://docs.rsshub.app/shopping.html#craigslist',
},
],
},
'saraba1st.com': {
_name: 'Saraba1st',
bbs: [
+13
View File
@@ -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
### 最新售卖角色列表
+3
View File
@@ -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;
+46
View File
@@ -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,
};
};