From 672504d42603f56ab9dc0b76b7e04ffeff428252 Mon Sep 17 00:00:00 2001 From: windyakin Date: Mon, 20 May 2024 22:09:38 +0900 Subject: [PATCH] =?UTF-8?q?x.com=20=E3=82=92=E5=8F=97=E3=81=91=E5=8F=96?= =?UTF-8?q?=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/save-controller.ts | 4 ++-- src/lib/twitter.ts | 8 ++++---- test/lib/twitter.test.ts | 10 ++++++++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/controller/save-controller.ts b/src/controller/save-controller.ts index 30844fb..c29a3ae 100644 --- a/src/controller/save-controller.ts +++ b/src/controller/save-controller.ts @@ -11,10 +11,10 @@ export class SaveController { static async execute(req: Request, res: Response): Promise { const twitterClient = req.app.get('twitterClient') - const matchPettern = new RegExp('^https://twitter.com/([a-zA-Z0-9_]+)/status/([0-9]+)', 'i'); + const matchPattern = new RegExp('^https://(twitter|x).com/([a-zA-Z0-9_]+)/status/([0-9]+)', 'i'); const requestTweetUrl = req.body.tweetUrl || '' - if (!requestTweetUrl || requestTweetUrl.match(matchPettern).length === 0) { + if (!requestTweetUrl || requestTweetUrl.match(matchPattern).length === 0) { res.status(422).send('Not match tweet url pattern') return } diff --git a/src/lib/twitter.ts b/src/lib/twitter.ts index c32c403..e173032 100644 --- a/src/lib/twitter.ts +++ b/src/lib/twitter.ts @@ -17,12 +17,12 @@ class Twitter { } async lookupTweet(tweetUrl: string): Promise { - const tweetUrlMatchPattern = new RegExp('^https://twitter.com/([a-zA-Z0-9_]+)/status/([0-9]+)$', 'i'); + const tweetUrlMatchPattern = new RegExp('^https://(twitter|x).com/([a-zA-Z0-9_]+)/status/([0-9]+)$', 'i'); const matchPettern = tweetUrl.match(tweetUrlMatchPattern); if (matchPettern === null) { throw new Error('Not match tweet url pattern'); } - const [_, user, id] = matchPettern; + const [_, server, user, id] = matchPettern; const response = await this.fetchTweet(user, id); const html: HTMLElement = parse(response); const urlElement = html.querySelector('link[rel="canonical"]'); @@ -31,9 +31,9 @@ class Twitter { throw new Error('Failed fetching data'); } - const identifier = url.replace(tweetUrlMatchPattern, '$2'); + const identifier = url.replace(tweetUrlMatchPattern, '$3'); - const userId = url.replace(tweetUrlMatchPattern, '$1'); + const userId = url.replace(tweetUrlMatchPattern, '$2'); if (!identifier || !userId) { throw new Error('Failed parsing data'); diff --git a/test/lib/twitter.test.ts b/test/lib/twitter.test.ts index 9ab8e4b..526383d 100644 --- a/test/lib/twitter.test.ts +++ b/test/lib/twitter.test.ts @@ -23,6 +23,16 @@ describe('Twitter lib test', () => { ]); }); + it('return tweet data when x.com', async () => { + const actual = await twitterClient.lookupTweet('https://x.com/MITLicense/status/1652865752331091968'); + expect(actual.identifier).toBe('1652865752331091968'); + expect(actual.url).toBe('https://twitter.com/MITLicense/status/1652865752331091968'); + expect(actual.userId).toBe('MITLicense'); + expect(actual.imageUrls).toEqual([ + 'https://pbs.twimg.com/media/FvAopGGaEAAp-Dk.jpg' + ]); + }); + it('retrun tweet data when fetching multi pictures post', async () => { const actual = await twitterClient.lookupTweet('https://twitter.com/MITLicense/status/1652160368901505027'); expect(actual.identifier).toBe('1652160368901505027');