Full Code of FrostTheFox/ptc-acc-gen for AI

master 5a68f49ef01b cached
18 files
47.5 KB
11.3k tokens
21 symbols
1 requests
Download .txt
Repository: FrostTheFox/ptc-acc-gen
Branch: master
Commit: 5a68f49ef01b
Files: 18
Total size: 47.5 KB

Directory structure:
gitextract_o08qxupu/

├── .gitattributes
├── .gitignore
├── .gitmodules
├── .travis.yml
├── LICENSE.md
├── README.md
├── config.js
├── config.py
├── gmailverify.js
├── index.js
├── index.js.original
├── install.bat
├── install.sh
├── makeaccounts.bat
├── makeaccounts.sh
├── nicknames.json
├── output/
│   └── screenshots/
│       └── .gitkeep
└── package.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text eol=lf

# Custom for Visual Studio
*.cs     diff=csharp

# Standard to msysgit
*.doc	 diff=astextplain
*.DOC	 diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot  diff=astextplain
*.DOT  diff=astextplain
*.pdf  diff=astextplain
*.PDF	 diff=astextplain
*.rtf	 diff=astextplain
*.RTF	 diff=astextplain


================================================
FILE: .gitignore
================================================
# Logs
logs
*.log
npm-debug.log*

# Dependency directories
node_modules
jspm_packages

# Optional npm cache directory
.npm

