whats your 2020 twitter account warmup method?

dillywilly

Regular Member
Joined
May 6, 2020
Messages
250
Reaction score
93
Hey guys i have about 20 older twitter accounts with PVA and email verified that are 2015-2016 and they been sitting with no activity ever since created and i want to get them up and running what are some ideas you can throw my way to get them warmed up ? thanks in advance
 
One thing to remember is to do some auto-browsing off-platform to rebuild the pixel history.
 
Here's what I do and I rarely ever have to even phone verify:
  • Build the account with a mobile IP, connect to the hotspot and create the account.
  • Post once or twice a day for the first few weeks
  • Switch to a proxy
  • After 2-3 weeks start following 10-20 people per day
  • After 4ish weeks start following 30-50 per day
  • Start adding in likes/unfollows
  • After 6-8 weeks 50-70 per day
Rinse and repeat.
 
Here's what I do and I rarely ever have to even phone verify:
  • Build the account with a mobile IP, connect to the hotspot and create the account.
  • Post once or twice a day for the first few weeks
  • Switch to a proxy
  • After 2-3 weeks start following 10-20 people per day
  • After 4ish weeks start following 30-50 per day
  • Start adding in likes/unfollows
  • After 6-8 weeks 50-70 per day
Rinse and repeat.


my accounts are 2016 and they been sitting all their life but great tip
 
My fault on that. I would still start them off slow.
 
2 weeks in am i going too aggressive on 1 account lol?

Screen Shot 2020-05-08 at 12.09.15 PM.png
 
And how many of them actually converts to site visitors or leads?
 
Are you botting your accounts? If so, which one are you using if you don't mind me asking? I'm thinking of getting Followliker's twitter bot, but am curious if anyone prefers another program.


my hands are my bot lol i gave up on all bots im goin to scale this to 10 accounts manually with 20-30 min per account daily so its not too bad but the results are goin to be fire if i can master this
 
my hands are my bot lol i gave up on all bots im goin to scale this to 10 accounts manually with 20-30 min per account daily so its not too bad but the results are goin to be fire if i can master this

Damn, well good luck. I was thinking of growing a few accounts manually as well - I think you gave me a bit more hope for it.
 
That's fairly aggressive. Are you getting any captcha or PVs yet?
 
Can still run into captcha and PV doing manual.

That's good you haven't hit any yet, looks like you have a strong account.
 
Can still run into captcha and PV doing manual.

That's good you haven't hit any yet, looks like you have a strong account.
i own the numbers and strong emails so im not too worried about it but thanks
 
Are you botting your accounts? If so, which one are you using if you don't mind me asking? I'm thinking of getting Followliker's twitter bot, but am curious if anyone prefers another program.

Multilogin has an excellent scripting interface which allows you to develop your own bots either via Selenium or Puppeteer.

We developed a custom mouse movement module that randomises a quadratic curve between points for simple "panToElement()" style functionality, and for generic mouse noise, we created a simple "knockoff satire Twitter" site with comedic posts and pushed a bunch of cheap third-world traffic to it via Facebook ads. Given the site has an identical layout to the real Twitter, all the mouse movement positions recorded map perfectly on to the real Twitter (provided we scale them from source resolution to the Actors resolutions), which provide a perfect scroll / hover / move pattern from thousands of real users. Each time we deploy the Actor we play some noise in between the real actions we are attempting (ie following, liking, posting) etc.

Here's a partial screenshot taken from one a dev demo to give you an idea of how trivial the botting is if you know even a bit of ES6 javascript:

gsk9aU.jpg


There's a file I was working on a few weeks ago there called reboot-router.js, this is a crucial piece I'd suggest people implement if they are running an on-prem 4G connection to reboot the router to receive a fresh 4G IP address, then reconnect to Wi-Fi. Reason for this is that you don't want to be having to manually reboot the router every time you switch to a new Identity.

