// ==UserScript== // @name Rettiwt API Key Generator // @namespace https://github.com/Rishikant181/Rettiwt-API // @version 1.0.1 // @description Generate a Rettiwt-API API_KEY from X/Twitter cookies // @author lihengdao666 // @match https://x.com/* // @match https://twitter.com/* // @grant GM_registerMenuCommand // @grant GM_setClipboard // @grant GM_cookie // @run-at document-idle // @license MIT // ==/UserScript== (function () { 'use strict'; const COOKIE_NAMES = ['auth_token', 'ct0', 'twid']; function getCookie(name, url) { return new Promise((resolve, reject) => { GM_cookie.list({ name, url }, (cookies, error) => { if (error) { reject(error); return; } resolve(cookies && cookies[0] ? cookies[0].value : ''); }); }); } async function getCookieMap() { const urls = [ 'https://x.com/', 'https://twitter.com/', ]; const result = {}; for (const name of COOKIE_NAMES) { for (const url of urls) { const value = await getCookie(name, url); if (value) { result[name] = value; break; } } } return result; } async function generateApiKey() { const cookies = await getCookieMap(); const missing = COOKIE_NAMES.filter((name) => !cookies[name]); if (missing.length > 0) { throw new Error(`Missing cookies: ${missing.join(', ')}. Please make sure you are logged in to X/Twitter.`); } const rawKey = `auth_token=${cookies.auth_token};ct0=${cookies.ct0};twid=${cookies.twid};`; return btoa(rawKey); } function copyText(text) { if (typeof GM_setClipboard === 'function') { GM_setClipboard(text, 'text'); return; } return navigator.clipboard.writeText(text); } GM_registerMenuCommand('Generate Rettiwt API_KEY', async () => { try { const apiKey = await generateApiKey(); await copyText(apiKey); alert('Rettiwt API_KEY has been copied to your clipboard.\n\nKeep it private and do not share it.'); } catch (error) { alert(error.message || String(error)); } }); })();