output/screenshots/*.png


================================================
FILE: .gitmodules
================================================
[submodule "PogoPlayer"]
	path = PogoPlayer
	url = https://github.com/sebastienvercammen/PogoPlayer.git


================================================
FILE: .travis.yml
================================================
language: node_js
node_js:
  - "node"
  - "6.1"
install:
  - npm install
  - npm install jshint
notifications:
  email: false


================================================
FILE: LICENSE.md
================================================
MIT License

Copyright (c) 2017 Frost The Fox and Sébastien Vercammen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# Nintendo PTC Account Generator [![Build Status](https://travis-ci.org/sebastienvercammen/ptc-acc-gen.svg?branch=master)](https://travis-ci.org/sebastienvercammen/ptc-acc-gen)

***Supported once again! Please use the [PokemonGo-Map Discord](https://discord.gg/g6k7w83) for questions.***

***It seems Nintendo has patched the + e-mail trick for Gmail. Some users on our Discord have tested and reported that Gmail now requires a 220+ second cooldown period between creation of accounts. Using another e-mail provider (tested with hotmail) still works. For automatic validation, forward all PTC account e-mails to a Gmail account and use our auto-verifier.***

**Please be sure to clone RECURSIVELY**
example: git clone --recursive https://github.com/sebastienvercammen/ptc-acc-gen.git

An automation script based on Nightmare.js that can create any number of Nintendo Pokémon Trainer Club accounts with a single  e-mail address. This only works because Nintendo doesn't check for "email+1@domain.com" e-mail tricks, where the e-mail host completely ignores any part after (and including) the plus sign and sends it to "email@domain.com".

This project was started as a proof of concept: even multi-billion dollar companies that just released the single most popular mobile game (Pokémon Go) sometimes miss the details.

More about plus signs in e-mail addresses [on StackExchange](http://security.stackexchange.com/questions/65244/what-are-the-security-reasons-for-disallowing-the-plus-sign-in-email-addresses).

If you're using Gmail and want to automatically verify all accounts, use https://gist.github.com/sebastienvercammen/e7e0e9e57db246d7f941b789d8508186
The instructions are at the top of the file.


The new version on Nightmare.js now:

* Checks for usernames/e-mails that are already taken
* Can screenshot the result page (both on success and on failure)
* Handles server issues better
* Doesn't require PhantomJS/CasperJS or fiddling with the PATH environment variable

## Requirements
### Prerequisites
* [Node.js](https://nodejs.org/en/)

## Usage
Windows Instructions:

1. Make sure you clone recursively (git clone --recursive [origin])
  - if you download the zip, make sure you also download the submodule PogoPlayer.
  - if you cloned non-recursively, be sure to run `git submodule init && git submodule update` or ToS verification will not work.
2. Install requirements with `npm install`
3. Run config.py or edit config.js manually. (you will have to edit manually for 2captcha)
4. Run using `makeaccounts.bat`.
5. Wait for the generator to fill in the second page, then accept the captcha and hit submit.
6. Repeat for all accounts
7. Find the generated accounts in PogoPlayer/accounts.csv.

It is recommended to keep the username set in your config to around 6 characters.

Linux Instructions:  
***Headless systems will no longer be able to use the gen due to the captcha requirement, unless you use the autovalidation using 2captcha service (see below)***

1. Run `npm install`
2. Run config.py or edit config.js manually. (you will need to edit manually for 2captcha)
2. Run using `makeaccounts.sh`.
3. Wait for the generator to fill in the second page, then accept the captcha and hit submit.
4. Repeat for all accounts
5. Find the generated accounts in PogoPlayer/accounts.csv.

There is a few command line arguments for index.js if you run manually. `node index.js -h` for more info.

It is recommended to keep the username set in your config to around 6 characters.

Auto-validation Instructions:

1. Create a 2Captcha account at http://2captcha.com/
2. Make a deposit or start working to have a positive balance
3. Navigate to "2Captcha API" page and copy the API KEY
4. Update config.js to enable autovalidation and paste your API KEY
5. That's it, run the script as usual. You will be switched back to headless mode automatically

## Configuration
### 1. Generate 10 accounts in the format USERx, where x is 0 to 9.
This example corresponds to the default settings. It will generate 10 accounts in the same format: user0, user1, ...

In [config.js](config.js):

// Starts gen from startNumber to endNumber, determining how many accounts are made
	startNum: 0,
	endNum: 10,

	// Creation Options
	nicknameFile: false, // Use nicknames file, or just append numbers to username?
	randomPassword: false, // If true generate a random password, If false set "password" field below
	screenshotResult: true, // Saves a screenshot per account creation when set to true
	screenshotOnFailure: true, // Saves a screenshot even if registration fails when set to true

	// Creation Requirements
	username: 'CHANGEME', // Keep the '', User- & display name. Make sure any "(username + number)@domain.com" is 100% unique, and is 6 characters minimum, but under 14 characters after the numbers are applied.
	password: 'CHANGEME', // If you set randomPassword to 'false' above change this to your chosen password (so you have same password for all accounts)
	emailUser: 'email', // Enter your email address name. If your address is email@domain.com you'd enter 'email'
	emailDomain: 'domain.com', // Domain of email address. If your address is email@domain.com  you'd enter 'domain.com'
	latitude: 'LATITUDE', // Location Latitude for initial login
	longitude: 'LONGITUDE' // Location Longitude for initial login

### 2. Generate random passwords per account.

 Set randomPassword: true, in [config.js](config.js).

 Password for accounts will be random, aftyer finished find usernames and passwords in /PogoPlayer/accounts.csv

### 3. Save screenshots (Default directory is /output/screenshots)

	screenshotResult: true, // Saves a screenshot per account creation when set to true
	screenshotOnFailure: true, // Saves a screenshot even if registration fails when set to true

### 4. Use a list of unique usernames instead of USERx combinations.

  To create a number of accounts with custom usernames instead of user + number combinations, change [index.js](index.js):

  Set nicknameFile: true, in [config.js](config.js).

  The list of unique usernames must be stored in [nicknames.json](nicknames.json). An example is available on the repo.


================================================
FILE: config.js
================================================
var config = {
    // Starts gen from startNumber to endNumber, determining how many accounts are made
    startNum: 0,
    endNum: 10,

    // Creation Options
    // Use nicknames file, or just append numbers to username?
    nicknameFile: false,
    // If true generate a random password, If false set "password" field below
    randomPassword: true,
    // Saves a screenshot per account creation when set to true
    screenshotResult: true,
    // Saves a screenshot even if registration fails when set to true
    screenshotOnFailure: true,

    // Creation Requirements
    // Keep the '', User- & display name. It is recommended to keep the username set in your config to around 6 characters.
    username: "CHANGEME",
    // If you set randomPassword to 'false' above change this to your chosen password (so you have same password for all accounts)
    password: "NOSTATIC",
    // Enter your email address name. If your address is email@domain.com you'd enter 'email'
    emailUser: "CHANGEME",
    // Domain of email address. If your address is email@domain.com  you'd enter 'domain.com'
    emailDomain: "CHANGEME",
    // Location Latitude for initial login
    latitude: "CHANGEME",
    // Location Longitude for initial login
    longitude: "CHANGEME",
    // Country code (e.g. BE, FR, US, CA)
    country: "US",

    // 2Captcha API key
    useAutoCatcha: false,
    captchaApiKey: "YOUR_2CAPTCHA_API_KEY_HERE",
    // turn on debug logging
    debug: false
};

module.exports = config;


================================================
FILE: config.py
================================================
#!/usr/bin/python
# Version 1

import os
import sys
import signal
import re
from os import fsync


def signal_handler(signal, frame):
        print('You pressed Ctrl+C!')
        sys.exit(0)

def printmenu():
    os.system('cls' if os.name == 'nt' else 'clear')
    #os.system('cls') # for Windows
    #os.system('clear')

    print (30 * '-')
    print ("PTC-ACC-GEN Config Builder")
    print ("Lets set you up!")
    print (30 * '-')
    print ("1. Build Your Config")
    print ("0. Quit")
    print (30 * '-')
    choice = raw_input('Enter your choice [0-1] : ')
    try:
        choice = int(choice)
    except:
        printmenu()
    print (30 * '-')

    if choice == 1:
        configBuilder()
    elif choice == 0:
        cleanExit("bye")
    else:
        printmenu()


def configBuilder():

    "Calculates the number of accounts needed for a specific step value to achiece a specific scan time"
    startNum = raw_input("Number for Accounts to Start at (recommend 0): ")
    endNum = raw_input("Number for Accounts to End at (recommend 10): ")
    nicknameFile = raw_input("Use Nickname File? (recommend: false): ")
    randomPassword = raw_input("Use Random Password? (recommend: true): ")
    screenshotResult = raw_input("Save Screenshot of each Success? (recommend: true): ")
    screenshotOnFailure = raw_input("Save Screenshot of each Failure? (recommend: true): ")
    username = raw_input("Choose User/Display name, at least 6 chars (recommended) and less than 15: ")
    if randomPassword.lower() in ("false"):
            password = raw_input("Choose Static Password for Accounts: ")
    else:
            password = "NOSTATIC"
    emailUser = raw_input("Email Address Name (whats before the @ in your email address? ex: yoloswag420): ")
    emailDomain = raw_input("Email Domain (whats after the @ in your email address? ex: hotmail.com): ")
    latitude = raw_input("Latitude for Registration (example: 36.54596): ")
    longitude = raw_input("Longitude for Registration (example: -79.22247): ")
    country = raw_input("Country Code for Registration (example: US, BE, FR, CA): ")

    #Now lets check what people input vs what is valid
    flag = 1
    while flag == 1:
            try:
                int(startNum)
            except ValueError:
                try:
                    float(startNum)
                except ValueError:
                    print (30 * '-')
                    print "Your Number for Accounts to Start at is not a number"
                    print "Your Current Start Number: %s" %(startNum)
                    startNum = raw_input("Number for Accounts to Start at (recommend 0): ")
                    flag = 1
            try:
                int(endNum)
            except ValueError:
                try:
                    float(endNum)
                except ValueError:
                    print (30 * '-')
                    print "Your Number for Accounts to End at is not a number"
                    print "Your Current End Number: %s" %(endNum)
                    startNum = raw_input("Number for Accounts to End at (recommend 10): ")
                    flag = 1
            try:
                int(latitude)
            except ValueError:
                try:
                    float(latitude)
                except ValueError:
                    print (30 * '-')
                    print "Your Latitude is not a number"
                    print "Your Current Latitude: %s" %(latitude)
                    latitude = raw_input("Latitude for Registration (example: 36.54596): ")
                    flag = 1
            try:
                int(longitude)
            except ValueError:
                try:
                    float(longitude)
                except ValueError:
                    print (30 * '-')
                    print "Your Longitude is not a number"
                    print "Your Current Longitude: %s" %(longitude)
                    startNum = raw_input("Longitude for Registration (example: -79.22247): ")
                    flag = 1

            if startNum > endNum:
                    print (30 * '-')
                    print "Your Number for Accounts to End at must be greater than Number for Accounts to Start at"
                    print "Your Current End Number: %s Your Current Start Number: %s" %(startNum, endNum)
                    startNum = raw_input("Number for Accounts to Start at (recommend 0): ")
                    endNum = raw_input("Number for Accounts to End at (recommend 10): ")
                    flag = 1
            else:
                    flag = 0
            if nicknameFile.lower() not in ("true", "false"):
                    print (30 * '-')
                    print "You didn't type 'true' or 'false' for Use Nickname File: %s" %(nicknameFile)
                    nicknameFile = raw_input("Use Nickname File? (recommend: false): ")
                    flag = 1
            else:
                    flag = 0
            if randomPassword.lower() not in ("true", "false"):
                    print (30 * '-')
                    print "You didn't type 'true' or 'false' for Use Random Password: %s" %(randomPassword)
                    randomPassword = raw_input("Use Random Password? (recommend: false): ")
                    flag = 1
            else:
                    flag = 0
            if screenshotResult.lower() not in ("true", "false"):
                    print (30 * '-')
                    print "You didn't type 'true' or 'false' for Save Screenshot of each Success: %s" %(screenshotResult)
                    screenshotResult = raw_input("Save Screenshot of each Success? (recommend: true): ")
                    flag = 1
            else:
                    flag = 0
            if screenshotOnFailure.lower() not in ("true", "false"):
                    print (30 * '-')
                    print "You didn't type 'true' or 'false' for Save Screenshot of each Failure: %s" %(screenshotOnFailure)
                    screenshotOnFailure = raw_input("Save Screenshot of each Failure? (recommend: true): ")
                    flag = 1
            else:
                    flag = 0
            if len(username) < 6:
                    print (30 * '-')
                    print "You chose a username that was less than 6 chars: %s" %(username)
                    username = raw_input("Choose User/Display name, at least 6 chars and less than 15: ")
                    flag = 1
            elif len(username) > 15:
                    print (30 * '-')
                    print "You chose a username that was more than 15 chars: %s" %(username)
                    username = raw_input("Choose User/Display name, at least 6 chars and less than 15: ")
                    flag = 1
            else:
                    flag = 0

    vars = ['startNum', 'endNum','nicknameFile','randomPassword','screenshotResult','screenshotOnFailure','username','password','emailUser','emailDomain','latitude','longitude','country']
    new_values = [startNum + ',',endNum + ',',nicknameFile + ',',randomPassword + ',',screenshotResult + ',',screenshotOnFailure + ',','"' + username + '",','"' + password + '",','"' + emailUser + '",','"' + emailDomain + '",','"' + latitude + '",','"' + longitude + '",','"' + country + '",','"']
    what_to_change = dict(zip(vars,new_values))

    updating('config.js',what_to_change)

    raw_input("Config Built Successfully! Press Enter")
    printmenu()

def updating(filename,dico):

    RE = '(('+'|'.join(dico.keys())+')\s*:)[^\r\n]*?(\r?\n|\r)'
    pat = re.compile(RE)

    def jojo(mat,dic = dico ):
        return dic[mat.group(2)].join(mat.group(1,3))

    with open(filename,'rb') as f:
        content = f.read()

    with open(filename,'wb') as f:
        f.write(pat.sub(jojo,content))

def cleanExit(message):
    sys.exit(message)


signal.signal(signal.SIGINT, signal_handler)
printmenu()


================================================
FILE: gmailverify.js
================================================
/*
  Automatically click all "Verify your email" links in the welcome e-mail from
  Nintendo Pokémon Trainer Club's signup e-mails.

  All verified e-mails will be moved to trash unless you set "moveToTrash" to false.

  How to use:
   1. Login to Gmail
   2. Go to https://script.google.com/
   3. Enter the code, save, run.
   4. Wait until fully completed, DO NOT LEAVE THE PAGE! (When finished, the text "running..." at the top will disappear.)
   5. Click View > Logs. At the bottom you'll see the total accounts verified.
   6. Enjoy

   Note: The script will stop after about 98 emails. This is a limitation of Google Scripts, not the script itself. Simply run again and it will process the remaining emails.
*/

