diff --git a/docs/traditional-media.md b/docs/traditional-media.md
index 10e929b8a7..5dbcb95bf1 100644
--- a/docs/traditional-media.md
+++ b/docs/traditional-media.md
@@ -1376,6 +1376,18 @@ category 对应的关键词有
+## 聯合新聞網
+
+### 即時新聞
+
+
+
+| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | 13 | 99 |
+| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | --- |
+| 精選 | 要聞 | 社會 | 地方 | 兩岸 | 國際 | 財經 | 運動 | 娛樂 | 生活 | 股市 | 文教 | 數位 | 不分類 |
+
+
+
## 路透社
::: warning 迁移说明
diff --git a/lib/v2/udn/breaking-news.js b/lib/v2/udn/breaking-news.js
new file mode 100644
index 0000000000..9f3ee3c94c
--- /dev/null
+++ b/lib/v2/udn/breaking-news.js
@@ -0,0 +1,85 @@
+const got = require('@/utils/got');
+const { parseDate } = require('@/utils/parse-date');
+const timezone = require('@/utils/timezone');
+const cheerio = require('cheerio');
+const { art } = require('@/utils/render');
+const path = require('path');
+
+module.exports = async (ctx) => {
+ const id = ctx.params.id;
+ const link = `/news/breaknews/1/${id}#breaknews`;
+ const name = await getLinkName(ctx, link);
+ const rootUrl = 'https://udn.com';
+ const response = await got(`${rootUrl}/api/more?page=1&channelId=1&cate_id=${id}&type=breaknews`);
+ const items = await Promise.all(
+ response.data.lists.map((item) => {
+ let link = item.titleLink.indexOf('http://') === 0 || item.titleLink.indexOf('https://') === 0 ? item.titleLink : `${rootUrl}${item.titleLink}`;
+ const linkUrl = new URL(link);
+ // cleanup query paramter
+ linkUrl.query = linkUrl.search = '';
+ link = linkUrl.toString();
+ return ctx.cache.tryGet(link, async () => {
+ let result = await got(link);
+ // VIP article requires redirection
+ // e.g. https://udn.com/news/story/7331/6576320
+ const vip = result.data.match(/