mirror of
https://github.com/DIYgod/RSSHub.git
synced 2025-12-05 04:11:26 +08:00
* style: add eslint-unicorn * style: fix unicorn/no-useless-spread * style: fix unicorn/no-useless-promise-resolve-reject * style: fix unicorn/no-for-loop * fix: codeql bad HTML filtering regexp * fix: codeql incomplete replace * fix: unicorn/no-abusive-eslint-disable * style: fix unicorn/no-new-array * style: fix unicorn/no-typeof-undefined * style: fix unicorn/no-zero-fractions * style: fix unicorn/no-empty-file * style: fix unicorn/prefer-date-now * revert: auto fix unicorn/prefer-switch on lib/v2/kuaidi100/utils.js * style: fix unicorn/prefer-array-find * style: fix unicorn/prefer-array-flat * style: fix unicorn/prefer-array-flat-map * style: fix unicorn/prefer-at * style: fix unicorn/prefer-string-starts-ends-with * style: fix unicorn/prefer-includes * fix: codeql URL substring sanitization * style: fix unicorn/prefer-optional-catch-binding * style: fix unicorn/catch-error-name * style: fix unicorn/escape-case * style: fix unicorn/prefer-native-coercion-functions * style: fix unicorn/prefer-regexp-test * style: fix unicorn/require-array-join-separator * style: fix unicorn/prefer-math-trunc * style: fix unicorn/prefer-negative-index * style: fix unicorn/prefer-dom-node-dataset * style: fix unicorn/prefer-dom-node-text-content * style: fix unicorn/prefer-query-selector * style: fix unicorn/no-array-for-each * style: fix unicorn/no-negated-condition * style: fix unicorn/prefer-add-event-listener * style: fix unicorn/import-style * style: fix prefer-regex-literals * style: disable unicorn/no-useless-switch-case * style: disable unicorn/text-encoding-identifier-case * style: fix unicorn/prefer-set-has * style: fix unicorn/prefer-spread * revert: auto fix on lib/routes/universities/ynnu/edu/base64.js * style: fix unicorn/no-useless-undefined * style: fix unicorn/no-array-push-push * style: fix unicorn/no-useless-undefined again * style: fix unicorn/no-lonely-if * style: fix unicorn/prefer-reflect-apply * style: fix unicorn/switch-case-braces * style: fix unicorn/prefer-switch * style: fix unicorn/prefer-array-some * fix: deepscan UNUSED_VAR_ASSIGN * style: fix unicorn/prefer-ternary * fix: follow-up of unicorn/prefer-ternary * revert: auto fix of unicorn/prefer-string-slice for substring() * style: disable unicorn/prefer-string-slice fix: auto fix slice over deprecated substr * style: fix unicorn/throw-new-error * style: fix unicorn/filename-case * test: fix dateParser renaming * style: fix unicorn/better-regex * style: fix unicorn/prefer-string-replace-all * fix(deps): add sanitize-html * style: fix no-prototype-builtins * style: fix unicorn/consistent-destructuring * style: fix unicorn/consistent-function-scoping * style: fix unicorn/prefer-regexp-test * style: fix unicorn/prefer-logical-operator-over-ternary * style: fix unicorn/no-array-callback-reference * style: add prefer-object-has-own * style: warn unicorn/no-empty-file * style: fix unicorn/prefer-number-properties * style: fix no-useless-undefined again * style: fix unicorn/numeric-separators-style * style: disable unicorn/no-array-callback-reference false postive with cheerio
127 lines
4.4 KiB
JavaScript
127 lines
4.4 KiB
JavaScript
const got = require('got');
|
|
const { HttpsProxyAgent } = require('https-proxy-agent');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const concurrency = 5; // Please do not set it too large to avoid Twitter discovering our little secret
|
|
const proxyUrl = ''; // Add your proxy here
|
|
|
|
const baseURL = 'https://api.twitter.com/1.1/';
|
|
const headers = {
|
|
Authorization: 'Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F',
|
|
'User-Agent': 'TwitterAndroid/10.10.0',
|
|
};
|
|
|
|
const accounts = [];
|
|
|
|
function generateOne() {
|
|
// eslint-disable-next-line no-async-promise-executor
|
|
return new Promise(async (resolve) => {
|
|
const timeout = setTimeout(() => {
|
|
// eslint-disable-next-line no-console
|
|
console.log(`Failed to generate account, continue... timeout`);
|
|
resolve();
|
|
}, 30000);
|
|
|
|
const agent = {
|
|
https: proxyUrl && new HttpsProxyAgent(proxyUrl),
|
|
};
|
|
|
|
try {
|
|
const response = await got.post(`${baseURL}guest/activate.json`, {
|
|
headers: {
|
|
Authorization: headers.Authorization,
|
|
},
|
|
agent,
|
|
timeout: {
|
|
request: 20000,
|
|
},
|
|
});
|
|
const guestToken = JSON.parse(response.body).guest_token;
|
|
|
|
const flowResponse = await got.post(`${baseURL}onboarding/task.json?flow_name=welcome`, {
|
|
json: {
|
|
flow_token: null,
|
|
input_flow_data: {
|
|
flow_context: {
|
|
start_location: {
|
|
location: 'splash_screen',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
headers: {
|
|
...headers,
|
|
'X-Guest-Token': guestToken,
|
|
},
|
|
agent,
|
|
timeout: {
|
|
request: 20000,
|
|
},
|
|
});
|
|
const flowToken = JSON.parse(flowResponse.body).flow_token;
|
|
|
|
const finalResponse = await got.post(`${baseURL}onboarding/task.json`, {
|
|
json: {
|
|
flow_token: flowToken,
|
|
subtask_inputs: [
|
|
{
|
|
open_link: {
|
|
link: 'next_link',
|
|
},
|
|
subtask_id: 'NextTaskOpenLink',
|
|
},
|
|
],
|
|
},
|
|
headers: {
|
|
...headers,
|
|
'X-Guest-Token': guestToken,
|
|
},
|
|
agent,
|
|
timeout: {
|
|
request: 20000,
|
|
},
|
|
});
|
|
|
|
const account = JSON.parse(finalResponse.body).subtasks[0].open_account;
|
|
|
|
if (account) {
|
|
accounts.push({
|
|
t: account.oauth_token,
|
|
s: account.oauth_token_secret,
|
|
});
|
|
} else {
|
|
// eslint-disable-next-line no-console
|
|
console.log(`Failed to generate account, continue... no account`);
|
|
}
|
|
} catch (error) {
|
|
// eslint-disable-next-line no-console
|
|
console.log(`Failed to generate account, continue... ${error}`);
|
|
}
|
|
|
|
clearTimeout(timeout);
|
|
resolve();
|
|
});
|
|
}
|
|
|
|
(async () => {
|
|
const oldAccounts = fs.readFileSync(path.join(__dirname, 'accounts.txt'));
|
|
const tokens = oldAccounts.toString().split('\n')[0].split('=')[1].split(',');
|
|
const secrets = oldAccounts.toString().split('\n')[1].split('=')[1].split(',');
|
|
for (const [i, token] of tokens.entries()) {
|
|
accounts.push({
|
|
t: token,
|
|
s: secrets[i],
|
|
});
|
|
}
|
|
|
|
for (let i = 0; i < 1000; i++) {
|
|
// eslint-disable-next-line no-console
|
|
console.log(`Generating accounts ${i * concurrency}-${(i + 1) * concurrency - 1}, total ${accounts.length}`);
|
|
|
|
// eslint-disable-next-line no-await-in-loop
|
|
await Promise.all(Array.from({ length: concurrency }, () => generateOne()));
|
|
fs.writeFileSync(path.join(__dirname, 'accounts.txt'), [`TWITTER_OAUTH_TOKEN=${accounts.map((account) => account.t).join(',')}`, `TWITTER_OAUTH_TOKEN_SECRET=${accounts.map((account) => account.s).join(',')}`].join('\n'));
|
|
}
|
|
})();
|