function myFunction() {
  var verified = 0;
  var moveToTrash = true;

  var threads = GmailApp.search('in:inbox subject:"Pokémon Trainer Club Activation"');
  Logger.log("Found " + threads.length + " threads.");

  threads.forEach(function(thread) {
    var messages = thread.getMessages();
    Logger.log("Found " + messages.length + " messages.");

    messages.forEach(function(msg) {
      var value = msg.getBody()
                     .match(/verify your email/m);

      if(msg.isInInbox() && value) {
        var link = msg.getBody().match(/<a href="https:\/\/club.pokemon.com\/us\/pokemon-trainer-club\/activated\/([\w\d]+)"/);

        if(link) {
          var url = 'https://club.pokemon.com/us/pokemon-trainer-club/activated/' + link[1];
          var options = {
            "muteHttpExceptions": true
          };

          var status = UrlFetchApp.fetch(url, options).getResponseCode();
          Logger.log("[#] Verified (" + status + "): " + url);

          if(status == 200) {
            verified++;
            msg.markRead();

            if(moveToTrash) { msg.moveToTrash(); }
          }
        }
      }
    });
  });

  Logger.log("Completed " + verified + " verifications.");
}


================================================
FILE: index.js
================================================
/*jshint sub:true*/
// Requires
var Nightmare = require('nightmare');
var nicknames = require('./nicknames.json');
var fs = require('fs');
var request = require('request');

// Settings
var showWindow = true;

// Start Config File Imports
var configFile = require('./config');
var start = configFile.startNum;
var end = configFile.endNum;
var useNicknamesFile = configFile.nicknameFile;
var useRandomPassword = configFile.randomPassword;
var screenshotResult = configFile.screenshotResult;
var screenshotFail = configFile.screenshotOnFailure;
var username = configFile.username;
var password = configFile.password;
var email_user = configFile.emailUser;
var email_domain = configFile.emailDomain;
var lat = configFile.latitude;
var lon = configFile.longitude;
var country = configFile.country;
var useAutoCatcha = configFile.useAutoCatcha;
var captchaApiKey = configFile.captchaApiKey;
var debug = configFile.debug;
// End Config File Imports

