|
@@ -0,0 +1,101 @@
|
|
|
+import { request, RequestConfig } from './request'
|
|
|
+import { createHmac } from 'crypto'
|
|
|
+
|
|
|
+export interface IdsConfig {
|
|
|
+ endpoint: string
|
|
|
+ accessKeyId: string
|
|
|
+ accessKeySecret: string
|
|
|
+}
|
|
|
+
|
|
|
+export enum IdsChannel {
|
|
|
+ Csdn = 1,
|
|
|
+ Wechat = 2,
|
|
|
+ Zhihu = 3,
|
|
|
+ Juejin = 4
|
|
|
+}
|
|
|
+
|
|
|
+export type IdsCrawlRule = 'fulldata' | 'extdata'
|
|
|
+
|
|
|
+export interface IdsArticle {
|
|
|
+ author_id: string | number
|
|
|
+ cover_url: string
|
|
|
+ code: IdsChannel
|
|
|
+ title: string
|
|
|
+ author_name?: string
|
|
|
+ sn_code: string
|
|
|
+ original_url?: string
|
|
|
+ source_address?: string
|
|
|
+ is_headline?: 0 | 1
|
|
|
+ label?: string
|
|
|
+ published_at: Date
|
|
|
+ body: string
|
|
|
+ is_original?: 0 | 1
|
|
|
+ external_read_num?: number
|
|
|
+ external_see_num?: number
|
|
|
+ external_like_num?: number
|
|
|
+ external_comment_num?: number
|
|
|
+}
|
|
|
+
|
|
|
+export class Ids {
|
|
|
+ config: IdsConfig
|
|
|
+
|
|
|
+ constructor(config: IdsConfig) {
|
|
|
+ this.config = config
|
|
|
+ }
|
|
|
+
|
|
|
+ private async request(config: RequestConfig) {
|
|
|
+ const { endpoint, accessKeyId, accessKeySecret } = this.config
|
|
|
+ config.baseURL = endpoint
|
|
|
+ config.url = config.url || '/'
|
|
|
+
|
|
|
+ const timestamp = Math.floor(Date.now() / 1000)
|
|
|
+ const data = config.url.toLowerCase() + timestamp
|
|
|
+ const signature = createHmac('sha256', accessKeySecret).update(data).digest('base64')
|
|
|
+
|
|
|
+ config.headers = config.headers || {}
|
|
|
+ config.headers['Authorization'] = `IDS-HMAC-SHA256 Credential=${accessKeyId}/${timestamp},Signature=${signature}`
|
|
|
+
|
|
|
+ const res = await request(config)
|
|
|
+
|
|
|
+ if (res.data.status != 1) {
|
|
|
+ console.error(res.data)
|
|
|
+ throw new Error(`[${res.data.status}] ${res.data.info}`)
|
|
|
+ }
|
|
|
+
|
|
|
+ return res.data
|
|
|
+ }
|
|
|
+
|
|
|
+ getCrawlAuthors(channel: IdsChannel) {
|
|
|
+ return this.request({
|
|
|
+ method: 'POST',
|
|
|
+ url: '/api/ids/getCrawlAuthors',
|
|
|
+ data: {
|
|
|
+ code: channel
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ getCrawlArticleRules(params: { ids: string[]; channel: IdsChannel }) {
|
|
|
+ const { ids, channel } = params
|
|
|
+
|
|
|
+ return this.request({
|
|
|
+ method: 'POST',
|
|
|
+ url: '/api/ids/getCrawlArticleRules',
|
|
|
+ data: {
|
|
|
+ code: channel,
|
|
|
+ sn_codes: ids
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ putArticle(data: IdsArticle, rule: IdsCrawlRule) {
|
|
|
+ return this.request({
|
|
|
+ method: 'POST',
|
|
|
+ url: '/api/ids/putArticleData',
|
|
|
+ params: {
|
|
|
+ crawl: rule
|
|
|
+ },
|
|
|
+ data
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|