rsshub 1.0.0-master.f6cb490 → 1.0.0-master.f6f0273

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/lib/api/index.ts +1 -6
  2. package/lib/routes/2048/index.ts +24 -23
  3. package/lib/routes/anthropic/news.ts +27 -13
  4. package/lib/routes/asianfanfics/namespace.ts +7 -0
  5. package/lib/routes/asianfanfics/tag.ts +89 -0
  6. package/lib/routes/asianfanfics/text-search.ts +68 -0
  7. package/lib/routes/blockworks/index.ts +128 -0
  8. package/lib/routes/blockworks/namespace.ts +7 -0
  9. package/lib/routes/cmu/andypavlo/blog.ts +55 -0
  10. package/lib/routes/cmu/namespace.ts +7 -0
  11. package/lib/routes/coindesk/{index.ts → consensus-magazine.ts} +17 -21
  12. package/lib/routes/coindesk/namespace.ts +2 -1
  13. package/lib/routes/coindesk/news.ts +47 -0
  14. package/lib/routes/coindesk/utils.ts +26 -0
  15. package/lib/routes/cointelegraph/index.ts +106 -0
  16. package/lib/routes/cointelegraph/namespace.ts +7 -0
  17. package/lib/routes/collabo-cafe/category.ts +37 -0
  18. package/lib/routes/collabo-cafe/index.ts +35 -0
  19. package/lib/routes/collabo-cafe/namespace.ts +9 -0
  20. package/lib/routes/collabo-cafe/parser.ts +29 -0
  21. package/lib/routes/collabo-cafe/tag.ts +37 -0
  22. package/lib/routes/cryptoslate/index.ts +98 -0
  23. package/lib/routes/cryptoslate/namespace.ts +7 -0
  24. package/lib/routes/decrypt/index.ts +115 -0
  25. package/lib/routes/decrypt/namespace.ts +7 -0
  26. package/lib/routes/discuz/discuz.ts +7 -9
  27. package/lib/routes/fangchan/list.ts +224 -0
  28. package/lib/routes/fangchan/namespace.ts +9 -0
  29. package/lib/routes/fangchan/templates/description.art +7 -0
  30. package/lib/routes/foreignaffairs/namespace.ts +7 -0
  31. package/lib/routes/foreignaffairs/rss.ts +55 -0
  32. package/lib/routes/forklog/index.ts +72 -0
  33. package/lib/routes/forklog/namespace.ts +7 -0
  34. package/lib/routes/gcores/categories.ts +129 -0
  35. package/lib/routes/gcores/collections.ts +129 -0
  36. package/lib/routes/gcores/topics.ts +63 -0
  37. package/lib/routes/gov/moa/gjs.ts +210 -0
  38. package/lib/routes/gov/tianjin/tjftz.ts +53 -0
  39. package/lib/routes/gov/tianjin/tjrcgzw.ts +51 -0
  40. package/lib/routes/grainoil/category.ts +207 -0
  41. package/lib/routes/grainoil/namespace.ts +9 -0
  42. package/lib/routes/huxiu/util.ts +11 -9
  43. package/lib/routes/ifanr/category.ts +7 -2
  44. package/lib/routes/ifanr/digest.ts +1 -1
  45. package/lib/routes/ifanr/index.ts +1 -1
  46. package/lib/routes/instructables/projects.ts +20 -15
  47. package/lib/routes/juejin/collections.ts +1 -1
  48. package/lib/routes/komiic/comic.ts +88 -0
  49. package/lib/routes/komiic/namespace.ts +7 -0
  50. package/lib/routes/leagueoflegends/namespace.ts +8 -0
  51. package/lib/routes/leagueoflegends/patch-notes.ts +76 -0
  52. package/lib/routes/likeshop/index.ts +43 -0
  53. package/lib/routes/likeshop/namespace.ts +7 -0
  54. package/lib/routes/ltaaa/article.ts +180 -0
  55. package/lib/routes/ltaaa/namespace.ts +9 -0
  56. package/lib/routes/ltaaa/templates/description.art +7 -0
  57. package/lib/routes/mashiro/index.ts +1 -0
  58. package/lib/routes/nhentai/util.ts +4 -1
  59. package/lib/routes/pinterest/user.ts +9 -0
  60. package/lib/routes/sohu/mp.ts +3 -2
  61. package/lib/routes/spotify/show.ts +1 -1
  62. package/lib/routes/stcn/index.ts +241 -136
  63. package/lib/routes/stcn/kx.ts +144 -0
  64. package/lib/routes/swjtu/namespace.ts +1 -1
  65. package/lib/routes/swjtu/{scai/bks.ts → scai.ts} +34 -20
  66. package/lib/routes/swjtu/sports.ts +77 -0
  67. package/lib/routes/theblock/index.ts +142 -0
  68. package/lib/routes/theblock/namespace.ts +7 -0
  69. package/lib/routes/theverge/index.ts +73 -62
  70. package/lib/routes/theverge/templates/header.art +19 -0
  71. package/lib/routes/threads/index.ts +73 -54
  72. package/lib/routes/threads/utils.ts +60 -78
  73. package/lib/routes/tmtpost/column.ts +298 -0
  74. package/lib/routes/tmtpost/new.ts +4 -199
  75. package/lib/routes/tmtpost/util.ts +207 -0
  76. package/lib/routes/toranoana/namespace.ts +7 -0
  77. package/lib/routes/toranoana/news.ts +110 -0
  78. package/lib/routes/wainao/templates/description.art +9 -0
  79. package/lib/routes/wainao/topics.ts +214 -0
  80. package/lib/routes/xiaoyuzhou/podcast.ts +27 -27
  81. package/lib/routes/xjtu/yz.ts +74 -0
  82. package/lib/routes/youmemark/index.ts +6 -6
  83. package/lib/routes/zaobao/util.ts +11 -3
  84. package/lib/routes/zhihu/answers.ts +26 -54
  85. package/package.json +36 -35
  86. package/lib/routes/gcores/category.ts +0 -171
  87. package/lib/routes/gcores/collection.ts +0 -161
  88. package/lib/routes-deprecated/ltaaa/index.js +0 -69