if (useAutoCatcha)
    showWindow = false;

// argv parse
var argv = require('minimist')(process.argv.slice(2));
if (argv['h']) {
    console.log("usage: index.js [-h] [-u USERNAME] [-s START] [-e END]");
    console.log("");
    console.log("An automation script based on Nightmare.js.");
    console.log("Can create any number of Nintendo Pokémon Trainer Club accounts,");
    console.log("with a single e-mail address.");
    console.log("");
    console.log("optional arguments:");
    console.log("	-u	The username used.");
    console.log("	-s	Starting number.");
    console.log("	-e	Ending number.");
    process.exit();
}
if (argv['u']) {
    username = argv['u'];
}
if (argv['s']) {
    start = argv['s'];
}
if (argv['e']) {
    end = argv['e'];
}

var outputFile = "PogoPlayer/accounts.csv"; // File which will contain the generated "username password" combinations.
var outputFormat = "ptc,%NICK%,%PASS%,%LAT%,%LON%,%UN%\r\n"; // Format used to save the account data in outputFile. Supports %NICK%, %PASS%.
var screenshotFolder = "output/screenshots/";

// App data
var url_ptc = "https://club.pokemon.com/us/pokemon-trainer-club/sign-up/";
var useragent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36";
var symbols = ["#", "?", "!", "@", "$", "%", "^", "&", ">", "<", "+", "`", "*", "(", ")", "-", "[", "]"];
var nightmare_opts = {
    show: showWindow,
    waitTimeout: 10000,
    gotoTimeout: 5000,
    loadTimeout: 5000
};
// Prints nice little message
console.log("ptc-acc-gen v2.8.0 by Sébastien Vercammen and Frost The Fox (and Github contribs)");


// Settings check
if (!useNicknamesFile && (username + end).length > 16) {
    console.log("Error: length of username + number can't be longer than 16 characters.");
    console.log("Please use a shorter nickname.");
    process.exit();
}

if ((email_user + '+' + username + end + '@' + email_domain).length > 75) {
    console.log("Error: length of e-mail address including the + trick can't be longer than 75 characters.");
    console.log("Please use a shorter e-mail address and/or nickname.");
    process.exit();
}

if (!useRandomPassword && (password.length > 15 || !containsSymbol(password) || !containsUppercase(password))) {
    console.log("Error: length of password can't be longer than 15 characters, requires a symbol and uppercase characters.");
    process.exit();
}

// LETSAHGO
var nightmare = Nightmare(nightmare_opts);
nightmare.useragent(useragent);

createAccount(start);

// Helpers

function containsUppercase(txt) {
    return txt.toLowerCase() !== txt;
}

function containsSymbol(txt) {
    return symbols.some(function(s) {
        return txt.indexOf(s) > -1;
    });
}

function handleError(err) {
    if (debug) {
        console.log("[DEBUG] Error:" + JSON.stringify(err));
    }

    return err;
}

function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

function getRandomNumbers(length) {
    return Math.random().toString().substr(2, length);
}

function getRandomSymbols(length) {
    var str = "";

    for (var i = 0; i < length; i++) {
        str += symbols[getRandomInt(0, symbols.length - 1)];
    }

    return str;
}

function randomPassword() {
    // Your password must include upper and lower case letters, numbers and symbols (such as #?!@$%%^&><+`*()-])
    return (Math.random().toString(36) + '00000000000000000').slice(2, 8) + getRandomNumbers(3) + getRandomSymbols(3) + "ABC";
}

function prepareNightmare(nightmare) {
    nightmare.useragent(useragent);
}

// Pages
function createAccount(ctr) {
    console.log("Creating account " + ctr + " of " + end);

    // Launch instance
    handleFirstPage(ctr);
}

// First page
function handleFirstPage(ctr) {
    if (debug) {
        console.log("[DEBUG] Handle first page #" + ctr);
    }

    nightmare.goto(url_ptc)
        .evaluate(evaluateDobPage)
        .then(function(validated) {
            if (!validated) {
                // Missing form data, loop over itself
                console.log("[" + ctr + "] Unable to evaluate PTC DOB signup page... Trying again.");
                return function() {
                    nightmare.wait(500).refresh().wait();
                    handleFirstPage(ctr);
                };
            } else {
                return function() {
                    fillFirstPage(ctr);
                };
            }
        })
        .then(function(next) {
            // Handle next step: either a loop to first page in case of error, or form fill on success
            return next();
        })
        .catch(handleError)
        .then(function(err) {
            if (typeof err !== "undefined") {
                return handleFirstPage(ctr);
            }
        });
}

function fillFirstPage(ctr) {
    if (debug) {
        console.log("[DEBUG] Fill first page #" + ctr);
    }

    nightmare.evaluate(function(data) {
            var dob = new Date((new Date()).getTime() - (Math.random() * (new Date()).getTime()) - 18 * 365 * 24 * 60 * 60 * 1000);
            document.getElementById("id_dob").value = dob.getFullYear() + "-" + (dob.getMonth() + 1) + "-" + dob.getDate();

            var els = document.getElementsByName("country");
            for (var i = 0; i < els.length; i++) {
                els[i].value = data.country;
            }

            return document.getElementById("id_dob").value;
        }, {
            country: country
        })
        .click("form[name='verify-age'] [type=submit]")
        .wait("#id_username")
        .then(function() {
            handleSignupPage(ctr);
        })
        .catch(handleError)
        .then(function(err) {
            if (typeof err !== "undefined") {
                return handleFirstPage(ctr);
            }
        });
}

// Signup page
function handleSignupPage(ctr) {
    if (debug) {
        console.log("[DEBUG] Handle second page #" + ctr);
    }

    nightmare.evaluate(evaluateSignupPage)
        .then(function(validated) {
            if (!validated) {
                // Missing form data, loop over itself
                console.log("[" + ctr + "] Unable to evaluate PTC signup page... Trying again.");
                return function() {
                    nightmare.wait(500).refresh().wait();
                    handleFirstPage(ctr);
                };
            } else {
                return function() {
                    fillSignupPage(ctr);
                };
            }
        }).then(function(next) {
            // Handle next step: either a loop to first page in case of error, or form fill on success
            return next();
        })
        .catch(handleError)
        .then(function(err) {
            if (typeof err !== "undefined") {
                return handleSignupPage(ctr);
            }
        });
}

