Advertisement
Guest User

Untitled

a guest
Jul 10th, 2016
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.90 KB | None | 0 0
  1. import socket
  2. import struct
  3. import random
  4. import threading
  5.  
  6. class SABot:
  7. def __init__(self, Username, Password, IP, Port):
  8. self.NullByte = struct.pack('B', 0)
  9. self.BufSize = 4096
  10. self.CommandChar = '.'
  11. self.InLobby = False
  12. self.OnlineUsers = {}
  13. self.OnlineUserMap = {}
  14. self.Dead = []
  15.  
  16. self.NameToIP = {'2D Central': '74.86.43.9:1138', 'Paper Thin City': '74.86.43.8:1138', 'Fine Line Island': '198.58.106.101:1138', 'U of SA': '69.164.207.72:1138',
  17. 'Amsterdam': '139.162.151.57:1138', 'Mobius Metro': '45.56.72.83:1138', 'Cartesian': '198.58.106.101:1139'}
  18.  
  19. self.IPToName = {'74.86.43.9:1138': '2D Central', '74.86.43.8:1138': 'Paper Thin City', '198.58.106.101:1138': 'Fine Line Island', '69.164.207.72:1138': 'U of SA',
  20. '139.162.151.57:1138': 'Amsterdam', '45.56.72.83:1138': 'Mobius Metro', '198.58.106.101:1139': 'Cartesian'}
  21.  
  22. self.ServerIP = IP
  23. self.ServerPort = Port
  24. self.Commands = True
  25. self.BotServer = self.IPToName[ '{}:{}'.format(self.ServerIP, self.ServerPort)]
  26. self.BotPassword = Password
  27.  
  28. self.connectToServer(Username, Password, self.ServerIP, self.ServerPort)
  29.  
  30. def sendPacket(self, Socket, PacketData, Receive = False):
  31. Packet = bytes(PacketData, 'utf-8')
  32.  
  33. if Socket:
  34. Socket.send(Packet + self.NullByte)
  35.  
  36. if Receive:
  37. return Socket.recv(self.BufSize).decode('utf-8')
  38.  
  39. def startKeepAlive(self, TimerSeconds = 20):
  40. if hasattr(self, 'SocketConn'):
  41. KeepAliveTimer = threading.Timer(TimerSeconds, self.startKeepAlive)
  42. KeepAliveTimer.daemon = True
  43. KeepAliveTimer.start()
  44.  
  45. self.sendPacket(self.SocketConn, '0')
  46.  
  47. def sendPrivateMessage(self, UserID, Message):
  48. if UserID != self.BotID:
  49. if UserID in self.OnlineUsers:
  50. self.sendPacket(self.SocketConn, '00' + UserID + 'P' + Message)
  51.  
  52. def sendPublicMessage(self, Message):
  53. self.sendPacket(self.SocketConn, '9' + Message)
  54.  
  55. def connectionHandler(self):
  56. Buffer = b''
  57.  
  58. while hasattr(self, 'SocketConn'):
  59. try:
  60. Buffer += self.SocketConn.recv(self.BufSize)
  61. except ConnectionAbortedError:
  62. return
  63.  
  64. if len(Buffer) == 0:
  65. print('{} has disconnected'.format(self.BotUsername))
  66.  
  67. break
  68. elif Buffer.endswith(self.NullByte):
  69. Receive = Buffer.split(self.NullByte)
  70. Buffer = b''
  71.  
  72. for Data in Receive:
  73. Data = Data.decode('utf-8')
  74.  
  75. if Data.startswith('U'):
  76. UserID = Data[1:][:3]
  77. Username = Data[4:][:20].replace('#', '')
  78.  
  79. self.parseUserData(Data)
  80. elif Data.startswith('D'):
  81. UserID = Data[1:][:3]
  82. Username = self.OnlineUsers[UserID]
  83.  
  84. del self.OnlineUserMap[Username]
  85. del self.OnlineUsers[UserID]
  86. elif Data.startswith('M'):
  87. UserID = Data[1:][:3]
  88.  
  89. self.parseUserMessage(UserID, Data)
  90. elif Data.startswith('0g') or Data.startswith('0j'):
  91. print('{{Server}}: {}'.format(Data[2:]))
  92. elif Data.startswith('0f') or Data.startswith('0e'):
  93. Time, Reason = Data[2:].split(';')
  94. print('This account has just been banned [Time: {} / Reason: {}]'.format(Time, Reason))
  95.  
  96. def connectToServer(self, Username, Password, ServerIP, ServerPort):
  97. try:
  98. self.SocketConn = socket.create_connection((ServerIP, ServerPort))
  99. except Exception as Error:
  100. print(Error)
  101. return
  102.  
  103. Handshake = self.sendPacket(self.SocketConn, '08HxO9TdCC62Nwln1P', True).strip(self.NullByte.decode('utf-8'))
  104.  
  105. if Handshake == '08':
  106. Credentials = '09{};{}'.format(Username, Password)
  107. RawData = self.sendPacket(self.SocketConn, Credentials, True).split(self.NullByte.decode('utf-8'))
  108.  
  109. for Data in RawData:
  110. if Data.startswith('A'):
  111. self.AutoRelog = True
  112. self.InLobby = True
  113. self.BotID = Data[1:][:3]
  114. self.BotUsername = Data[4:][:20].replace('#', '')
  115. self.BotCred = Data[43:].split(';')[8]
  116.  
  117. print('Bot Username: {} | Bot ID: {} | Bot Cred: {} | Located in {}'.format(self.BotID, self.BotUsername, self.BotCred, self.BotServer))
  118.  
  119. EntryPackets = ['02Z900_', '03_', '0a', '01']
  120.  
  121. for Packet in EntryPackets:
  122. self.sendPacket(self.SocketConn, Packet)
  123.  
  124. self.startKeepAlive()
  125. ConnectionThread = threading.Thread(target=self.connectionHandler)
  126. ConnectionThread.start()
  127. break
  128. elif Data == '09':
  129. print('Incorrect password')
  130. break
  131. elif Data == '091':
  132. print('Currently banned')
  133. break
  134. else:
  135. print('Server capacity check failed')
  136.  
  137. def parseUserData(self, Packet, Password = None):
  138. StatsString = Packet.replace('\x00', '')
  139. UserID = StatsString[1:][:3]
  140. Type = StatsString[:1]
  141.  
  142. if Type == 'U':
  143. if self.InLobby == True:
  144. Username = StatsString[4:][:20].replace('#', '')
  145. StatsString = StatsString[24:]
  146.  
  147. self.OnlineUsers[UserID] = Username
  148. self.OnlineUserMap[Username] = UserID
  149. else:
  150. Username = StatsString[9:][:20].replace('#', '')
  151.  
  152. self.OnlineUsers[UserID] = Username
  153. self.OnlineUserMap[Username] = UserID
  154.  
  155. def parseUserMessage(self, SenderID, Packet):
  156. if SenderID in self.OnlineUsers:
  157. Sender = self.OnlineUsers[SenderID]
  158.  
  159. NoUseTypes = ['1', '2', '4', '5', '6', '7', '8', '~']
  160. MessageType = Packet[4:][:1]
  161. SenderMessage = Packet[5:]
  162. RawMessage = Packet[1:].replace(SenderID, '')
  163.  
  164. if MessageType in NoUseTypes:
  165. return
  166. elif MessageType == '9':
  167. if self.Commands:
  168. self.handleCommand(SenderID, Sender, SenderMessage, False)
  169. elif MessageType == 'P':
  170. if self.Commands:
  171. self.handleCommand(SenderID, Sender, SenderMessage, True)
  172. else:
  173. self.handleCommand(SenderID, Sender, RawMessage, True)
  174.  
  175. try:
  176. print('[' + Sender + ']: ' + RawMessage)
  177. except:
  178. pass
  179.  
  180. def handleCommand(self, SenderID, Sender, SenderMessage, Private):
  181. RespondByPM = (False if Private == False else True)
  182. Message = SenderMessage.strip()
  183. MessageCheck = Message.split()
  184.  
  185. if Message.startswith(self.CommandChar):
  186. Command = MessageCheck[0][1:].lower()
  187. HasArguments = (True if len(MessageCheck) > 1 else False)
  188. Arguments = (' '.join(MessageCheck[1:]) if HasArguments else None)
  189.  
  190. if Command == 'reset':
  191. RespondByPM = True
  192. self.Dead = []
  193. self.BotAdmin = None
  194.  
  195. Response = 'RR list has been reset.'
  196. elif Command == 'users':
  197. RespondByPM = True
  198. UserList = []
  199.  
  200. for User in self.OnlineUserMap:
  201. UserList .append(User)
  202.  
  203. Response = 'There are {} people in the lobby. Users: {}'.format(len(UserList), ', '.join(UserList))
  204. elif Command == 'addcol' or Command == 'getcol':
  205. RespondByPM = True
  206.  
  207. if Private:
  208. if HasArguments:
  209. SpinnerType = Arguments.split()[0]
  210. RGB = Arguments.split()[1]
  211. Password = Arguments.replace(' ', '')[12:]
  212. Response = 'Attempting to add the requested RGB to your account...'
  213.  
  214. ColorRequest = threading.Thread(target=self.handleColorRequest, args=(SenderID, Sender, SpinnerType, RGB, Password))
  215. ColorRequest.daemon = True
  216. ColorRequest.start()
  217. elif Command == 'rr':
  218. if Sender not in self.Dead:
  219. GoodNumber = random.randint(0, 2)
  220. BadNumber = random.randint(0, 2)
  221.  
  222. if GoodNumber == BadNumber:
  223. self.Dead.append(Sender)
  224. Response = 'You\'re dead, {}'.format(Sender)
  225. else:
  226. Response = 'You live, {}'.format(Sender)
  227.  
  228. if 'Response' in locals():
  229. if Private:
  230. print('[PM from {} in {}] Response: {}'.format(Sender, self.BotServer, Response))
  231. else:
  232. print('[{} in {}] Response: {}'.format(Sender, self.BotServer, Response))
  233.  
  234. if RespondByPM:
  235. self.sendPrivateMessage(SenderID, Response)
  236. else:
  237. self.sendPublicMessage(Response)
  238.  
  239. def handleColorRequest(self, SenderID, Sender, SpinnerType, RGB, Password):
  240. SocketConn = socket.create_connection((self.ServerIP, self.ServerPort), socks.PROXY_TYPE_SOCKS5, 'localhost', 9150)
  241. Handshake = self.sendPacket(SocketConn, '08HxO9TdCC62Nwln1P', True).strip(self.NullByte.decode('utf-8'))
  242.  
  243. if Handshake == '08':
  244. Credentials = '09{};{}'.format(Sender, Password)
  245. RawData = self.sendPacket(SocketConn, Credentials, True)
  246.  
  247. for Data in RawData:
  248. if Data.startswith('A'):
  249. self.sendPacket(SocketConn, '02Z900_')
  250. self.sendPacket(SocketConn, '03_')
  251.  
  252. self.sendPacket(SocketConn, '0b' + SpinnerType + RGB + RGB)
  253. elif Data == '09':
  254. SentMessage = False
  255.  
  256. while not SentMessage:
  257. if SenderID in self.OnlineUsers:
  258. SentMessage = True
  259. self.sendPrivateMessage(SenderID, 'Incorrect password')
  260. break
  261.  
  262. break
  263.  
  264. SocketConn.shutdown(socket.SHUT_RD)
  265. SocketConn.close()
  266. del SocketConn
  267.  
  268. if __name__ == '__main__':
  269. Username = 'funkseason'
  270. Password = 'password'
  271.  
  272. SABot(Username, Password, '74.86.43.9', 1138)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement