← back to Dear Bubbe Nextjs

archived/social-posters/x-full-cookies-poster.js

186 lines

const https = require('https');
const fs = require('fs').promises;

// Full cookie set from X.com
const COOKIES = {
    auth_token: '29242b900adcea897a68bf3c6f5ba838bc5b90ad',
    ct0: '2162404f2a02090757d7dd75042da41274308247b3296bd5cdfe262dee726059fcf260ea7caf13c41bb8bebf6f79acff9bb8b9dc6cdca30b0846bc65ec6f30c5212f03270cb1467cefbb5e44a9a18297',
    kdt: 's8yn34tzVhsRarRG9aMHHUroYiLJrkOdTem1fVbS',
    twid: 'u%3D1991237689463779328',
    guest_id: 'v1%3A176322519127997840',
    guest_id_ads: 'v1%3A176322519127997840',
    guest_id_marketing: 'v1%3A176322519127997840',
    personalization_id: '"v1_+r6vFhFDj7YJ1lXInPlBEA=="',
    gt: '1991267399497363681',
    att: '1-2rLKtgsod73qxQkNRfZMhUkDlJa73jealVxi8Pap',
    _twitter_sess: 'BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNo%250ASGFzaHsABjoKQHVzZWR7AA%253D%253D--1164b91ac812d853b877e93ddb612b7471bebc74',
    des_opt_in: 'Y',
    dnt: '1',
    lang: 'en'
};

async function postToX(text) {
    console.log('🐦 Posting to X.com with full cookies...');
    console.log('Tweet:', text.substring(0, 80) + '...\n');
    
    // Build full cookie string
    const cookieString = Object.entries(COOKIES)
        .map(([key, value]) => `${key}=${value}`)
        .join('; ');
    
    const postData = JSON.stringify({
        variables: {
            tweet_text: text,
            dark_request: false,
            media: {
                media_entities: [],
                possibly_sensitive: false
            },
            semantic_annotation_ids: []
        },
        features: {
            c9s_tweet_anatomy_moderator_badge_enabled: true,
            communities_web_enable_tweet_community_results_fetch: true,
            creator_subscriptions_quote_tweet_preview_enabled: false,
            freedom_of_speech_not_reach_fetch_enabled: true,
            graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,
            longform_notetweets_consumption_enabled: true,
            longform_notetweets_inline_media_enabled: true,
            longform_notetweets_rich_text_read_enabled: true,
            responsive_web_edit_tweet_api_enabled: true,
            responsive_web_enhance_cards_enabled: false,
            responsive_web_graphql_exclude_directive_enabled: true,
            responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,
            responsive_web_graphql_timeline_navigation_enabled: true,
            responsive_web_twitter_article_tweet_consumption_enabled: true,
            rweb_tipjar_consumption_enabled: true,
            rweb_video_timestamps_enabled: true,
            standardized_nudges_misinfo: true,
            tweet_awards_web_tipping_enabled: false,
            tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled: true,
            tweetypie_unmention_optimization_enabled: true,
            articles_preview_enabled: true,
            verified_phone_label_enabled: false,
            view_counts_everywhere_api_enabled: true
        },
        queryId: 'oB-5XsHNAbjvARJEc8CZFw'
    });
    
    return new Promise((resolve, reject) => {
        const options = {
            hostname: 'x.com',
            port: 443,
            path: '/i/api/graphql/oB-5XsHNAbjvARJEc8CZFw/CreateTweet',
            method: 'POST',
            headers: {
                'Host': 'x.com',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
                'Accept': '*/*',
                'Accept-Language': 'en-US,en;q=0.9',
                'Accept-Encoding': 'identity',
                'Content-Type': 'application/json',
                'Content-Length': Buffer.byteLength(postData),
                'Referer': 'https://x.com/compose/post',
                'authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA',
                'x-csrf-token': COOKIES.ct0,
                'x-twitter-auth-type': 'OAuth2Session',
                'x-twitter-client-language': 'en',
                'x-twitter-active-user': 'yes',
                'x-client-transaction-id': 'F' + Math.random().toString(36).substring(2, 15),
                'Cookie': cookieString,
                'Origin': 'https://x.com',
                'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
                'Sec-Ch-Ua-Mobile': '?0',
                'Sec-Ch-Ua-Platform': '"Windows"',
                'Sec-Fetch-Dest': 'empty',
                'Sec-Fetch-Mode': 'cors',
                'Sec-Fetch-Site': 'same-origin',
                'TE': 'trailers'
            }
        };
        
        const req = https.request(options, (res) => {
            let data = '';
            
            res.on('data', (chunk) => {
                data += chunk;
            });
            
            res.on('end', () => {
                console.log('Response Status:', res.statusCode);
                
                if (res.statusCode === 200) {
                    try {
                        const response = JSON.parse(data);
                        if (response.data && response.data.create_tweet) {
                            console.log('✅ Tweet posted successfully!');
                            const tweetId = response.data.create_tweet.tweet_results?.result?.rest_id;
                            if (tweetId) {
                                console.log('Tweet URL: https://x.com/DearBubbe/status/' + tweetId);
                            }
                            resolve(true);
                        } else {
                            console.log('❌ Unexpected response format');
                            console.log('Response:', JSON.stringify(response, null, 2).substring(0, 500));
                            resolve(false);
                        }
                    } catch (e) {
                        console.log('❌ Failed to parse response');
                        console.log('Raw response:', data.substring(0, 500));
                        resolve(false);
                    }
                } else {
                    console.log('❌ Failed with status:', res.statusCode);
                    console.log('Response:', data.substring(0, 500));
                    resolve(false);
                }
            });
        });
        
        req.on('error', (e) => {
            console.error('❌ Request error:', e.message);
            reject(e);
        });
        
        req.write(postData);
        req.end();
    });
}

async function postFromQueue() {
    try {
        const queuePath = '/root/Projects/dear-bubbe-admin/logs/twitter-queue.json';
        const queue = JSON.parse(await fs.readFile(queuePath, 'utf8'));
        
        const toPost = queue.find(t => t.status === 'queued');
        if (!toPost) {
            console.log('No posts in queue');
            return false;
        }
        
        console.log('📤 Posting from queue...');
        const success = await postToX(toPost.text);
        
        if (success) {
            toPost.status = 'posted';
            toPost.postedAt = new Date().toISOString();
            await fs.writeFile(queuePath, JSON.stringify(queue, null, 2));
            console.log('✅ Queue updated');
        }
        
        return success;
    } catch (error) {
        console.error('Error:', error);
        return false;
    }
}

module.exports = { postToX, postFromQueue };

if (require.main === module) {
    if (process.argv[2] === 'test') {
        postToX('Testing Bubbe auto-post system! The schmucks finally got it working! #BubbeAI Visit Bubbe.AI');
    } else {
        postFromQueue();
    }
}