function fillSignupPage(ctr) {
    if (debug) {
        console.log("[DEBUG] Fill signup page #" + ctr);
    }

    var _pass = password;
    var _nick = username + ctr;

    if (useRandomPassword) {
        _pass = randomPassword();
    }

    // Use nicknames list, or (username + number) combo?
    if (useNicknamesFile) {
        // Make sure we have a nickname left
        if (nicknames.length < 1) {
            throw Error("We're out of nicknames to use!");
        }

        // Get the first nickname off the list & use it
        _nick = nicknames.shift();
        console.log("Using next account from nicknames file: " + _nick);
    }

    // Fill it all in
    if (useAutoCatcha) {
        nightmare.evaluate(function(data) {
                document.getElementById("id_password").value = data.pass;
                document.getElementById("id_confirm_password").value = data.pass;
                document.getElementById("id_email").value = data.email_user === "" ? data.nick + "@" + data.email_domain : data.email_user + "+" + data.nick + "@" + data.email_domain;
                document.getElementById("id_confirm_email").value = data.email_user === "" ? data.nick + "@" + data.email_domain : data.email_user + "+" + data.nick + "@" + data.email_domain;
                document.getElementById("id_screen_name").value = data.nick;
                document.getElementById("id_username").value = data.nick;
                window.scrollTo(0, document.body.scrollHeight);
            }, {
                "pass": _pass,
                "nick": _nick,
                "email_user": email_user,
                "email_domain": email_domain
            })
            .check("#id_terms");


        nightmare.evaluate(function() {
            return document.getElementsByClassName("g-recaptcha")[0].getAttribute('data-sitekey');
        }).then(function(result) {
            console.log("Start recaptcha solving");

            request('http://2captcha.com/in.php?key=' + captchaApiKey + '&method=userrecaptcha&googlekey=' + result + '&pageurl=club.pokemon.com', function(error, response, body) {
                if (error) throw error;
                
                console.log("Checking status of captcha id: " + body.substring(3));

                var checkCaptcha = function() {
                    request('http://2captcha.com/res.php?key=' + captchaApiKey + '&action=get&id=' + body.substring(3), function(error, response, body) {
                        if (error) throw error;

                        if (body.substring(0, 2) == "OK") {
                            var captchaValidation = body.substring(3);
                            nightmare.evaluate(function(data) {
                                    document.getElementById("g-recaptcha-response").value = data.captchaValidation;
                                }, {
                                    captchaValidation: captchaValidation
                                })
                                .click('.button-green[value=" Continue"]')
                                .then(function() {
                                    nightmare.wait(function() {
                                            return (document.getElementById("signup-signin") !== null || document.getElementById("btn-reset") !== null || document.body.textContent.indexOf("That username already exists") > -1);
                                        })
                                        .evaluate(function() {
                                            return (document.body.textContent.indexOf("Hello! Thank you for creating an account!") > -1);
                                        })
                                        .then(function(success) {
                                            if (success) {
                                                // Log it in the file of used nicknames
                                                var content = outputFormat.replace('%NICK%', _nick).replace('%PASS%', _pass).replace('%LAT%', lat).replace('%LON%', lon).replace('%UN%', _nick);
                                                fs.appendFile(outputFile, content, function(err) {
                                                    if (err) throw err;
                                                });
                                            } else {
                                                console.log("[x] Failed username " + _nick);
                                            }

                                            if ((success && screenshotResult) || screenshotFail) {
                                                // Screenshot
                                                nightmare.screenshot(screenshotFolder + _nick + ".png");
                                            }

                                            // Next one, or stop
                                            if (ctr < end) {
                                                return function() {
                                                    createAccount(ctr + 1);
                                                };
                                            } else {
                                                return nightmare.end();
                                            }
                                        }).then(function(next) {
                                            return next();
                                        }).catch(handleError)
                                        .then(function(err) {
                                            if (typeof err !== "undefined") {
                                                return handleSignupPage(ctr);
                                            }
                                        });
                                });
                        } else {
                            // Not ready yet...
                            setTimeout(checkCaptcha, 2000);
                        }
                    });
                };
                setTimeout(checkCaptcha, 2000);
            });
        });
    } else {
        nightmare.evaluate(function(data) {
                document.getElementById("id_password").value = data.pass;
                document.getElementById("id_confirm_password").value = data.pass;
                document.getElementById("id_email").value = data.email_user === "" ? data.nick + "@" + data.email_domain : data.email_user + "+" + data.nick + "@" + data.email_domain;
                document.getElementById("id_confirm_email").value = data.email_user === "" ? data.nick + "@" + data.email_domain : data.email_user + "+" + data.nick + "@" + data.email_domain;
                document.getElementById("id_screen_name").value = data.nick;
                document.getElementById("id_username").value = data.nick;
                window.scrollTo(0, document.body.scrollHeight);
            }, {
                "pass": _pass,
                "nick": _nick,
                "email_user": email_user,
                "email_domain": email_domain
            })
            .check("#id_terms")
            .wait(function() {
                return (document.getElementById("signup-signin") !== null || document.getElementById("btn-reset") !== null || document.body.textContent.indexOf("That username already exists") > -1);
            })
            .evaluate(function() {
                return (document.body.textContent.indexOf("Hello! Thank you for creating an account!") > -1);
            })
            .then(function(success) {
                if (success) {
                    // Log it in the file of used nicknames
                    var content = outputFormat.replace('%NICK%', _nick).replace('%PASS%', _pass).replace('%LAT%', lat).replace('%LON%', lon).replace('%UN%', _nick);
                    fs.appendFile(outputFile, content, function(err) {
                        if (err) throw err;
                    });
                } else {
                    console.log("[x] Failed username " + _nick);
                }

                if ((success && screenshotResult) || screenshotFail) {
                    // Screenshot
                    nightmare.screenshot(screenshotFolder + _nick + ".png");
                }

                // Next one, or stop
                if (ctr < end) {
                    return function() {
                        createAccount(ctr + 1);
                    };
                } else {
                    return nightmare.end();
                }
            }).then(function(next) {
                return next();
            }).catch(handleError)
            .then(function(err) {
                if (typeof err !== "undefined") {
                    return handleSignupPage(ctr);
                }
            });
    }
}