The upshot looks similar to this (although you wouldn't see the flashing mouse marker and the Chrome automation warning when piping it through MultiLogin as they harden it further to avoid detection.

img404.jpg
 
I'm sorry for the newbie question, but I am a newbie.

You're trying to build a following on twitter if I'm not mistaken. What good is it? Will you use it for CPA?

Thanks
 
I'm sorry for the newbie question, but I am a newbie.

You're trying to build a following on twitter if I'm not mistaken. What good is it? Will you use it for CPA?

Thanks

i want to use it to drive traffic to my shopify store
 
@Sebastiann whats this bot all about ? you built it ?

Yes, it's fairly straight forward if you spend a day or so understanding the Puppeteer API: https://github.com/puppeteer/puppeteer

Then all you need to do is install Node: https://nodejs.org/en/download/ and run your script. You can write it any editor or IDE, I use JetBrains products, but many people love VSCode which is free: https://code.visualstudio.com/

There are lots of starter scripts that you can find on the Puppeteer repo, but here is my base class that I build my Actors on top of:

Code:
const puppeteer = require('puppeteer');
const _ = require('lodash');

class Actor {

    // ================ Setup ================

    browser;
    page;

    identity;
    config;

    pos;

    ready = false;

    /**
     * Accept construction variables
     *
     * @param config
     * @param identity
     */

    constructor(config, identity) {
        this.identity = identity; // Login information etc
        this.config = config; // Platform specific variables

    }

    /**
     * Initialize plugins and set stat to ready
     *
     * @returns {Promise<void>}
     */

    async init() {
        return new Promise(async (resolve, reject) => {
            try {

                this.browser = await puppeteer.launch({
                                                          headless: false,
                                                          args: [
                                                              '--no-sandbox',
                                                              '--disable-setuid-sandbox',
                                                              '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36',
                                                              '--lang=en-US,en;q=0.9'
                                                          ],
                                                          userDataDir: this.identity.cookies, // Eg: './storage/identities/username'
                                                          defaultViewport: this.identity.browser.viewport
                                                      });

                this.page = await this.browser.newPage();

                this.ready = true;

            } catch (error) {
                reject(this.error(error));
            }
        });
    }

    /**
     * Your primary browse function, can rename to whatever you like
     *
     * @returns {Promise<void>}
     */

    async browse() {
        return new Promise(async (resolve, reject) => {
            try {

                // This is where you would build your bot actions

            } catch (error) {
                reject(this.error(error));
            }
        });
    }

    /**
     * Scroll the page, optionally with a direction or distance
     *
     * @returns {Promise<void>}
     * @param direction
     * @param distance
     */

    async scroll(direction, distance) {
        return new Promise(async (resolve, reject) => {
            try {

                this.logStart('Scroll');

                const noise = this.config.noise;
                const selectors = this.config.selectors;
                const viewport = this.identity.browser.viewport;

                // Limit to viewport
                let limits = {
                    min: Math.ceil(viewport.height * 0.30),
                    max: Math.ceil(viewport.height * 0.85)
                };

                distance = distance ? distance : _.random(limits.min, limits.max);

                if (!direction || (direction !== 'up' && direction !== 'down')) {
                    // Roll scroll direction
                    direction = await this.chance(noise.scroll.probability) ? 'down' : 'up';

                    // Detect header or footer tag
                    const footer = await this.page.$(selectors.footer);

                    if (footer && await footer.isIntersectingViewport()) {
                        direction = 'up';
                    }
                    else {
                        const header = await this.page.$(selectors.header);

                        if (header && await header.isIntersectingViewport()) {
                            direction = 'down';
                        }
                    }
                }

                distance = direction === 'down' ? distance : (distance * -1);

                await this.page.evaluate(async distance => {
                    return new Promise((resolve, reject) => {
                        try {
                            window.scrollBy(0, distance);
                            resolve();
                        } catch (error) {
                            reject(this.error(error));
                        }
                    });

                }, distance);

                await this.delay(100, 500);

                resolve();

            } catch (error) {
                reject(this.error(error));
            }
        });
    }

    /**
     * Handles delays with noise
     *
     * @returns {Promise<void>}
     * @param min
     * @param max
     */

    async delay(min, max) {
        return new Promise(async (resolve, reject) => {
            try {

                const noise = this.config.noise;

                let delay = _.random(min ? min : noise.delay.min, max ? max : noise.delay.max);

                await this.page.waitFor(delay);

                resolve();

            } catch (error) {
                reject(this.error(error));
            }
        });
    }

    /**
     * Moves the mouse to a position and adds noise
     *
     * @returns {Promise<void>}
     * @param pos
     * @param delay
     */

    async moveMouseTo(pos, delay) {
        return new Promise(async (resolve, reject) => {
            try {

                delay = delay ? delay : _.random(10, 80);
                await this.page.mouse.move(pos.x + _.random(0, 2), pos.y + _.random(0, 2));
                await this.delay(delay, (delay + 8));
                this.pos = pos;

                resolve();

            } catch (error) {
                reject(this.error(error));
            }
        });
    }

    /**
     * Move the mouse a set or random number of times around the page
     *
     * @returns {Promise<void>}
     * @param count
     */

    async randomMouseMovement(count) {
        return new Promise(async (resolve, reject) => {
            try {

                const noise = this.config.noise;

                await this.delay(50, 80);

                count = count ? parseInt(count) : _.random(noise.mouse.sequence.min, noise.mouse.sequence.max);

                for (let i = 0; i < count; i++) {

                    let startPos = await this.getCurrentMousePosition();
                    let endPos = await this.getRandomMousePosition();

                    await this.panMouse(startPos, endPos); // You will need to implement your own panning function

                }

                await this.delay(50, 1000);

                resolve();
            } catch (error) {
                reject(this.error(error));
            }
        });
    }

    /**
     * Select a new random mouse position from within the viewport
     *
     * @returns {Promise<void>}
     */

    async getRandomMousePosition() {

        return new Promise(async (resolve, reject) => {
            try {

                const viewport = this.identity.browser.viewport;

                let pos = {
                    x: Math.ceil(viewport.width * _.random(0.10, 0.90)),
                    y: Math.ceil(viewport.height * _.random(0.10, 0.90))
                };

                resolve(pos);

            } catch (error) {
                reject(this.error(error));
            }
        });

    }

    /**
     * Finds a dom element on the page
     *
     * @returns {Promise<void>}
     * @param selector
     */

    async getElement(selector) {
        return new Promise(async (resolve, reject) => {
            try {

                const element = (typeof selector === 'string') ? (await this.page.$(selector)) : selector;

                resolve(element);

            } catch (error) {
                reject(this.error(error));
            }
        });

    }

    /**
     * Gets the x,y position of a dom element
     *
     * @returns {Promise<void>}
     * @param selector
     */

    async getElementPosition(selector) {

        return new Promise(async (resolve, reject) => {
            try {

                const element = await this.getElement(selector);

                if (element) {

                    const boundingBox = await element.boundingBox();

                    let pos = {
                        x: Math.ceil(boundingBox.x + (boundingBox.width * _.random(0.3, 0.7))),
                        y: Math.ceil(boundingBox.x + (boundingBox.height * _.random(0.3, 0.7))),
                    };

                    resolve(pos);

                }
                else {
                    resolve();
                }

            } catch (error) {
                reject(this.error(error));
            }
        });

    }

    /**
     * Returns the current mouse position or starts at a new position if none found
     *
     * @returns {Promise<void>}
     */

    async getCurrentMousePosition() {
        return new Promise(async (resolve, reject) => {
            try {

                let pos = this.pos;

                if (!(pos && pos.x && pos.y)) {
                    pos = await this.getRandomMousePosition();
                    this.pos = pos;
                }

                resolve(pos);

            } catch (error) {
                reject(this.error(error));
            }
        });
    }

    /**
     * Helper function for handling randomness
     *
     * @returns {Promise<void>}
     * @param probability
     */

    async chance(probability) {
        return new Promise(async (resolve, reject) => {
            try {
                probability = probability ? parseInt(probability) : 50;

                resolve(!!_.random(0, 100) < probability);
            } catch (error) {
                reject(this.error(error));
            }
        });
    }

    /**
     * Error handler that prints error
     *
     * @returns {Promise<void>}
     * @param error
     */

    error(error) {

        const string = _.get(error, 'message', error);

        console.error(string);

        return error;
    }

}

module.exports = Actor;
 
Back
Top