@@ -1,97 +1,91 @@
1
- import ofetch from '@/utils/ofetch';
2
1
  import { load } from 'cheerio';
3
2
  import dayjs from 'dayjs';
4
3
  import cache from '@/utils/cache';
5
- import { destr } from 'destr';
6
4
  import NotFoundError from '@/errors/types/not-found';
5
+ import ofetch from '@/utils/ofetch';
6
+ import { JSDOM } from 'jsdom';
7
+ import { JSONPath } from 'jsonpath-plus';
7
8
 
8
9
  const profileUrl = (user: string) => `https://www.threads.net/@${user}`;
9
10
  const threadUrl = (code: string) => `https://www.threads.net/t/${code}`;
10
- const instagramUrl = (user: string) => `https://i.instagram.com/api/v1/users/web_profile_info/?username=${user}`;
11
11
 
12
- const apiUrl = 'https://www.threads.net/api/graphql';
13
- // const PROFILE_QUERY = 23_996_318_473_300_828; // no longer works
14
- const THREADS_QUERY = 6_232_751_443_445_612;
15
- const REPLIES_QUERY = 6_307_072_669_391_286;
16
- const USER_AGENT = 'Barcelona 289.0.0.77.109 Android';
17
- const appId = '238260118697367';
18
- const asbdId = '129477';
12
+ const USER_AGENT = 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1';
19
13
 
20
14
  const extractTokens = async (user): Promise<{ lsd: string }> => {
21
15
  const response = await ofetch(profileUrl(user), {
22
16
  headers: {
23
17
  'User-Agent': USER_AGENT,
24
- 'X-IG-App-ID': appId,
18
+ Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
19
+ 'Accept-Encoding': 'gzip, br',
20
+ 'Accept-Language': 'zh-CN,zh;q=0.9',
21
+ 'Cache-Control': 'no-cache',
22
+ Pragma: 'no-cache',
23
+ 'Sec-Fetch-Dest': 'document',
24
+ 'Sec-Fetch-Mode': 'navigate',
25
+ 'Sec-Fetch-Site': 'none',
26
+ 'Sec-Fetch-User': '?1',
27
+ 'Upgrade-Insecure-Requests': '1',
25
28
  },
26
29
  });
27
- const $ = load(response);
28
30
 
31
+ const $ = load(response);
29
32
  const data = $('script:contains("LSD"):first').text();
30
-
31
33
  const lsd = data.match(/"LSD",\[],{"token":"([\w@-]+)"},/)?.[1];
34
+
32
35
  if (!lsd) {
33
36
  throw new NotFoundError('LSD token not found');
34
37
  }
35
38
 
36
- // const userId = data.match(/{"user_id":"(\d+)"},/)?.[1];
37
-
38
- const ret = { lsd };
39
- return ret;
39
+ return { lsd };
40
40
  };