// Evaluations
function evaluateDobPage() {
    var dob_value = document.getElementById("id_dob");
    return ((document.title === "The Official Pokémon Website | Pokemon.com") && (dob_value !== null));
}

function evaluateSignupPage() {
    var username_field = document.getElementById("id_username");
    return ((document.title === "The Official Pokémon Website | Pokemon.com") && (username_field !== null));
}


================================================
FILE: index.js.original
================================================
// Requires
var Nightmare = require('nightmare');
var nicknames = require('./nicknames.json');
var fs = require('fs');

// Settings
var debug = false;
var showWindow = true;

var start = START_NUM; // Start from x (NAMEx, EMAIL+x@domain.com)
var end = END_NUM;

var useNicknamesFile = false; // Use nicknames file, or just append numbers to username?
var useRandomPassword = false; // Generate a random password?
var screenshotResult = true; // Saves a screenshot per account creation if set to true
var screenshotOnFailure = true; // Saves a screenshot even if registration failed

var outputFile = "PogoPlayer/accounts.csv"; // File which will contain the generated "username password" combinations.
var outputFormat = "ptc,%NICK%,%PASS%,%LAT%,%LON%,%UN%\r\n"; // Format used to save the account data in outputFile. Supports %NICK%, %PASS%.
var screenshotFolder = "output/screenshots/";

var country = "US"; // Country code (e.g. BE, FR, US, CA)
var dob = "1990-01-01"; // Date of birth, yyyy-mm-dd
var username = "USERNAME_PH"; // User- & display name. Make sure any "(username + number)@domain.com" is 100% unique, and is 6 characters minimum, but under 14 characters after the numbers are applied.
var password = "PASSWORD_PH"; // Static password for all accounts. Ignored if useRandomPassword is true.
var email_user = "EMAIL_PH"; // If your email is email@domain.com, enter "email"
var email_domain = "DOMAIN_PH"; // Domain of e-mail host
var lat = "LATITUDE_PH" // Location Latitude for initial login
var lon = "LONGITUDE_PH" // Location Longitude for initial login

// App data
var url_ptc = "https://club.pokemon.com/us/pokemon-trainer-club/sign-up/";
var useragent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36";
var nightmare_opts = {
    show: showWindow,
    waitTimeout: 10000,
    gotoTimeout: 5000,
    loadTimeout: 5000
};
// Prints nice little message
console.log("ptc-acc-gen v1.4.1 by Sébastien Vercammen and Frost The Fox (and Github contribs)")


// Settings check
if (!useNicknamesFile && (username + end).length > 16) {
    console.log("Error: length of username + number can't be longer than 16 characters.");
    console.log("Please use a shorter nickname.");
    process.exit();
}

if ((email_user + '+' + username + end + '@' + email_domain).length > 75) {
    console.log("Error: length of e-mail address including the + trick can't be longer than 75 characters.");
    console.log("Please use a shorter e-mail address and/or nickname.");
    process.exit();
}

if (!useRandomPassword && password.length > 15) {
    console.log("Error: length of password can't be longer than 15 characters.");
    console.log("Please use a shorter password.");
    process.exit();
}

// LETSAHGO
var nightmare = Nightmare(nightmare_opts);
nightmare.useragent(useragent);

createAccount(start);

// Helpers

function handleError(err) {
    if(debug) {
        console.log("[DEBUG] Error:" + JSON.stringify(err));
    }
    
    return err;
}

function randomPassword() {
    return Math.random().toString(36).substr(2, 8);
}

function prepareNightmare(nightmare) {
    nightmare.useragent(useragent);
}

function randomPassword() {
    return Math.random().toString(36).substr(2, 8);
}

// Pages
function createAccount(ctr) {
    console.log("Creating account " + ctr + " of " + end);
    
    // Launch instance
    handleFirstPage(ctr);
}

// First page
function handleFirstPage(ctr) {
    if(debug) {
        console.log("[DEBUG] Handle first page #" + ctr);
    }
    
    nightmare.goto(url_ptc)
        .evaluate(evaluateDobPage)
        .then(function(validated)  {
            if(!validated) {
                // Missing form data, loop over itself
                console.log("[" + ctr + "] Servers are acting up... Trying again.");
                return function() { nightmare.wait(500).refresh().wait(); handleFirstPage(ctr); };
            } else {
                return function() { fillFirstPage(ctr); };
            }
        })
        .then(function(next) {
            // Handle next step: either a loop to first page in case of error, or form fill on success
            return next();
        })
        .catch(handleError)
        .then(function(err) {
            if (typeof err !== "undefined") {
                return handleFirstPage(ctr);
            }
        });
}

function fillFirstPage(ctr) {
    if(debug) {
        console.log("[DEBUG] Fill first page #" + ctr);
    }
    
    nightmare.evaluate(function(data) {
            document.getElementById("id_dob").value = data.dob;
            
            var els = document.getElementsByName("id_country");
            for(var i = 0; i < els.length; i++) {
                els[i].value = data.country;
            }
            
            return document.getElementById("id_dob").value;
        }, { dob: dob, country: country })
        .click("form[name='verify-age'] [type=submit]")
        .wait("#id_username")
        .then(function() {
            handleSignupPage(ctr);
        })
        .catch(handleError)
        .then(function(err) {
            if (typeof err !== "undefined") {
                return handleFirstPage(ctr);
            }
        });
}

// Signup page
function handleSignupPage(ctr) {
    if(debug) {
        console.log("[DEBUG] Handle second page #" + ctr);
    }
    
    nightmare.evaluate(evaluateSignupPage)
        .then(function(validated) {
            if(!validated) {
                // Missing form data, loop over itself
                console.log("[" + ctr + "] Servers are acting up... Trying again.");
                return function() { nightmare.wait(500).refresh().wait(); handleFirstPage(ctr); };
            } else {
                return function() { fillSignupPage(ctr); };
            }
        }).then(function(next) {
            // Handle next step: either a loop to first page in case of error, or form fill on success
            return next();
        })
        .catch(handleError)
        .then(function(err) {
            if (typeof err !== "undefined") {
                return handleSignupPage(ctr);
            }
        });
}

