├── .gitignore ├── README.md ├── Penguin ├── __init__.py ├── Crypto.py ├── Parser.py ├── ClubPenguin.py └── Penguin.py ├── AccountGenerator.py └── Servers.ini /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | View post on Rile5: http://rile5.com/topic/38164-cp-follow-bot-python-penguin 2 | 3 | 4 | -------------------------------------------------------------------------------- /Penguin/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | # Just sets up logging, nothing to do with the networking aspect of this library 4 | logger = logging.getLogger("Penguin") 5 | logger.setLevel(logging.DEBUG) 6 | 7 | formatter = logging.Formatter("%(asctime)s %(levelname)s: %(message)s", "%I:%M:%S") 8 | 9 | streamHandler = logging.StreamHandler() 10 | 11 | streamHandler.setFormatter(formatter) 12 | logger.addHandler(streamHandler) -------------------------------------------------------------------------------- /Penguin/Crypto.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | 3 | class Crypto: 4 | 5 | @staticmethod 6 | def encryptPassword(password): 7 | hash = hashlib.md5(password.encode('utf-8')).hexdigest() 8 | swappedHash = hash[16:32] + hash[0:16] 9 | 10 | return swappedHash 11 | 12 | @staticmethod 13 | def getLoginHash(password, rndK): 14 | key = Crypto.encryptPassword(password).upper() 15 | key += rndK 16 | key += "a1ebe00441f5aecb185d0ec178ca2305Y(02.>'H}t\":E1_root" 17 | 18 | hash = Crypto.encryptPassword(key) 19 | 20 | return hash -------------------------------------------------------------------------------- /Penguin/Parser.py: -------------------------------------------------------------------------------- 1 | from collections import deque 2 | 3 | class Parser: 4 | 5 | @staticmethod 6 | def isValid(data): 7 | parsed = Parser.parseRaw(data) 8 | 9 | if data.startswith("%xt%") and len(parsed) >= 3: 10 | return True 11 | else: 12 | return False 13 | 14 | @staticmethod 15 | def parseRaw(data): 16 | parsed = deque(data.split("%")) 17 | parsed.popleft() 18 | parsed.pop() 19 | 20 | return parsed 21 | 22 | @staticmethod 23 | def parseVertical(data): 24 | parsed = data.split("|") 25 | 26 | return parsed -------------------------------------------------------------------------------- /Penguin/ClubPenguin.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from collections import deque 3 | from ConfigParser import ConfigParser 4 | 5 | from twisted.internet import reactor 6 | from twisted.internet.protocol import ClientFactory 7 | 8 | from Penguin import Chinstrap 9 | from Penguin import Penguin 10 | 11 | # Creates client objects for initial handshake 12 | class ClubPenguin(ClientFactory): 13 | 14 | """ 15 | The address of the login-server the client will connect to. 16 | """ 17 | serverAddress = "204.75.167.165:3724" 18 | 19 | def __init__(self): 20 | self.logger = logging.getLogger("Penguin") 21 | 22 | self.penguinFactory = PenguinFactory() 23 | 24 | self.queue = deque() 25 | 26 | def changeLoginServer(self, ip, port): 27 | self.serverAddress = "%s:%d" % ip, port 28 | 29 | def connect(self, **player): 30 | if "factory" not in player: 31 | player["factory"] = self.penguinFactory 32 | 33 | self.queue.append(player) 34 | 35 | ip, port = self.serverAddress.split(":") 36 | 37 | reactor.connectTCP(ip, int(port), self) 38 | 39 | def buildProtocol(self, address): 40 | player = self.queue.pop() 41 | 42 | loginInstance = Chinstrap(player) 43 | 44 | # Give the PenguinFactory instance an attribute 45 | loginInstance.factory = player["factory"] 46 | 47 | return loginInstance 48 | 49 | def clientConnectionLost(self, connector, reason): 50 | pass 51 | 52 | def clientConnectionFailed(self, connector, reason): 53 | self.logger.error("Connection failed: " + str(reason)) 54 | 55 | def start(self): 56 | reactor.run() 57 | 58 | class PenguinFactory(ClientFactory, object): 59 | 60 | # Used to track the status of current penguins (not currently used?) 61 | penguins = {} 62 | 63 | def __init__(self): 64 | self.logger = logging.getLogger("Penguin") 65 | 66 | self.servers = ConfigParser() 67 | self.servers.read(["Servers.ini"]) 68 | 69 | self.queue = deque() 70 | 71 | # TODO: Add penguin to "penguins" dictionary! 72 | def connect(self, player): 73 | serverName = player.get("server") 74 | 75 | address = self.servers.get(serverName, "IP") 76 | port = self.servers.get(serverName, "Port") 77 | 78 | self.queue.append(player) 79 | 80 | reactor.connectTCP(address, int(port), self) 81 | 82 | def buildProtocol(self, address): 83 | player = self.queue.pop() 84 | 85 | penguin = Penguin(player) 86 | 87 | return penguin 88 | 89 | def clientConnectionFailed(self, connector, reason): 90 | self.logger.error("Connection failed: " + str(reason)) -------------------------------------------------------------------------------- /AccountGenerator.py: -------------------------------------------------------------------------------- 1 | from string import join 2 | from random import choice, randrange 3 | from urllib import urlencode 4 | from urllib2 import urlopen, Request, HTTPError 5 | from bs4 import BeautifulSoup 6 | from threading import Thread 7 | import requests 8 | 9 | 10 | class AccountGenerator(Thread): 11 | header = { 12 | "User-Agent": "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11" 13 | } 14 | 15 | def __init__(self): 16 | super(AccountGenerator, self).__init__() 17 | 18 | self.email = "random" 19 | self.name = "random" 20 | self.pw = "penguin88" 21 | self.color = randrange(1, 12) 22 | 23 | def run(self): 24 | self.loadCaptchas() 25 | self.registerPenguin() 26 | 27 | def loadCaptchas(self): 28 | self.captchas = {} 29 | self.captchas["watermelon"] = "ARRB8J8KQ9t7AAAAAElFTkSuQmCC" 30 | self.captchas["balloon"] = "wuWB85cW2c5NQAAAABJRU5ErkJggg==" 31 | self.captchas["pizza"] = "XMAAAAASUVORK5CYII=" 32 | self.captchas["popcorn"] = "yat7sdCF61QAAAABJRU5ErkJggg==" 33 | self.captchas["igloo"] = "b+T94dZQb+IAAAAASUVORK5CYII=" 34 | self.captchas["cheese"] = "B0eBprJbn4wXAAAAAElFTkSuQmCC" 35 | 36 | def registerPenguin(self): 37 | self.getRegisterData() 38 | 39 | if self.name == "random": 40 | self.name = self.genRandomString(8) 41 | 42 | if self.email == "random": 43 | self.email = self.genRandomString(8) + "@gmail.com" 44 | 45 | print "[{0}] Registering... ".format(self.name) 46 | 47 | try: 48 | data = { 49 | "anon_token": self.anonToken, 50 | "color": str(self.color), 51 | "name": self.name, 52 | "pass": self.pw, 53 | "pass_show": "1", 54 | "email": self.email, 55 | "terms": "1", 56 | "captcha": str(self.captchaN), 57 | "op":"Create Your Penguin", 58 | "form_build_id": self.formBuildId, 59 | "form_id": "penguin_create_form" 60 | } 61 | 62 | request = Request("https://secured.clubpenguin.com/penguin/create", urlencode(data), self.header) 63 | response = urlopen(request) 64 | 65 | htmlData = response.read() 66 | soup = BeautifulSoup(htmlData, "html.parser") 67 | 68 | setCookieResponse = response.info().getheader("Set-Cookie") 69 | response.close() 70 | 71 | if setCookieResponse != None: 72 | print "[{0}] Registration successful".format(self.name) 73 | with open("accounts.txt", "a") as file: 74 | file.write("{0}:{1}\n".format(self.name, self.pw)) 75 | 76 | except HTTPError, err: 77 | if err.code == 403: 78 | print "[{0}] Registration successful".format(self.name) 79 | with open("accounts.txt", "a") as file: 80 | file.write("{0}:{1}\n".format(self.name, self.pw)) 81 | else: 82 | raise 83 | 84 | 85 | def getRegisterData(self): 86 | request = Request("https://secured.clubpenguin.com/penguin/create", headers=self.header) 87 | response = urlopen(request) 88 | 89 | cookie = response.info().getheader("Set-Cookie") 90 | htmlData = response.read() 91 | 92 | response.close() 93 | 94 | soup = BeautifulSoup(htmlData, "html.parser") 95 | 96 | itemName = self.findBetween(htmlData, "item_name\":\"", "\","); 97 | image1 = self.findBetween(htmlData, "\"images\":{\"1\":\"", "\","); 98 | image1 = image1.rsplit('/',1)[-1] 99 | 100 | image2 = self.findBetween(htmlData, image1 + "\",\"2\":\"", "\","); 101 | image2 = image2.rsplit('/',1)[-1] 102 | 103 | image3 = self.findBetween(htmlData, image2 + "\",\"3\":\"", "\""); 104 | image3 = image3.rsplit('/',1)[-1] 105 | 106 | itemImage = self.captchas[itemName] 107 | if(image1 == itemImage): 108 | self.captchaN = 0 109 | elif(image2 == itemImage): 110 | self.captchaN = 1 111 | elif(image3 == itemImage): 112 | self.captchaN = 2 113 | 114 | self.anonToken = soup.find("input", {"name": "anon_token"})["value"] 115 | self.formBuildId = soup.find("input", {"name": "form_build_id"})["value"] 116 | 117 | randomString = self.genRandomString() 118 | 119 | self.header["Cookie"] = "{0} playspanTRANSID=arthur-{1}; cpBROWSERID=vortexal-{1};".format(cookie, randomString) 120 | self.header["Origin"] = "https://secured.clubpenguin.com" 121 | self.header["Referer"] = "https://secured.clubpenguin.com/penguin/create" 122 | 123 | def findBetween(self, s, first, last): 124 | try: 125 | start = s.index(first) + len(first) 126 | end = s.index(last, start) 127 | return s[start:end] 128 | except ValueError: 129 | return "" 130 | 131 | def safeFind(self, str, value): 132 | try: 133 | jsonObj = json.loads(str) 134 | return jsonObj[value] 135 | except ValueError, e: 136 | return False 137 | return False 138 | 139 | def genRandomString(self, length=8): 140 | return join((choice("qwertyuiopasdfghjklzxcvbnm") for _ in range(length)), "") 141 | 142 | print """ 143 | =+= Account Generator =+= 144 | Stores generated accounts in 'accounts.txt' file 145 | 146 | 147 | """ 148 | 149 | amt = input("Enter the amount of penguins you wish to generate: ") 150 | 151 | for i in range(int(amt)): 152 | a = AccountGenerator() 153 | a.start() 154 | -------------------------------------------------------------------------------- /Penguin/Penguin.py: -------------------------------------------------------------------------------- 1 | import json 2 | import logging 3 | from time import sleep 4 | from urllib2 import Request, urlopen 5 | 6 | from lxml import etree 7 | from twisted.internet import defer, reactor 8 | from twisted.protocols.basic import LineReceiver 9 | 10 | from Crypto import Crypto 11 | from Parser import Parser 12 | 13 | class Spheniscidae(object, LineReceiver): 14 | 15 | delimiter = "\x00" 16 | 17 | # Used for caching phrase ids 18 | phrases = {} 19 | 20 | def __init__(self, player): 21 | self.logger = logging.getLogger("Penguin") 22 | 23 | for attribute in player: 24 | setattr(self, attribute, player[attribute]) 25 | 26 | self.listeners = { 27 | "l": [self._handleLogin] 28 | } 29 | 30 | def connectionMade(self): 31 | # self.send("") 32 | self.send("") 33 | self.send("") 34 | 35 | """ 36 | Parses XML and world-server data and calls functions to handle the data. 37 | """ 38 | def lineReceived(self, data): 39 | #self.logger.info("Received data: " + data) 40 | 41 | if data.startswith("<"): 42 | data = etree.fromstring(data)[0] 43 | 44 | if data.get("action") == "rndK": 45 | self.randomKey = data.findtext("k") 46 | 47 | self.sendLogin() 48 | 49 | # World-server data is handled separately 50 | elif data.startswith("%"): 51 | if Parser.isValid(data): 52 | data = Parser.parseRaw(data) 53 | handler = data[1] 54 | 55 | if handler in self.listeners: 56 | for handlerCallback in self.listeners[handler]: 57 | handlerCallback(data) 58 | """ 59 | Adds a "listener" to the listeners' dictionary. 60 | 61 | A listener is basically a function that's called whenever is specific-type of packet is received. 62 | By default, the dictionary contains listeners for essential functionality such as logging in, 63 | joining a server, and joining a room. 64 | 65 | (As of now, it only contains one for logging in - "l") 66 | 67 | Here's an example of how you'd invoke this method: 68 | self.addListener("gi", self.handleGetInventory) 69 | 70 | The first parameter is the "id" of the packet -in this case, it's "gi". The "gi" packet contains 71 | the ids of the items the player owns. 72 | 73 | The second is simply the function that will handle that packet when it's received. 74 | 75 | Each packet can have an unlimited amount of listeners. 76 | """ 77 | def addListener(self, handler, callback): 78 | if handler not in self.listeners: 79 | self.listeners[handler] = [callback] 80 | else: 81 | self.listeners[handler].append(callback) 82 | 83 | return self # For chaining 84 | 85 | """ 86 | Just 'cause it's shorter and everyone in the community is probably more used to it. 87 | It automatically appends the null-byte to the end of the outgoing data. 88 | """ 89 | def send(self, data): 90 | #elf.logger.debug("Sending %s", data) 91 | self.sendLine(data) 92 | 93 | class Chinstrap(Spheniscidae): 94 | 95 | def __init__(self, player): 96 | super(Chinstrap, self).__init__(player) 97 | 98 | self.player = player 99 | 100 | def sendLogin(self): 101 | loginHash = Crypto.getLoginHash(self.password, self.randomKey) 102 | 103 | self.send( 104 | "" 105 | "" 106 | "" 107 | "" 108 | ); 109 | 110 | def _handleLogin(self, data): 111 | rawPlayerString = data[3] 112 | rawPlayer = Parser.parseVertical(rawPlayerString) 113 | 114 | self.player["rawPlayerString"] = rawPlayerString 115 | self.player["rawPlayer"] = rawPlayer 116 | 117 | self.player["playerId"] = rawPlayer[0] 118 | self.player["loginKey"] = rawPlayer[3] 119 | self.player["confirmationHash"] = data[4] 120 | 121 | self.factory.connect(self.player) 122 | 123 | self.transport.loseConnection() 124 | 125 | class Penguin(Spheniscidae): 126 | 127 | internalRoomId = "-1" 128 | 129 | def __init__(self, player): 130 | super(Penguin, self).__init__(player) 131 | 132 | self.addListener("jr", self._handleJoinRoom) 133 | 134 | def sendLogin(self): 135 | passwordHash = Crypto.encryptPassword(self.loginKey + self.randomKey) + self.loginKey 136 | 137 | self.send( 138 | "" 139 | "" 140 | "" 141 | "" 142 | ) 143 | 144 | def _handleLogin(self, data): 145 | self.logger.info("A bot logged on") 146 | 147 | self.sendXt("s", "j#js", self.playerId, self.loginKey, "en") 148 | self.sendXt("s", "g#gi") 149 | 150 | # For now, this is literally all it does 151 | def _handleJoinRoom(self, data): 152 | self.internalRoomId = data[2] 153 | 154 | """ 155 | Usage example 156 | self.sendXt("s", "i#ai", 413) = %xt%s%i#ai%2%413% 157 | 158 | This method can probably be improved. 159 | """ 160 | def sendXt(self, category, id, *args): 161 | # Makes sure that all of the values in *args are strings 162 | parameters = "%".join(str(x) for x in args) 163 | parameters = self.internalRoomId + "%" + parameters 164 | 165 | data = "%xt%" + category + "%" + id + "%" + parameters + "%" 166 | self.send(data) 167 | 168 | # Tasks 169 | 170 | def buyInventory(self, id): 171 | self.sendXt("s", "i#ai", id) 172 | 173 | def sendPosition(self, x, y): 174 | self.sendXt("s", "u#sp", x, y) 175 | 176 | def joinRoom(self, id, x=0, y=0): 177 | self.sendXt("s", "j#jr", id, x, y) 178 | 179 | def findBuddy(self, id): 180 | self.sendXt("s", "u#bf", id) 181 | 182 | def sendFrame(self, id): 183 | self.sendXt("s", "u#sf", id) 184 | 185 | def sendEmote(self, id): 186 | self.sendXt("s", "u#se", id) 187 | 188 | def sendSnowball(self, x, y): 189 | self.sendXt("s", "u#sb", x, y) 190 | 191 | def sendAction(self, id): 192 | self.sendXt("s", "u#sa", id) 193 | 194 | def sendSafeMessage(self, id): 195 | self.sendXt("s", "u#ss", id) 196 | 197 | def sendJoke(self, id): 198 | self.sendXt("s", "u#sj", id) 199 | 200 | # Doesn't (always?) work 201 | def sendMessage(self, msg): 202 | self.sendXt("s", "m#sm", msg) 203 | 204 | # To be used in conjunction with getPhraseId 205 | def sendPhrase(self, id): 206 | self.sendXt("s", "m#pcam", id) 207 | 208 | def getPlayerInfoByName(self, name): 209 | self.sendXt("s", "u#pbn", name) 210 | 211 | """ 212 | Retrieves phrase chat id of msg for use with the pcam packet. 213 | Do NOT call this method directly; use getPhraseId instead. 214 | """ 215 | def retrievePhraseId(self, d, msg): 216 | data = { 217 | "language": "en", 218 | "original_text": msg, 219 | "product": "pen" 220 | } 221 | 222 | headers = { 223 | "Authorization": "FD 08306ECE-C36C-4939-B65F-4225F37BD296:905664F40E29B95CF5810B2ACA85497C7430BB1498E74B52", 224 | "Referer": "http://media1.clubpenguin.com/play/v2/client/phrase_autocomplete.swf?clientVersion=19313" 225 | } 226 | 227 | req = Request("https://api.disney.com/social/autocomplete/v2/search/messages", json.dumps(data), headers) 228 | 229 | try: 230 | handler = urlopen(req) 231 | response = handler.read() 232 | id = json.loads(response)["id"] 233 | 234 | d.callback((id, msg)) 235 | except Exception as ex: 236 | d.errback(ex) 237 | 238 | """ 239 | Creates a deferred thread then calls retrievePhraseId. 240 | The thread's object is returned so that the end-user may 241 | attach callbacks to it. 242 | """ 243 | def getPhraseId(self, msg): 244 | d = defer.Deferred() 245 | reactor.callWhenRunning(self.retrievePhraseId, d, msg) 246 | 247 | return d 248 | 249 | # Caches the result and sends the phrase 250 | def receivedPhraseId(self, result): 251 | id, msg = result 252 | 253 | if msg not in self.phrases: 254 | self.phrases[msg] = id 255 | 256 | self.sendPhrase(id) 257 | 258 | # Just in case something goes wrong while fetching the id 259 | def failedPhraseId(self, ex): 260 | errorMessage = str(ex) 261 | 262 | self.logger.error("Failed to retrieve phrase id: {0}".format(errorMessage)) 263 | 264 | """ 265 | Sends the phrase if it's cached. If it isn't, we retrieve it, then 266 | send it. It also gets cached so that we don't have to do it again. 267 | """ 268 | def sendPhraseMessage(self, msg): 269 | if msg not in self.phrases: 270 | d = self.getPhraseId(msg) 271 | d.addCallback(self.receivedPhraseId) 272 | d.addErrback(self.failedPhraseId) 273 | else: 274 | id = self.phrases[msg] 275 | self.sendPhrase(id) 276 | -------------------------------------------------------------------------------- /Servers.ini: -------------------------------------------------------------------------------- 1 | [Blizzard] 2 | id = 3100 3 | ip = 204.75.167.9 4 | port = 3724 5 | 6 | [Ice Berg] 7 | id = 3101 8 | ip = 204.75.167.22 9 | port = 3724 10 | 11 | [White Out] 12 | id = 3102 13 | ip = 204.75.167.50 14 | port = 9875 15 | 16 | [Slushy] 17 | id = 3103 18 | ip = 204.75.167.31 19 | port = 9875 20 | 21 | [Flurry] 22 | id = 3104 23 | ip = 204.75.167.12 24 | port = 6112 25 | 26 | [Snow Angel] 27 | id = 3105 28 | ip = 204.75.167.38 29 | port = 3724 30 | 31 | [Snow Day] 32 | id = 3106 33 | ip = 204.75.167.35 34 | port = 6112 35 | 36 | [Frostbite] 37 | id = 3107 38 | ip = 204.75.167.15 39 | port = 9875 40 | 41 | [Icicle] 42 | id = 3108 43 | ip = 204.75.167.28 44 | port = 6112 45 | 46 | [Tundra] 47 | id = 3109 48 | ip = 204.75.167.12 49 | port = 3724 50 | 51 | [Snow Cone] 52 | id = 3110 53 | ip = 204.75.167.10 54 | port = 6112 55 | 56 | [Alpine] 57 | id = 3111 58 | ip = 204.75.167.12 59 | port = 9875 60 | 61 | [Ice Breaker] 62 | id = 3112 63 | ip = 204.75.167.13 64 | port = 3724 65 | 66 | [Snow Globe] 67 | id = 3113 68 | ip = 204.75.167.13 69 | port = 6112 70 | 71 | [Snow Fort] 72 | id = 3114 73 | ip = 204.75.167.13 74 | port = 9875 75 | 76 | [Mammoth] 77 | id = 3115 78 | ip = 204.75.167.14 79 | port = 3724 80 | 81 | [Grizzly] 82 | id = 3116 83 | ip = 204.75.167.14 84 | port = 6112 85 | 86 | [Winter Land] 87 | id = 3117 88 | ip = 204.75.167.14 89 | port = 9875 90 | 91 | [Freezer] 92 | id = 3120 93 | ip = 204.75.167.15 94 | port = 3724 95 | 96 | [Avalanche] 97 | id = 3121 98 | ip = 204.75.167.15 99 | port = 6112 100 | 101 | [Powder Ball] 102 | id = 3122 103 | ip = 204.75.167.11 104 | port = 6112 105 | 106 | [Summit] 107 | id = 3123 108 | ip = 204.75.167.16 109 | port = 3724 110 | 111 | [Flippers] 112 | id = 3124 113 | ip = 204.75.167.16 114 | port = 6112 115 | 116 | [Yeti] 117 | id = 3125 118 | ip = 204.75.167.16 119 | port = 9875 120 | 121 | [Sub Zero] 122 | id = 3126 123 | ip = 204.75.167.17 124 | port = 3724 125 | 126 | [Ice Cold] 127 | id = 3127 128 | ip = 204.75.167.17 129 | port = 6112 130 | 131 | [Crystal] 132 | id = 3128 133 | ip = 204.75.167.17 134 | port = 9875 135 | 136 | [Snow Bank] 137 | id = 3129 138 | ip = 204.75.167.18 139 | port = 3724 140 | 141 | [Ice Palace] 142 | id = 3130 143 | ip = 204.75.167.18 144 | port = 6112 145 | 146 | [Tuxedo] 147 | id = 3131 148 | ip = 204.75.167.18 149 | port = 9875 150 | 151 | [Abominable] 152 | id = 3132 153 | ip = 204.75.167.19 154 | port = 3724 155 | 156 | [Half Pipe] 157 | id = 3133 158 | ip = 204.75.167.19 159 | port = 6112 160 | 161 | [Snow Board] 162 | id = 3134 163 | ip = 204.75.167.19 164 | port = 9875 165 | 166 | [Alaska] 167 | id = 3135 168 | ip = 204.75.167.20 169 | port = 3724 170 | 171 | [Thermal] 172 | id = 3136 173 | ip = 204.75.167.20 174 | port = 6112 175 | 176 | [Toboggan] 177 | id = 3137 178 | ip = 204.75.167.20 179 | port = 9875 180 | 181 | [Husky] 182 | id = 3138 183 | ip = 204.75.167.21 184 | port = 3724 185 | 186 | [Snow Plow] 187 | id = 3139 188 | ip = 204.75.167.21 189 | port = 6112 190 | 191 | [Ice Age] 192 | id = 3140 193 | ip = 204.75.167.21 194 | port = 9875 195 | 196 | [Sabertooth] 197 | id = 3141 198 | ip = 204.75.167.9 199 | port = 6112 200 | 201 | [Parka] 202 | id = 3142 203 | ip = 204.75.167.22 204 | port = 6112 205 | 206 | [Hibernate] 207 | id = 3143 208 | ip = 204.75.167.22 209 | port = 9875 210 | 211 | [Sleet] 212 | id = 3144 213 | ip = 204.75.167.23 214 | port = 3724 215 | 216 | [Vanilla] 217 | id = 3145 218 | ip = 204.75.167.23 219 | port = 6112 220 | 221 | [Christmas] 222 | id = 3146 223 | ip = 204.75.167.23 224 | port = 9875 225 | 226 | [Klondike] 227 | id = 3147 228 | ip = 204.75.167.24 229 | port = 3724 230 | 231 | [Icebound] 232 | id = 3148 233 | ip = 204.75.167.24 234 | port = 6112 235 | 236 | [Marshmallow] 237 | id = 3149 238 | ip = 204.75.167.24 239 | port = 9875 240 | 241 | [White House] 242 | id = 3150 243 | ip = 204.75.167.25 244 | port = 3724 245 | 246 | [Fjord] 247 | id = 3151 248 | ip = 204.75.167.25 249 | port = 6112 250 | 251 | [Big Foot] 252 | id = 3152 253 | ip = 204.75.167.25 254 | port = 9875 255 | 256 | [Rocky Road] 257 | id = 3155 258 | ip = 204.75.167.26 259 | port = 3724 260 | 261 | [Rainbow] 262 | id = 3156 263 | ip = 204.75.167.26 264 | port = 6112 265 | 266 | [Arctic] 267 | id = 3157 268 | ip = 204.75.167.26 269 | port = 9875 270 | 271 | [Shiver] 272 | id = 3158 273 | ip = 204.75.167.27 274 | port = 3724 275 | 276 | [Matterhorn] 277 | id = 3159 278 | ip = 204.75.167.27 279 | port = 6112 280 | 281 | [Bobsled] 282 | id = 3160 283 | ip = 204.75.167.27 284 | port = 9875 285 | 286 | [Ice Box] 287 | id = 3161 288 | ip = 204.75.167.28 289 | port = 3724 290 | 291 | [Bunny Hill] 292 | id = 3162 293 | ip = 204.75.167.11 294 | port = 9875 295 | 296 | [Walrus] 297 | id = 3163 298 | ip = 204.75.167.28 299 | port = 9875 300 | 301 | [Deep Snow] 302 | id = 3164 303 | ip = 204.75.167.29 304 | port = 3724 305 | 306 | [Snowmobile] 307 | id = 3166 308 | ip = 204.75.167.29 309 | port = 6112 310 | 311 | [Northern Lights] 312 | id = 3167 313 | ip = 204.75.167.29 314 | port = 9875 315 | 316 | [Southern Lights] 317 | id = 3168 318 | ip = 204.75.167.30 319 | port = 3724 320 | 321 | [Ice Shelf] 322 | id = 3169 323 | ip = 204.75.167.30 324 | port = 6112 325 | 326 | [Ascent] 327 | id = 3170 328 | ip = 204.75.167.30 329 | port = 9875 330 | 331 | [Snowcap] 332 | id = 3171 333 | ip = 204.75.167.31 334 | port = 3724 335 | 336 | [Hockey] 337 | id = 3720 338 | ip = 204.75.167.50 339 | port = 3724 340 | 341 | [Jack Frost] 342 | id = 3721 343 | ip = 204.75.167.50 344 | port = 6112 345 | 346 | [Oyster] 347 | id = 3722 348 | ip = 204.75.167.9 349 | port = 9875 350 | 351 | [Pine Needles] 352 | id = 3723 353 | ip = 204.75.167.51 354 | port = 3724 355 | 356 | [Hypothermia] 357 | id = 3724 358 | ip = 204.75.167.51 359 | port = 6112 360 | 361 | [Zipline] 362 | id = 3725 363 | ip = 204.75.167.51 364 | port = 9875 365 | 366 | [North Pole] 367 | id = 3200 368 | ip = 204.75.167.31 369 | port = 6112 370 | 371 | [Glacier] 372 | id = 3201 373 | ip = 204.75.167.10 374 | port = 3724 375 | 376 | [Aurora] 377 | id = 3202 378 | ip = 204.75.167.32 379 | port = 3724 380 | 381 | [Mukluk] 382 | id = 3203 383 | ip = 204.75.167.32 384 | port = 6112 385 | 386 | [Great White] 387 | id = 3204 388 | ip = 204.75.167.32 389 | port = 9875 390 | 391 | [Snow Shoe] 392 | id = 3205 393 | ip = 204.75.167.33 394 | port = 3724 395 | 396 | [Yukon] 397 | id = 3206 398 | ip = 204.75.167.33 399 | port = 6112 400 | 401 | [Polar Bear] 402 | id = 3207 403 | ip = 204.75.167.33 404 | port = 9875 405 | 406 | [Chinook] 407 | id = 3209 408 | ip = 204.75.167.34 409 | port = 3724 410 | 411 | [Wool Socks] 412 | id = 3210 413 | ip = 204.75.167.34 414 | port = 6112 415 | 416 | [Snowbound] 417 | id = 3211 418 | ip = 204.75.167.34 419 | port = 9875 420 | 421 | [Ice Pond] 422 | id = 3213 423 | ip = 204.75.167.11 424 | port = 3724 425 | 426 | [Snowfall] 427 | id = 3214 428 | ip = 204.75.167.35 429 | port = 9875 430 | 431 | [Caribou] 432 | id = 3215 433 | ip = 204.75.167.36 434 | port = 3724 435 | 436 | [Deep Freeze] 437 | id = 3300 438 | ip = 204.75.167.36 439 | port = 6112 440 | 441 | [Cold Front] 442 | id = 3301 443 | ip = 204.75.167.36 444 | port = 9875 445 | 446 | [Frozen] 447 | id = 3302 448 | ip = 204.75.167.37 449 | port = 3724 450 | 451 | [Snow Flake] 452 | id = 3303 453 | ip = 204.75.167.37 454 | port = 6112 455 | 456 | [Frosty] 457 | id = 3304 458 | ip = 204.75.167.37 459 | port = 9875 460 | 461 | [Snow Drift] 462 | id = 3306 463 | ip = 204.75.167.10 464 | port = 9875 465 | 466 | [Mittens] 467 | id = 3307 468 | ip = 204.75.167.38 469 | port = 6112 470 | 471 | [Breeze] 472 | id = 3310 473 | ip = 204.75.167.38 474 | port = 9875 475 | 476 | [Crunch] 477 | id = 3311 478 | ip = 204.75.167.39 479 | port = 3724 480 | 481 | [Wind Chill] 482 | id = 3312 483 | ip = 204.75.167.39 484 | port = 6112 485 | 486 | [Iceland] 487 | id = 3313 488 | ip = 204.75.167.39 489 | port = 9875 490 | 491 | [Belly Slide] 492 | id = 3314 493 | ip = 204.75.167.40 494 | port = 3724 495 | 496 | [Sherbet] 497 | id = 3315 498 | ip = 204.75.167.40 499 | port = 6112 500 | 501 | [South Pole] 502 | id = 3400 503 | ip = 204.75.167.40 504 | port = 9875 505 | 506 | [Big Surf] 507 | id = 3401 508 | ip = 204.75.167.41 509 | port = 3724 510 | 511 | [Sasquatch] 512 | id = 3403 513 | ip = 204.75.167.41 514 | port = 6112 515 | 516 | [Kosciuszko] 517 | id = 3404 518 | ip = 204.75.167.41 519 | port = 9875 520 | 521 | [Down Under] 522 | id = 3405 523 | ip = 204.75.167.42 524 | port = 3724 525 | 526 | [Beanie] 527 | id = 3406 528 | ip = 204.75.167.42 529 | port = 6112 530 | 531 | [Outback] 532 | id = 3407 533 | ip = 204.75.167.42 534 | port = 9875 535 | 536 | [Snowy River] 537 | id = 3409 538 | ip = 204.75.167.43 539 | port = 3724 540 | 541 | [Big Snow] 542 | id = 3410 543 | ip = 204.75.167.43 544 | port = 6112 545 | 546 | [Brumby] 547 | id = 3411 548 | ip = 204.75.167.43 549 | port = 9875 550 | 551 | [Cold Snap] 552 | id = 3181 553 | ip = 204.75.167.46 554 | port = 6112 555 | 556 | [Permafrost] 557 | id = 3182 558 | ip = 204.75.167.46 559 | port = 9875 560 | 561 | [Below Zero] 562 | id = 3183 563 | ip = 204.75.167.47 564 | port = 3724 565 | 566 | [Snow Ball] 567 | id = 3118 568 | ip = 204.75.167.52 569 | port = 3724 570 | 571 | [Ice Pack] 572 | id = 3119 573 | ip = 204.75.167.52 574 | port = 6112 575 | 576 | [Ice Cream] 577 | id = 3153 578 | ip = 204.75.167.52 579 | port = 9875 580 | 581 | [Bubblegum] 582 | id = 3154 583 | ip = 204.75.167.53 584 | port = 3724 585 | 586 | [Altitude] 587 | id = 3165 588 | ip = 204.75.167.53 589 | port = 6112 590 | 591 | [Canoe] 592 | id = 3208 593 | ip = 204.75.167.53 594 | port = 9875 595 | 596 | [Ice Rink] 597 | id = 3212 598 | ip = 204.75.167.54 599 | port = 3724 600 | 601 | [Ice Cave] 602 | id = 3308 603 | ip = 204.75.167.54 604 | port = 6112 605 | 606 | [Boots] 607 | id = 3309 608 | ip = 204.75.167.54 609 | port = 9875 610 | 611 | [Ice Cube] 612 | id = 3402 613 | ip = 204.75.167.55 614 | port = 3724 615 | 616 | [Bonza] 617 | id = 3408 618 | ip = 204.75.167.55 619 | port = 6112 620 | 621 | [Polar] 622 | id = 3512 623 | ip = 204.75.167.55 624 | port = 9875 625 | 626 | [Dry Ice] 627 | id = 3513 628 | ip = 204.75.167.56 629 | port = 3724 630 | 631 | [Snow Covered] 632 | id = 3514 633 | ip = 204.75.167.56 634 | port = 6112 635 | 636 | [Glacial] 637 | id = 3654 638 | ip = 204.75.167.56 639 | port = 9875 640 | 641 | [Patagonia] 642 | id = 3656 643 | ip = 204.75.167.57 644 | port = 3724 645 | 646 | [Antarctic] 647 | id = 3552 648 | ip = 204.75.167.57 649 | port = 6112 650 | 651 | [Downhill] 652 | id = 3680 653 | ip = 204.75.167.44 654 | port = 3724 655 | 656 | [Elevation] 657 | id = 3681 658 | ip = 204.75.167.44 659 | port = 6112 660 | 661 | [Tea] 662 | id = 3682 663 | ip = 204.75.167.44 664 | port = 9875 665 | 666 | [Misty] 667 | id = 3683 668 | ip = 204.75.167.45 669 | port = 3724 670 | 671 | [Adventure] 672 | id = 3708 673 | ip = 204.75.167.58 674 | port = 3724 675 | 676 | [Beanbag] 677 | id = 3709 678 | ip = 204.75.167.58 679 | port = 6112 680 | 681 | [Cream Soda] 682 | id = 3710 683 | ip = 204.75.167.58 684 | port = 9875 685 | 686 | [Fiesta] 687 | id = 3711 688 | ip = 204.75.167.59 689 | port = 3724 690 | 691 | [Grasshopper] 692 | id = 3712 693 | ip = 204.75.167.59 694 | port = 6112 695 | 696 | [Hot Chocolate] 697 | id = 3713 698 | ip = 204.75.167.59 699 | port = 9875 700 | 701 | [Jackhammer] 702 | id = 3714 703 | ip = 204.75.167.60 704 | port = 3724 705 | 706 | [Migrator] 707 | id = 3715 708 | ip = 204.75.167.60 709 | port = 6112 710 | 711 | [Mullet] 712 | id = 3716 713 | ip = 204.75.167.60 714 | port = 9875 715 | 716 | [Puddle] 717 | id = 3717 718 | ip = 204.75.167.61 719 | port = 3724 720 | 721 | [Sardine] 722 | id = 3718 723 | ip = 204.75.167.61 724 | port = 6112 725 | 726 | [Skates] 727 | id = 3719 728 | ip = 204.75.167.61 729 | port = 9875 730 | 731 | [Berg] 732 | id = 3172 733 | ip = 204.75.167.47 734 | port = 6112 735 | 736 | [Cozy] 737 | id = 3173 738 | ip = 204.75.167.47 739 | port = 9875 740 | 741 | [Sparkle] 742 | id = 3174 743 | ip = 204.75.167.48 744 | port = 3724 745 | 746 | [Slippers] 747 | id = 3175 748 | ip = 204.75.167.48 749 | port = 6112 750 | 751 | [Mountain] 752 | id = 3176 753 | ip = 204.75.167.48 754 | port = 9875 755 | 756 | [Cabin] 757 | id = 3177 758 | ip = 204.75.167.49 759 | port = 3724 760 | 761 | [Fog] 762 | id = 3178 763 | ip = 204.75.167.49 764 | port = 6112 765 | 766 | [Cloudy] 767 | id = 3179 768 | ip = 204.75.167.49 769 | port = 9875 770 | 771 | [Sled] 772 | id = 3180 773 | ip = 204.75.167.46 774 | port = 3724 775 | 776 | --------------------------------------------------------------------------------