From a033b49030c6802e9d6f641afdd27245634cc76b Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Wed, 16 Mar 2022 20:56:02 +0800 Subject: [PATCH 1/4] chore: bump version to 2.5.3 --- package.json | 2 +- packages/mask/src/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fea8423229c8..6618ca026986 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mask-network", "packageManager": "pnpm@6.30.1", - "version": "2.5.2", + "version": "2.5.3", "private": true, "license": "AGPL-3.0-or-later", "scripts": { diff --git a/packages/mask/src/manifest.json b/packages/mask/src/manifest.json index 9b58620646e5..4172e4f18817 100644 --- a/packages/mask/src/manifest.json +++ b/packages/mask/src/manifest.json @@ -1,6 +1,6 @@ { "name": "Mask Network", - "version": "2.5.2", + "version": "2.5.3", "manifest_version": 2, "permissions": ["storage", "downloads", "webNavigation", "activeTab"], "optional_permissions": ["", "notifications", "clipboardRead"], From ef372cccdb5a7f891d349fec2a93c5926b975d72 Mon Sep 17 00:00:00 2001 From: lelenei Date: Wed, 16 Mar 2022 16:03:58 +0800 Subject: [PATCH 2/4] fix(twitter): dom selector --- .../twitter.com/collecting/identity.ts | 1 - .../twitter.com/utils/selector.ts | 3 +-- .../twitter.com/utils/user.ts | 16 ++++++---------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/packages/mask/src/social-network-adaptor/twitter.com/collecting/identity.ts b/packages/mask/src/social-network-adaptor/twitter.com/collecting/identity.ts index d31724838889..677587084267 100644 --- a/packages/mask/src/social-network-adaptor/twitter.com/collecting/identity.ts +++ b/packages/mask/src/social-network-adaptor/twitter.com/collecting/identity.ts @@ -47,7 +47,6 @@ function resolveCurrentVisitingIdentityInner( const nickname = getNickname() const handle = getTwitterId() const avatar = getAvatar() - ref.value = { identifier: new ProfileIdentifier(twitterBase.networkIdentifier, handle), nickname, diff --git a/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts b/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts index 962a569ee7ab..ad02bd8ba6b2 100644 --- a/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts +++ b/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts @@ -47,8 +47,7 @@ export const searchNewTweetButtonSelector: () => LiveSelector = () => { return querySelector('[data-testid="SideNav_NewTweet_Button"]') } -export const searchNickNameSelector: () => LiveSelector = () => - querySelector('[data-testid="UserProfileHeader_Items"]') +export const searchNickNameSelector: () => LiveSelector = () => querySelector('[data-testid="UserName"]') export const searchAvatarSelector = () => querySelector('[data-testid="primaryColumn"] a[href$="/photo"] img[src*="profile_images"]') export const searchNFTAvatarSelector = () => diff --git a/packages/mask/src/social-network-adaptor/twitter.com/utils/user.ts b/packages/mask/src/social-network-adaptor/twitter.com/utils/user.ts index fbf9ee76f8b1..2fe0a6da0874 100644 --- a/packages/mask/src/social-network-adaptor/twitter.com/utils/user.ts +++ b/packages/mask/src/social-network-adaptor/twitter.com/utils/user.ts @@ -23,22 +23,18 @@ export const usernameValidator: NonNullable { - const node = searchNickNameSelector().evaluate()?.parentElement?.parentElement?.firstChild - ?.nextSibling as HTMLDivElement + const node = searchNickNameSelector().evaluate()?.querySelector('span span') as HTMLDivElement if (!node) return '' - const nicknameNode = node.querySelector('div span') - if (!nicknameNode) return '' - - return collectNodeText(nicknameNode) + return collectNodeText(node) } export const getTwitterId = () => { - const node = searchNickNameSelector().evaluate()?.parentElement?.parentElement?.firstChild?.nextSibling?.firstChild - ?.firstChild?.lastChild as HTMLDivElement + const node = searchNickNameSelector() + .evaluate() + ?.firstElementChild?.firstElementChild?.nextElementSibling?.querySelector('span') as HTMLDivElement if (node) { - const twitterIdNode = node.querySelector('div span') - if (twitterIdNode) return twitterIdNode.innerHTML.trim().replace('@', '') + return node.innerHTML.trim().replace('@', '') } const ele = searchAvatarSelector().evaluate()?.closest('a') || searchNFTAvatarSelector().evaluate()?.closest('a') From f9cc4b4c50132bc81fe6c959d87b066f951ab64d Mon Sep 17 00:00:00 2001 From: nuanyang233 <528944303@qq.com> Date: Thu, 17 Mar 2022 01:03:38 +0800 Subject: [PATCH 3/4] fix: adjust post id selector --- .../twitter.com/utils/fetch.ts | 45 ++++++------------- .../twitter.com/utils/selector.ts | 3 +- .../twitter.com/utils/user.ts | 9 +--- 3 files changed, 16 insertions(+), 41 deletions(-) diff --git a/packages/mask/src/social-network-adaptor/twitter.com/utils/fetch.ts b/packages/mask/src/social-network-adaptor/twitter.com/utils/fetch.ts index ce6fcc543261..6a58409aa391 100644 --- a/packages/mask/src/social-network-adaptor/twitter.com/utils/fetch.ts +++ b/packages/mask/src/social-network-adaptor/twitter.com/utils/fetch.ts @@ -1,6 +1,5 @@ import { regexMatch } from '../../../utils/utils' import { defaultTo, flattenDeep } from 'lodash-unified' -import { nthChild } from '../../../utils/dom' import { canonifyImgUrl } from './url' import { makeTypedMessageText, @@ -13,25 +12,6 @@ import { } from '@masknet/shared-base' import { collectNodeText, collectTwitterEmoji } from '../../../utils' -/** - * @example - * parseNameArea("nickname@handle") - */ -const parseNameArea = (nameArea: string) => { - const atIndex = nameArea.lastIndexOf('@') - const name = nameArea.slice(0, atIndex).replace(/\n+/g, '') - const handle = nameArea.slice(atIndex + 1).replace(/\n+/g, '') - return name && handle - ? { - name, - handle, - } - : { - name: '', - handle: '', - } -} - const parseId = (t: string) => { return regexMatch(t, /status\/(\d+)/, 1)! } @@ -52,20 +32,21 @@ export const postIdParser = (node: HTMLElement) => { export const postNameParser = (node: HTMLElement) => { const tweetElement = node.querySelector('[data-testid="tweet"]') ?? node - const nameElement = collectNodeText(tweetElement.querySelector('a[role] div[id]')) + const name = collectNodeText( + tweetElement.querySelector('a:not([target]) > div > div[dir="auto"] > span > span'), + ) - const nameElementInQuoted = nthChild(tweetElement, 0, 0, 0, 0, 0) - const nameInQuoteTweet = nameElementInQuoted ? collectNodeText(nameElementInQuoted) : '' + const handle = collectNodeText(tweetElement.querySelector('a[tabindex="-1"] span')) - return ( - [nameElement, nameInQuoteTweet] - .filter((x) => x?.includes('@')) - .map(parseNameArea) - .find((r) => r.name && r.handle) ?? { - name: '', - handle: '', - } - ) + return name && handle + ? { + name, + handle: handle.slice(1), + } + : { + name: '', + handle: '', + } } export const postAvatarParser = (node: HTMLElement) => { diff --git a/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts b/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts index ad02bd8ba6b2..b92728c626a0 100644 --- a/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts +++ b/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts @@ -47,7 +47,8 @@ export const searchNewTweetButtonSelector: () => LiveSelector = () => { return querySelector('[data-testid="SideNav_NewTweet_Button"]') } -export const searchNickNameSelector: () => LiveSelector = () => querySelector('[data-testid="UserName"]') +export const searchNickNameSelector: () => LiveSelector = () => + querySelector('[data-testid="tweet"] a:not([target]) > div > div[dir="auto"] > span > span') export const searchAvatarSelector = () => querySelector('[data-testid="primaryColumn"] a[href$="/photo"] img[src*="profile_images"]') export const searchNFTAvatarSelector = () => diff --git a/packages/mask/src/social-network-adaptor/twitter.com/utils/user.ts b/packages/mask/src/social-network-adaptor/twitter.com/utils/user.ts index 2fe0a6da0874..1fab6ced45c1 100644 --- a/packages/mask/src/social-network-adaptor/twitter.com/utils/user.ts +++ b/packages/mask/src/social-network-adaptor/twitter.com/utils/user.ts @@ -23,20 +23,13 @@ export const usernameValidator: NonNullable { - const node = searchNickNameSelector().evaluate()?.querySelector('span span') as HTMLDivElement + const node = searchNickNameSelector().evaluate()?.querySelector('span span') if (!node) return '' return collectNodeText(node) } export const getTwitterId = () => { - const node = searchNickNameSelector() - .evaluate() - ?.firstElementChild?.firstElementChild?.nextElementSibling?.querySelector('span') as HTMLDivElement - if (node) { - return node.innerHTML.trim().replace('@', '') - } - const ele = searchAvatarSelector().evaluate()?.closest('a') || searchNFTAvatarSelector().evaluate()?.closest('a') if (ele) { const link = ele.getAttribute('href') From 07673cda9c8a9518d7b61c08a189e517b16a6f31 Mon Sep 17 00:00:00 2001 From: nuanyang233 <528944303@qq.com> Date: Thu, 17 Mar 2022 01:48:26 +0800 Subject: [PATCH 4/4] fix: quoted tweet --- .../twitter.com/utils/fetch.ts | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/packages/mask/src/social-network-adaptor/twitter.com/utils/fetch.ts b/packages/mask/src/social-network-adaptor/twitter.com/utils/fetch.ts index 6a58409aa391..c955b6051e45 100644 --- a/packages/mask/src/social-network-adaptor/twitter.com/utils/fetch.ts +++ b/packages/mask/src/social-network-adaptor/twitter.com/utils/fetch.ts @@ -33,20 +33,33 @@ export const postIdParser = (node: HTMLElement) => { export const postNameParser = (node: HTMLElement) => { const tweetElement = node.querySelector('[data-testid="tweet"]') ?? node const name = collectNodeText( - tweetElement.querySelector('a:not([target]) > div > div[dir="auto"] > span > span'), + tweetElement.querySelector('a:not([target]) > div > div[dir="auto"] > span'), ) - const handle = collectNodeText(tweetElement.querySelector('a[tabindex="-1"] span')) - return name && handle - ? { - name, - handle: handle.slice(1), - } - : { - name: '', - handle: '', - } + if (name && handle) { + return { + name, + handle: handle.slice(1), + } + } + const quotedTweetName = collectNodeText( + tweetElement.querySelector('div[role="link"] div[dir="auto"] > span'), + ) + const quotedTweetHandle = collectNodeText( + tweetElement.querySelector('div[role="link"] div[dir="ltr"] > span'), + ) + + if (quotedTweetName && quotedTweetHandle) { + return { + name: quotedTweetName, + handle: quotedTweetHandle.slice(1), + } + } + return { + name: '', + handle: '', + } } export const postAvatarParser = (node: HTMLElement) => {