function fillSignupPage(ctr) {
    if(debug) {
        console.log("[DEBUG] Fill signup page #" + ctr);
    }
    
    var _pass = password;
    var _nick = username + ctr;
    
    if(useRandomPassword) {
        _pass = randomPassword();
    }
    
    // Use nicknames list, or (username + number) combo?
    if(useNicknamesFile) {
        // Make sure we have a nickname left
        if(nicknames.length < 1) {
            throw Error("We're out of nicknames to use!");
        }
        
        // Get the first nickname off the list & use it
        _nick = nicknames.shift();
    }
    
    // Fill it all in
    nightmare.evaluate(function(data) {
            document.getElementById("id_password").value = data.pass;
            document.getElementById("id_confirm_password").value = data.pass;
            document.getElementById("id_email").value = data.email_user + "+" + data.nick + "@" + data.email_domain;
            document.getElementById("id_confirm_email").value = data.email_user + "+" + data.nick + "@" + data.email_domain;
            document.getElementById("id_screen_name").value = data.nick;
            document.getElementById("id_username").value = data.nick;
		window.scrollTo(0,document.body.scrollHeight);
        }, { "pass": _pass, "nick": _nick, "email_user": email_user, "email_domain": email_domain })
        .check("#id_terms")
        .wait(function() {
            return (document.getElementById("signup-signin") !== null || document.getElementById("btn-reset") !== null || document.body.textContent.indexOf("That username already exists") > -1);
        })
        .evaluate(function() {
            return (document.body.textContent.indexOf("Hello! Thank you for creating an account!") > -1);
        })
        .then(function(success) {
            if(success) {
                // Log it in the file of used nicknames
                var content = outputFormat.replace('%NICK%', _nick).replace('%PASS%', _pass).replace('%LAT%', lat).replace('%LON%', lon).replace('%UN%', _nick);
                fs.appendFile(outputFile, content, function(err) {
                    //
                });
            }
            
            if((success && screenshotResult) || screenshotOnFailure) {
                // Screenshot
                nightmare.screenshot(screenshotFolder + _nick + ".png");
            }
            
            // Next one, or stop
            if(ctr < end) {
                return function() { createAccount(ctr + 1); };
            } else {
                return nightmare.end();
            }
        }).then(function(next) {
            return next();
        }).catch(handleError)
        .then(function(err) {
            if (typeof err !== "undefined") {
                return handleSignupPage(ctr);
            }
        });
}

// Evaluations
function evaluateDobPage() {
    var dob_value = document.getElementById("id_dob");
    return ((document.title === "The Official Pokémon Website | Pokemon.com") && (dob_value !== null));
}

function evaluateSignupPage() {
    var username_field = document.getElementById("id_username");
    return ((document.title === "The Official Pokémon Website | Pokemon.com") && (username_field !== null));
}


================================================
FILE: install.bat
================================================
@echo off
git --version
if not "%errorlevel%" == "0" (
	echo git is currently not installed, or has not been added to your system PATH
	echo please install git, or if git is already installed, run:
	echo setx PATH "%PATH%,C:\Program Files\Git\mingw64\libexec\git-core"
	echo If using 32-bit or alternate install path, replace your git path in the above command
	pause
) else (
	echo attempting to clone PogoPlayer
	git submodule init 2>&1 >NUL
	git submodule update 2>&1 >NUL
	if not "%errorlevel%" == "0" (
		echo submodule install failed.
		echo Maybe try cloning recursively?
		echo git clone --recursive https://github.com/sebastienvercammen/ptc-acc-gen.git
	) else (
		node --version >NUL
		if "%errorlevel%" == "9009" (
			echo NodeJS is not currently installed correctly. Please install that, then run "npm install" from your PokemonGo-Map folder.
		) else (
			echo NodeJS installed, proceeding with installation
			npm install
		)
	)
)
python config.py
pause


================================================
FILE: install.sh
================================================
#!/bin/bash
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y libnss3-dev libxss1 git
which git 2>&1 >/dev/null
if [ $? -ne 0 ] ; then
        echo git is not currently installed
        echo Please install git before proceeding
	else
		git submodule init
		git submodule update
	if [ $? -ne 0 ] ; then
			echo submodule install failed.
			echo Maybe try cloning recursively?
			echo git clone --recursive https://github.com/sebastienvercammen/ptc-acc-gen.git
	fi
		sudo apt-get update 2> /dev/null
		sudo apt-get install -y nodejs nodejs-legacy
	if [ $? -ne 0 ] ; then
			echo depenencies install failed. Please use the installer of your choice to grab them
			echo examples:
			echo apt-get install npm nodejs
			echo yum install npm nodejs
		else
			sudo npm install
	fi
fi
python config.py


================================================
FILE: makeaccounts.bat
================================================
@echo off
node index.js
cd PogoPlayer
node pogo.js
echo "Find the generated accounts in PogoPlayer/accounts.csv"
pause


================================================
FILE: makeaccounts.sh
================================================
#!/bin/bash
# fuck headless systems, we got a captcha now
node index.js
cd PogoPlayer
node pogo.js
echo "Find the generated accounts in PogoPlayer/accounts.csv"


================================================
FILE: nicknames.json
================================================
[
    "uniqueuser159",
    "betteruser933"
]

================================================
FILE: output/screenshots/.gitkeep
================================================



================================================
FILE: package.json
================================================
{
  "name": "nintendo-ptc-account-generator",
  "version": "2.8.0",
  "description": "An automation script based on NodeJS that can create any number of Nintendo Pokémon Trainer Club (PTC) accounts with a single e-mail address.",
  "main": "index.js",
  "scripts": {
    "test": "jshint index.js config.js"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/sebastienvercammen/ptc-acc-gen.git"
  },
  "license": "MIT",
  "keywords": [
    "nintendo",
    "ptc",
    "pokemon",
    "pokemongo",
    "accounts",
    "generator"
  ],
  "author": "Frost The Fox, originally Sébastien Vercammen",
  "dependencies": {
    "minimist": "^1.2.0",
    "nightmare": "^2.6.0",
    "pogobuf": "^1.8.0",
    "request": "^2.79.0"
  }
}
Download .txt
gitextract_o08qxupu/

