diff --git a/src/social-network-provider/twitter.com/encoding.ts b/src/social-network-provider/twitter.com/encoding.ts index 175096cfaf6f..dd1c6d125745 100644 --- a/src/social-network-provider/twitter.com/encoding.ts +++ b/src/social-network-provider/twitter.com/encoding.ts @@ -1,5 +1,6 @@ -import { batchReplace, regexMatch, regexMatchAll } from '../../utils/utils' +import { batchReplace, randomElement, regexMatch, regexMatchAll } from '../../utils/utils' import { isNil, isNull } from 'lodash-es' +import { topSites } from './utils/url' const ICAO9303Checksum = { encode: (input: string) => { @@ -51,7 +52,7 @@ export const twitterEncoding = { * @link https://github.com/DimensionDev/Maskbook/issues/198 */ payloadEncoder: (text: string) => - `https://google.com/${batchReplace(text, [ + `https://${randomElement(topSites)}/${batchReplace(text, [ ['🎼', '%20'], [':||', '%40'], ['+', '-'], @@ -59,7 +60,7 @@ export const twitterEncoding = { ['|', '.'], ])}`, payloadDecoder: (text: string) => { - let r = regexMatch(text, /https:\/\/google\.com\/%20(.+)%40/, 1) + let r = regexMatch(text, /https:\/\/.+\..+\/%20(.+)%40/, 1) if (isNil(r)) { return 'null' } diff --git a/src/social-network-provider/twitter.com/utils/selector.ts b/src/social-network-provider/twitter.com/utils/selector.ts index 442164240149..d2742cf58aa6 100644 --- a/src/social-network-provider/twitter.com/utils/selector.ts +++ b/src/social-network-provider/twitter.com/utils/selector.ts @@ -4,11 +4,9 @@ import { postBoxInPopup } from './postBox' import { isNull } from 'lodash-es' type E = HTMLElement - const querySelector = (selector: string) => { return new LiveSelector().querySelector(selector).enableSingleMode() } - const querySelectorAll = (selector: string) => { return new LiveSelector().querySelectorAll(selector) } @@ -42,7 +40,6 @@ export const hasDraftEditor = (x: E | Document = document) => !isNull(x.querySel export const postPopupInjectPointSelector = () => querySelector('[aria-labelledby="modal-header"] [role="progressbar"] ~ div ~ div') -export const gotoProfileButtonSelector = () => querySelector('[role="navigation"] [aria-label="Profile"]') export const editProfileButtonSelector = () => querySelector('[data-testid="primaryColumn"] [href="/settings/profile"]') export const editProfileTextareaSelector = () => querySelector('textarea[placeholder*="bio"]') @@ -50,7 +47,6 @@ export const editProfileTextareaSelector = () => querySelector querySelectorAll('[data-testid="tweet"]') export const postsContentSelector = () => postsSelector().querySelectorAll(`[lang]`) -// self infos const base = querySelector('#react-root + script') const name = /"session":{.*?"user":{.*?"screen_name":"(.*?)","name":"(.*?)"}}/ const bio = /"entities":{.*?"users":{.*?"entities":{.*?"[0-9]*":{.*?"description":"(.*?)"/ diff --git a/src/social-network-provider/twitter.com/utils/url.ts b/src/social-network-provider/twitter.com/utils/url.ts index 7106a9045dbc..a4b687a2c2e4 100644 --- a/src/social-network-provider/twitter.com/utils/url.ts +++ b/src/social-network-provider/twitter.com/utils/url.ts @@ -6,12 +6,6 @@ export const twitterUrl = { hostIdentifier: 'twitter.com', hostLeadingUrl: 'https://twitter.com', hostLeadingUrlMobile: 'https://mobile.twitter.com', - get anyHostUrl() { - return `${twitterUrl.hostLeadingUrl}/*` - }, - get anyHostUrlMobile() { - return `${twitterUrl.hostLeadingUrlMobile}/*` - }, } const hostLeadingUrlAuto = (isMobile: boolean) => @@ -27,3 +21,56 @@ export const getPostUrl = (post: PostIdentifier, useMobile: bo export const getProfileUrl = (self: PersonIdentifier, useMobile: boolean = false) => { return `${hostLeadingUrlAuto(useMobile)}/${self.userId}` } + +export const topSites = [ + 'www.google.com', + 'www.youtube.com', + 'www.tmall.com', + 'www.baidu.com', + 'www.qq.com', + 'www.facebook.com', + 'www.sohu.com', + 'www.taobao.com', + 'www.wikipedia.org', + 'login.tmall.com', + 'www.yahoo.com', + 'www.jd.com', + 'www.amazon.com', + 'sina.com.cn', + 'www.weibo.com', + 'pages.tmall.com', + 'www.reddit.com', + 'www.live.com', + 'www.vk.com', + 'www.netflix.com', + 'www.okezone.com', + 'www.blogspot.com', + 'www.alipay.com', + 'www.csdn.net', + 'www.office.com', + 'www.instagram.com', + 'www.yahoo.co.jp', + 'www.bing.com', + 'www.xinhuanet.com', + 'www.microsoft.com', + 'www.aliexpress.com', + 'twitter.com', + 'www.livejasmin.com', + 'google.com.hk', + 'www.stackoverflow.com', + 'www.babytree.com', + 'www.ebay.com', + 'www.naver.com', + 'www.twitch.tv', + 'www.amazon.co.jp', + 'www.pornhub.com', + 'www.tribunnews.com', + 'www.apple.com', + 'www.amazon.in', + 'www.google.co.in', + 'tianya.cn', + 'www.microsoftonline.com', + 'msn.com', + 'www.wordpress.com', + 'www.whitehouse.gov', +] diff --git a/src/utils/dom.ts b/src/utils/dom.ts index 715b6c02693f..b351044a8173 100644 --- a/src/utils/dom.ts +++ b/src/utils/dom.ts @@ -1,20 +1,14 @@ -import { LiveSelector } from '@holoflows/kit' +import { IntervalWatcher, LiveSelector } from '@holoflows/kit' import { isUndefined } from 'lodash-es' export const untilElementAvailable = async (ls: LiveSelector) => { + const w = new IntervalWatcher(ls) return new Promise((resolve, reject) => { - let timedOut = false - setTimeout(() => (timedOut = true), 4000) - const t = setInterval(() => { - if (ls.evaluate()) { - clearInterval(t) - resolve() - } - if (timedOut) { - clearInterval(t) - reject() - } - }, 500) + setTimeout(() => reject(), 5000) + w.useForeach(() => { + w.stopWatch() + resolve() + }).startWatch(500) }) } diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 0d923ccc2ec8..47513c0f068f 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -2,11 +2,16 @@ import { CustomEventId } from './constants' import { CustomEvents } from '../extension/injected-script/addEventListener' import { sleep as _sleep, timeout as _timeout } from '@holoflows/kit/es/util/sleep' -import { isNull } from 'lodash-es' +import { flatten, isNull, random } from 'lodash-es' export const sleep = _sleep export const timeout = _timeout +export const randomElement = (arr: any[]) => { + const e = flatten(arr) + return e[random(0, e.length - 1)] +} + /** * Get reference of file in both extension and storybook */