41
41
 
42
- const makeHeader = (user: string, lsd: string) => ({
43
- Accept: '*/*',
44
- Host: 'www.threads.net',
45
- Origin: 'https://www.threads.net',
46
- Referer: profileUrl(user),
47
- 'User-Agent': USER_AGENT,
48
- 'X-FB-LSD': lsd,
49
- 'X-IG-App-ID': appId,
50
- 'Sec-Fetch-Site': 'same-origin',
51
- });
52
-
53
- // the formal way always reachs the rate limit, so use instagram api to get user id instead
54
- const getUserId = (user: string, lsd: string): Promise<string> =>
55
- cache.tryGet(`threads:userId:${user}`, async () => {
56
- const pathName = `/@${user}`;
57
- const payload: any = {
58
- 'route_urls[0]': pathName,
59
- __a: '1',
60
- __comet_req: '29',
61
- lsd,
62
- };
63
- const response = await ofetch('https://www.threads.net/ajax/bulk-route-definitions/', {
64
- method: 'POST',
65
- headers: {
66
- ...makeHeader(user, lsd),
67
- 'content-type': 'application/x-www-form-urlencoded',
68
- 'X-ASBD-ID': asbdId,
69
- },
70
- body: new URLSearchParams(payload).toString(),
71
- parseResponse: (txt) => destr(txt.slice(9)), // remove "for (;;);"
72
- });
73
-
74
- let userId = response.payload.payloads[pathName].result.exports.rootView.props.user_id;
75
-
76
- if (!userId) {
77
- const fallbackResponse = await ofetch(instagramUrl(user), {
78
- headers: makeHeader(user, lsd),
42
+ const getUserId = (user: string): Promise<string> =>
43
+ cache
44
+ .tryGet(`threads:userId:${user}`, async () => {
45
+ const response = await ofetch(profileUrl(user), {
46
+ headers: {
47
+ 'User-Agent': USER_AGENT,
48
+ Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
49
+ 'Accept-Encoding': 'gzip, br',
50
+ 'Accept-Language': 'zh-CN,zh;q=0.9',
51
+ 'Cache-Control': 'no-cache',
52
+ Pragma: 'no-cache',
53
+ 'Sec-Fetch-Dest': 'document',
54
+ 'Sec-Fetch-Mode': 'navigate',
55
+ 'Sec-Fetch-Site': 'none',
56
+ 'Sec-Fetch-User': '?1',
57
+ 'Upgrade-Insecure-Requests': '1',
58
+ },
79
59
  });
80
60
 
81
- if (!fallbackResponse?.data?.user) {
82
- throw new NotFoundError('Instagram getUser API response is invalid');
61
+ const dom = new JSDOM(response);
62
+
63
+ for (const el of dom.window.document.querySelectorAll('script[data-sjs]')) {
64
+ try {
65
+ const data = JSONPath({
66
+ path: '$..user_id',
67
+ json: JSON.parse(el.textContent || ''),
68
+ });
69
+
70
+ if (data?.[0]) {
71
+ return data[0];
72
+ }
73
+ } catch {
74
+ // Skip invalid JSON
75
+ }
83
76
  }
84
77
 
85
- userId = fallbackResponse.data.user.id;
86
- if (!userId) {
87
- throw new NotFoundError('User ID not found in Instagram getUser API response');
78
+ throw new NotFoundError('User ID not found');
79
+ })
80
+ .then((result): string => {
81
+ if (!result || typeof result !== 'string') {
82
+ throw new TypeError('Invalid user ID type');
88
83
  }
89
- }
90
-
91
- return userId;
92
- });
84
+ return result;
85
+ });
93
86
 
94
87
  const hasMedia = (post) => post.image_versions2 || post.carousel_media || post.video_versions;
88
+
95
89
  const buildMedia = (post) => {
96
90
  let html = '';
97
91
 
@@ -99,25 +93,13 @@ const buildMedia = (post) => {
99
93
  for (const media of post.carousel_media) {
100
94
  const firstImage = media.image_versions2?.candidates[0];
101
95
  const firstVideo = media.video_versions?.[0];
102
- if (firstVideo) {
103
- html += `<video controls autoplay loop poster="${firstImage.url}">`;
104
- html += `<source src="${firstVideo.url}"/>`;
105
- html += '</video>';
106
- } else {
107
- html += `<img src="${firstImage.url}"/>`;
108
- }
96
+ html += firstVideo ? `<video controls autoplay loop poster="${firstImage.url}"><source src="${firstVideo.url}"/></video>` : `<img src="${firstImage.url}"/>`;
109
97
  }
110
98
  } else {
111
99
  const mainImage = post.image_versions2?.candidates?.[0];
112
100
  const mainVideo = post.video_versions?.[0];
113
101
  if (mainImage) {
114
- if (mainVideo) {
115
- html += `<video controls autoplay loop poster="${mainImage.url}">`;
116
- html += `<source src="${mainVideo.url}"/>`;
117
- html += '</video>';
118
- } else {
119
- html += `<img src="${mainImage.url}"/>`;
120
- }
102
+ html += mainVideo ? `<video controls autoplay loop poster="${mainImage.url}"><source src="${mainVideo.url}"/></video>` : `<img src="${mainImage.url}"/>`;
121
103
  }
122
104
  }
123
105
 
@@ -181,4 +163,4 @@ const buildContent = (item, options) => {
181
163
  return { title, description };
182
164
  };
183
165
 
184
- export { apiUrl, profileUrl, threadUrl, THREADS_QUERY, REPLIES_QUERY, USER_AGENT, extractTokens, getUserId, makeHeader, hasMedia, buildMedia, buildContent };
166
+ export { profileUrl, threadUrl, extractTokens, getUserId, buildContent };
@@ -0,0 +1,298 @@
1
+ import { type Data, type Route, ViewType } from '@/types';
2
+
3
+ import { type Context } from 'hono';
4
+
5
+ import { baseUrl, apiBaseUrl, processItems } from './util';
6
+
7
+ export const handler = async (ctx: Context): Promise<Data> => {
8
+ const { id } = ctx.req.param();
9
+ const limit: number = Number.parseInt(ctx.req.query('limit') ?? '30', 10);
10
+
11
+ const targetUrl: string = new URL(`column/${id}`, baseUrl).href;
12
+ const listApiUrl: string = new URL('v1/categories/multi_content/list', apiBaseUrl).href;
13
+
14
+ const query = {
15
+ subtype: 'post',
16
+ category_guid: id,
17
+ };
18
+
19
+ return await processItems(limit, query, listApiUrl, targetUrl);
20
+ };
21
+
22
+ export const route: Route = {
23
+ path: '/column/:id',
24
+ name: '最新',
25
+ url: 'www.tmtpost.com',
26
+ maintainers: ['nczitzk'],
27
+ handler,
28
+ example: '/tmtpost/column/6916385',
29
+ parameters: {
30
+ id: {
31
+ description: '专栏 id,可在对应专栏页 URL 中找到',
32
+ options: [
33
+ {
34
+ label: 'AGI',
35
+ value: '6916385',
36
+ },
37
+ {
38
+ label: '出海',
39
+ value: '6998081',
40
+ },
41
+ {
42
+ label: '创新场景',
43
+ value: '3882035',
44
+ },
45
+ {
46
+ label: '钛度号',
47
+ value: '6100587',
48
+ },
49
+ {
50
+ label: '深度',
51
+ value: '3189960',
52
+ },
53
+ {
54
+ label: '焦点',
55
+ value: '6043895',
56
+ },
57
+ {
58
+ label: '创投',
59
+ value: '5994956',
60
+ },
61
+ {
62
+ label: '汽车',
63
+ value: '2573550',
64
+ },
65
+ {
66
+ label: '3C',
67
+ value: '3615534',
68
+ },
69
+ {
70
+ label: '消费',
71
+ value: '3882530',
72
+ },
73
+ {
74
+ label: '大健康',
75
+ value: '3882507',
76
+ },
77
+ {
78
+ label: '金融',
79
+ value: '3882486',
80
+ },
81
+ {
82
+ label: '钛智宏观',
83
+ value: '4277188',
84
+ },
85
+ {
86
+ label: '产业研究',
87
+ value: '5506730',
88
+ },
89
+ {
90
+ label: '地产',
91
+ value: '3882499',
92
+ },
93
+ {
94
+ label: '大公司',
95
+ value: '2446153',
96
+ },
97
+ {
98
+ label: 'IPO',
99
+ value: '6043750',
100
+ },
101
+ {
102
+ label: '钛度图闻',
103
+ value: '5750087',
104
+ },
105
+ {
106
+ label: '城视',
107
+ value: '6998636',
108
+ },
109
+ {
110
+ label: '创业家',
111
+ value: '4273329',
112
+ },
113
+ {
114
+ label: '人文',
115
+ value: '6252390',
116
+ },
117
+ {
118
+ label: '新职业研究所',
119
+ value: '5750104',
120
+ },
121
+ {
122
+ label: '科普',
123
+ value: '5714992',
124
+ },
125
+ {
126
+ label: '文娱',
127
+ value: '2446157',
128
+ },
129
+ ],
130
+ },
131
+ },
132
+ description: `:::tip
133
+ 若订阅 [AGI](https://www.tmtpost.com/column/6916385),网址为 \`https://www.tmtpost.com/column/6916385\`,请截取 \`https://www.tmtpost.com/column\` 到末尾的部分 \`6916385\` 作为 \`id\` 参数填入,此时目标路由为 [\`/tmtpost/column/6916385\`](https://rsshub.app/tmtpost/column/6916385)。
134
+ :::
135
+
136
+ <details>
137
+ <summary>更多分类</summary>
138
+
139
+ | [AGI](https://www.tmtpost.com/column/6916385) | [出海](https://www.tmtpost.com/column/6998081) | [创新场景](https://www.tmtpost.com/column/3882035) | [钛度号](https://www.tmtpost.com/column/6100587) | [深度](https://www.tmtpost.com/column/3189960) |
140
+ | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- |
141
+ | [6916385](https://rsshub.app/tmtpost/column/6916385) | [6998081](https://rsshub.app/tmtpost/column/6998081) | [3882035](https://rsshub.app/tmtpost/column/3882035) | [6100587](https://rsshub.app/tmtpost/column/6100587) | [3189960](https://rsshub.app/tmtpost/column/3189960) |
142
+
143
+ | [焦点](https://www.tmtpost.com/column/6043895) | [创投](https://www.tmtpost.com/column/5994956) | [汽车](https://www.tmtpost.com/column/2573550) | [3C](https://www.tmtpost.com/column/3615534) | [消费](https://www.tmtpost.com/column/3882530) |
144
+ | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- |
145
+ | [6043895](https://rsshub.app/tmtpost/column/6043895) | [5994956](https://rsshub.app/tmtpost/column/5994956) | [2573550](https://rsshub.app/tmtpost/column/2573550) | [3615534](https://rsshub.app/tmtpost/column/3615534) | [3882530](https://rsshub.app/tmtpost/column/3882530) |
146
+
147
+ | [大健康](https://www.tmtpost.com/column/3882507) | [金融](https://www.tmtpost.com/column/3882486) | [钛智宏观](https://www.tmtpost.com/column/4277188) | [产业研究](https://www.tmtpost.com/column/5506730) | [地产](https://www.tmtpost.com/column/3882499) |
148
+ | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- |
149
+ | [3882507](https://rsshub.app/tmtpost/column/3882507) | [3882486](https://rsshub.app/tmtpost/column/3882486) | [4277188](https://rsshub.app/tmtpost/column/4277188) | [5506730](https://rsshub.app/tmtpost/column/5506730) | [3882499](https://rsshub.app/tmtpost/column/3882499) |
150
+
151
+ | [大公司](https://www.tmtpost.com/column/2446153) | [IPO](https://www.tmtpost.com/column/6043750) | [钛度图闻](https://www.tmtpost.com/column/5750087) | [城视](https://www.tmtpost.com/column/6998636) | [创业家](https://www.tmtpost.com/column/4273329) |
152
+ | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- |
153
+ | [2446153](https://rsshub.app/tmtpost/column/2446153) | [6043750](https://rsshub.app/tmtpost/column/6043750) | [5750087](https://rsshub.app/tmtpost/column/5750087) | [6998636](https://rsshub.app/tmtpost/column/6998636) | [4273329](https://rsshub.app/tmtpost/column/4273329) |
154
+
155
+ | [人文](https://www.tmtpost.com/column/6252390) | [新职业研究所](https://www.tmtpost.com/column/5750104) | [科普](https://www.tmtpost.com/column/5714992) | [文娱](https://www.tmtpost.com/column/2446157) |
156
+ | ---------------------------------------------------- | ------------------------------------------------------ | ---------------------------------------------------- | ---------------------------------------------------- |
157
+ | [6252390](https://rsshub.app/tmtpost/column/6252390) | [5750104](https://rsshub.app/tmtpost/column/5750104) | [5714992](https://rsshub.app/tmtpost/column/5714992) | [2446157](https://rsshub.app/tmtpost/column/2446157) |
158
+
159
+ </details>
160
+ `,
161
+ categories: ['new-media'],
162
+ features: {
163
+ requireConfig: false,
164
+ requirePuppeteer: false,
165
+ antiCrawler: false,
166
+ supportRadar: true,
167
+ supportBT: false,
168
+ supportPodcast: false,
169
+ supportScihub: false,
170
+ },
171
+ radar: [
172
+ {
173
+ source: ['www.tmtpost.com/column/:id'],
174
+ target: '/column/:id',
175
+ },
176
+ {
177
+ title: 'AGI',
178
+ source: ['www.tmtpost.com/column/6916385'],
179
+ target: '/column/6916385',
180
+ },
181
+ {
182
+ title: '出海',
183
+ source: ['www.tmtpost.com/column/6998081'],
184
+ target: '/column/6998081',
185
+ },
186
+ {
187
+ title: '创新场景',
188
+ source: ['www.tmtpost.com/column/3882035'],
189
+ target: '/column/3882035',
190
+ },
191
+ {
192
+ title: '钛度号',
193
+ source: ['www.tmtpost.com/column/6100587'],
194
+ target: '/column/6100587',
195
+ },
196
+ {
197
+ title: '深度',
198
+ source: ['www.tmtpost.com/column/3189960'],
199
+ target: '/column/3189960',
200
+ },
201
+ {
202
+ title: '焦点',
203
+ source: ['www.tmtpost.com/column/6043895'],
204
+ target: '/column/6043895',
205
+ },
206
+ {
207
+ title: '创投',
208
+ source: ['www.tmtpost.com/column/5994956'],
209
+ target: '/column/5994956',
210
+ },
211
+ {
212
+ title: '汽车',
213
+ source: ['www.tmtpost.com/column/2573550'],
214
+ target: '/column/2573550',
215
+ },
216
+ {
217
+ title: '3C',
218
+ source: ['www.tmtpost.com/column/3615534'],
219
+ target: '/column/3615534',
220
+ },
221
+ {
222
+ title: '消费',
223
+ source: ['www.tmtpost.com/column/3882530'],
224
+ target: '/column/3882530',
225
+ },
226
+ {
227
+ title: '大健康',
228
+ source: ['www.tmtpost.com/column/3882507'],
229
+ target: '/column/3882507',
230
+ },
231
+ {
232
+ title: '金融',
233
+ source: ['www.tmtpost.com/column/3882486'],
234
+ target: '/column/3882486',
235
+ },
236
+ {
237
+ title: '钛智宏观',
238
+ source: ['www.tmtpost.com/column/4277188'],
239
+ target: '/column/4277188',
240
+ },
241
+ {
242
+ title: '产业研究',
243
+ source: ['www.tmtpost.com/column/5506730'],
244
+ target: '/column/5506730',
245
+ },
246
+ {
247
+ title: '地产',
248
+ source: ['www.tmtpost.com/column/3882499'],
249
+ target: '/column/3882499',
250
+ },
251
+ {
252
+ title: '大公司',
253
+ source: ['www.tmtpost.com/column/2446153'],
254
+ target: '/column/2446153',
255
+ },
256
+ {
257
+ title: 'IPO',
258
+ source: ['www.tmtpost.com/column/6043750'],
259
+ target: '/column/6043750',
260
+ },
261
+ {
262
+ title: '钛度图闻',
263
+ source: ['www.tmtpost.com/column/5750087'],
264
+ target: '/column/5750087',
265
+ },
266
+ {
267
+ title: '城视',
268
+ source: ['www.tmtpost.com/column/6998636'],
269
+ target: '/column/6998636',
270
+ },
271
+ {
272
+ title: '创业家',
273
+ source: ['www.tmtpost.com/column/4273329'],
274
+ target: '/column/4273329',
275
+ },
276
+ {
277
+ title: '人文',
278
+ source: ['www.tmtpost.com/column/6252390'],
279
+ target: '/column/6252390',
280
+ },
281
+ {
282
+ title: '新职业研究所',
283
+ source: ['www.tmtpost.com/column/5750104'],
284
+ target: '/column/5750104',
285
+ },
286
+ {
287
+ title: '科普',
288
+ source: ['www.tmtpost.com/column/5714992'],
289
+ target: '/column/5714992',
290
+ },
291
+ {
292
+ title: '文娱',
293
+ source: ['www.tmtpost.com/column/2446157'],
294
+ target: '/column/2446157',
295
+ },
296
+ ],
297
+ view: ViewType.Articles,
298
+ };