Skip to content

Commit

Permalink
Fix everything. Reverting to last good commit. fuck git.
Browse files Browse the repository at this point in the history
  • Loading branch information
FrostTheFox committed Aug 27, 2016
1 parent 7c1db12 commit 93628de
Show file tree
Hide file tree
Showing 16 changed files with 796 additions and 0 deletions.
17 changes: 17 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Auto detect text files and perform LF normalization
* text=auto

# 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
13 changes: 13 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Logs
logs
*.log
npm-debug.log*

# Dependency directories
node_modules
jspm_packages

# Optional npm cache directory
.npm

output/screenshots/*.png
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "PogoPlayer"]
path = PogoPlayer
url = https://github.com/MRokas/PogoPlayer.git
21 changes: 21 additions & 0 deletions LICENSE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2016 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.
102 changes: 102 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# Nintendo PTC Account Generator

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

**Please be sure to clone RECURSIVELY**
example: git clone --recursive https://github.com/FrostTheFox/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 protected]" e-mail tricks, where the e-mail host completely ignores any part after (and including) the plus sign and sends it to "[email protected]".

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 this gist: https://gist.github.com/sebastienvercammen/e7e0e9e57db246d7f941b789d8508186
or
https://github.com/FrostTheFox/ptc-acc-gen/blob/master/gmailverify.js


The new version on Nightmare.js now:

* Checks for usernames/e-mails that are already taken
* Can screenshot the result page
* 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:

New beta install script! try running "install.bat" (and tell pyr0ball if something doesn't work)
- If using the install script, you can simply run makeaccounts.bat afterwards.


1. Make sure you clone recursively (git clone --recursive [origin])
- if you download the zip, make sure you also download the submodule PogoPlayer
- or do it the easy way with `git submodule init && git submodule update`
- if you cloned non-recursively, run install.bat.
2. Install requirements with `npm install`
3. Edit config.js if not using the install.bat or config.py.
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.

Linux Instructions:
***Headless systems will no longer be able to use the gen due to the captcha requirement.***

1. Run `install.sh`
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.


***Note: Messages about trainer name usually are not a problem and you generally shouldn't be concerned by them.***


## 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 protected] you'd enter 'email'
emailDomain: 'domain.com', // Domain of email address. If your address is [email protected] 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.
33 changes: 33 additions & 0 deletions config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
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. Make sure any "(username + number)@domain.com" is 100% unique, and is 6 characters minimum, but under 14 characters after the numbers are applied.
username:"CHANGEME",
// If you set randomPassword to 'false' above change this to your chosen password (so you have same password for all accounts)
password:"CHANGEME",
// Enter your email address name. If your address is email@domain.com you'd enter 'email'
emailUser:"email",
// Domain of email address. If your address is email@domain.com you'd enter 'domain.com'
emailDomain:"gmail.com",
// Location Latitude for initial login
latitude:"36.54596",
// Location Longitude for initial login
longitude:"-79.22247",
// Country code (e.g. BE, FR, US, CA)
country:"US"
};

module.exports = config;
188 changes: 188 additions & 0 deletions config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
#!/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 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: gmail.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()
Loading

0 comments on commit 93628de

Please sign in to comment.