├── .gitattributes
├── .gitignore
├── .gitmodules
├── .travis.yml
├── LICENSE.md
├── README.md
├── config.js
├── config.py
├── gmailverify.js
├── index.js
├── index.js.original
├── install.bat
├── install.sh
├── makeaccounts.bat
├── makeaccounts.sh
├── nicknames.json
├── output/
│   └── screenshots/
│       └── .gitkeep
└── package.json
Download .txt
SYMBOL INDEX (21 symbols across 3 files)

FILE: config.py
  function signal_handler (line 11) | def signal_handler(signal, frame):
  function printmenu (line 15) | def printmenu():
  function configBuilder (line 42) | def configBuilder():
  function updating (line 169) | def updating(filename,dico):
  function cleanExit (line 183) | def cleanExit(message):

FILE: gmailverify.js
  function myFunction (line 18) | function myFunction() {

FILE: index.js
  function containsUppercase (line 103) | function containsUppercase(txt) {
  function containsSymbol (line 107) | function containsSymbol(txt) {
  function handleError (line 113) | function handleError(err) {
  function getRandomInt (line 121) | function getRandomInt(min, max) {
  function getRandomNumbers (line 125) | function getRandomNumbers(length) {
  function getRandomSymbols (line 129) | function getRandomSymbols(length) {
  function randomPassword (line 139) | function randomPassword() {
  function prepareNightmare (line 144) | function prepareNightmare(nightmare) {
  function createAccount (line 149) | function createAccount(ctr) {
  function handleFirstPage (line 157) | function handleFirstPage(ctr) {
  function fillFirstPage (line 190) | function fillFirstPage(ctr) {
  function handleSignupPage (line 222) | function handleSignupPage(ctr) {
  function fillSignupPage (line 253) | function fillSignupPage(ctr) {
  function evaluateDobPage (line 425) | function evaluateDobPage() {
  function evaluateSignupPage (line 430) | function evaluateSignupPage() {
Condensed preview — 18 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (51K chars).
[
  {
    "path": ".gitattributes",
    "chars": 380,
    "preview": "# Auto detect text files and perform LF normalization\n* text eol=lf\n\n# Custom for Visual Studio\n*.cs     diff=csharp\n\n# "
  },
  {
    "path": ".gitignore",
    "chars": 149,
    "preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Dependency directories\nnode_modules\njspm_packages\n\n# Optional npm cache directory\n.n"
  },
  {
    "path": ".gitmodules",
    "chars": 104,
    "preview": "[submodule \"PogoPlayer\"]\n\tpath = PogoPlayer\n\turl = https://github.com/sebastienvercammen/PogoPlayer.git\n"
  },
  {
    "path": ".travis.yml",
    "chars": 126,
    "preview": "language: node_js\nnode_js:\n  - \"node\"\n  - \"6.1\"\ninstall:\n  - npm install\n  - npm install jshint\nnotifications:\n  email: "
  },
  {
    "path": "LICENSE.md",
    "chars": 1094,
    "preview": "MIT License\n\nCopyright (c) 2017 Frost The Fox and Sébastien Vercammen\n\nPermission is hereby granted, free of charge, to "
  },
  {
    "path": "README.md",
    "chars": 6160,
    "preview": "# Nintendo PTC Account Generator [![Build Status](https://travis-ci.org/sebastienvercammen/ptc-acc-gen.svg?branch=master"
  },
  {
    "path": "config.js",
    "chars": 1504,
    "preview": "var config = {\n    // Starts gen from startNumber to endNumber, determining how many accounts are made\n    startNum: 0,\n"
  },
  {
    "path": "config.py",
    "chars": 7919,
    "preview": "#!/usr/bin/python\n# Version 1\n\nimport os\nimport sys\nimport signal\nimport re\nfrom os import fsync\n\n\ndef signal_handler(si"
  },
  {
    "path": "gmailverify.js",
    "chars": 1928,
    "preview": "/*\n  Automatically click all \"Verify your email\" links in the welcome e-mail from\n  Nintendo Pokémon Trainer Club's sign"
  },
  {
    "path": "index.js",
    "chars": 17037,
    "preview": "/*jshint sub:true*/\n// Requires\nvar Nightmare = require('nightmare');\nvar nicknames = require('./nicknames.json');\nvar f"
  },
  {
    "path": "index.js.original",
    "chars": 9380,
    "preview": "// Requires\nvar Nightmare = require('nightmare');\nvar nicknames = require('./nicknames.json');\nvar fs = require('fs');\n\n"
  },
  {
    "path": "install.bat",
    "chars": 968,
    "preview": "@echo off\ngit --version\nif not \"%errorlevel%\" == \"0\" (\n\techo git is currently not installed, or has not been added to yo"
  },
  {
    "path": "install.sh",
    "chars": 831,
    "preview": "#!/bin/bash\ncurl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -\nsudo apt-get install -y libnss3-dev libxss1 g"
  },
  {
    "path": "makeaccounts.bat",
    "chars": 119,
    "preview": "@echo off\nnode index.js\ncd PogoPlayer\nnode pogo.js\necho \"Find the generated accounts in PogoPlayer/accounts.csv\"\npause\n"
  },
  {
    "path": "makeaccounts.sh",
    "chars": 161,
    "preview": "#!/bin/bash\n# fuck headless systems, we got a captcha now\nnode index.js\ncd PogoPlayer\nnode pogo.js\necho \"Find the genera"
  },
  {
    "path": "nicknames.json",
    "chars": 44,
    "preview": "[\n    \"uniqueuser159\",\n    \"betteruser933\"\n]"
  },
  {
    "path": "output/screenshots/.gitkeep",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "package.json",
    "chars": 743,
    "preview": "{\n  \"name\": \"nintendo-ptc-account-generator\",\n  \"version\": \"2.8.0\",\n  \"description\": \"An automation script based on Node"
  }
]

About this extraction

This page contains the full source code of the FrostTheFox/ptc-acc-gen GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 18 files (47.5 KB), approximately 11.3k tokens, and a symbol index with 21 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!