├── .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 |
--------------------------------------------------------------------------------