Advertisement
Guest User

Untitled

a guest
Apr 12th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.35 KB | None | 0 0
  1. import asyncio
  2. import websockets
  3. import json
  4. import time
  5. import requests
  6. import sys
  7. import random
  8. import os, os.path
  9. import logging
  10. import math
  11. import urllib.parse
  12. import getopt
  13.  
  14.  
  15. logging.basicConfig(stream=sys.stdout, level=logging.INFO, format="[%(asctime)s] %(levelname)s: %(message)s")
  16. log = logging.getLogger()
  17.  
  18. dukpy_available = True
  19. try:
  20. import dukpy
  21. except ModuleNotFoundError:
  22. dukpy_available = False
  23. log.info("no dukpy found, using Node.js instead")
  24.  
  25. if os.name == "nt":
  26. asyncio.set_event_loop(asyncio.ProactorEventLoop())
  27.  
  28. verbose = False
  29. idle_mode = False
  30. idle_main_mode = False
  31. no_support = False
  32. drop_all = False
  33. drop_amount = 10000
  34. buy_only = None
  35. tasks = []
  36. slave_ids = []
  37. tasks_list = []
  38.  
  39. async def send_data(websocket, data, my_user_id):
  40. if verbose:
  41. log.info("id{}: to: {}".format(my_user_id, data))
  42. await websocket.send(data)
  43.  
  44. available_items = {
  45. "cursor": 30,
  46. "cpu": 100,
  47. "cpu_stack": 1e3,
  48. "computer": 1e4,
  49. "server_vk": 5e4,
  50. "quantum_pc": 2e5,
  51. "datacenter": 5e6
  52. }
  53.  
  54. def calc_price(price, count):
  55. return price / 1000 if count <= 1 else math.ceil(1.3 * calc_price(price, count - 1))
  56.  
  57. async def execute(code):
  58. prefix = "var window={\"parseInt\": parseInt, \"Math\": Math, \"WebSocket\": 1, \"location\": {\"host\": \"iyiyiyiyi\"}, \"navigator\": { \"userAgent\": \"Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20150101 Firefox/20.0 (Chrome)\"}}"
  59. if dukpy_available:
  60. return dukpy.evaljs("{};{}".format(prefix, code))
  61.  
  62. proc = await asyncio.create_subprocess_exec("node", "-e", "{};process.stdout.write(String({}))".format(prefix, code), stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.STDOUT)
  63. stdout, stderr = await proc.communicate()
  64. return stdout.decode()
  65.  
  66. async def spawn_worker(uri, my_user_id):
  67. if verbose:
  68. log.info("spawn worker vk.com/id{}".format(my_user_id))
  69. try:
  70. my_balance = 0
  71. my_items = []
  72. item_to_buy = None
  73. item_price = 0
  74. async with websockets.connect(uri) as websocket:
  75. while True:
  76. time.sleep(0.5)
  77. data = await websocket.recv()
  78. if data[0]== "{":
  79. data = json.loads(data)
  80. if "type" in data:
  81. if data["type"] == "INIT":
  82. dataRandom = data["randomId"]
  83. dataPow = data["pow"]
  84. my_items = data["items"]
  85. dataPow = await execute(dataPow)
  86. await send_data(websocket, "C1 {} {}".format(dataRandom, dataPow), my_user_id)
  87. await send_data(websocket, "C10 {} 1".format(dataRandom), my_user_id)
  88. else:
  89. if verbose:
  90. log.info("id{}: from: {}".format(my_user_id, data))
  91. if data[0] == "S":
  92. data = data.split()
  93. my_balance = float(data[2]) / 1000
  94. if verbose:
  95. log.info("id{}: balance: {}".format(my_user_id, my_balance))
  96. await send_data(websocket, "C10 {} 1".format(data[3]), my_user_id)
  97. elif data[0] == "M" and data[1] == "I":
  98. data = data.split()
  99. await send_data(websocket, "C10 {} 1".format(data[1]), my_user_id)
  100. elif data[0] == "C":
  101. data = " ".join(str(data).split(" ")[1:])
  102. data = json.loads(data)
  103. my_balance = float(data["score"]) / 1000
  104. if "items" in data:
  105. my_items = data["items"]
  106. if verbose:
  107. log.info("id{}: items: {}".format(",".join(my_items)))
  108.  
  109. if verbose:
  110. log.info("id{}: balance: {}".format(my_user_id, my_balance))
  111. elif data[0] == "T" and data[1] == "R":
  112. data = float(str(data).split(" ")[1]) / 1000
  113. my_balance += data
  114. log.info("id{}: income {} coins".format(my_user_id, data))
  115. elif data[0] == "M" and data[1] == "S" and verbose:
  116. data = " ".join(str(data).split(" ")[1:])
  117. log.warning("message: {}".format(data))
  118. time.sleep(15)
  119. return await spawn_worker(uri, my_user_id)
  120. elif data == "BROKEN":
  121. return await spawn_worker(uri, my_user_id)
  122. elif data[0] == "R":
  123. data = " ".join(str(data).split(" ")[1:])
  124. log.warning("{}".format(data))
  125. continue
  126.  
  127. if not no_support:
  128. some_count = random.randint(100, 1000)
  129. if my_balance > some_count and my_user_id != master_user_id and not random.randint(1,40)%5:
  130. target = random.choice(slave_ids)
  131. if target == my_user_id:
  132. continue
  133. await send_data(websocket, "P T {} {}".format(target, some_count * 1000), my_user_id)
  134. log.info("id{}: supporting {} for {} coins".format(my_user_id, target, some_count))
  135. continue
  136.  
  137. if my_balance > drop_amount and my_user_id != master_user_id and random.randint(1,10)%2:
  138. count = drop_amount if drop_all else random.randint(drop_amount / 10, drop_amount)
  139. await send_data(websocket, "P T {} {}".format(master_user_id, count * 1000), my_user_id)
  140. log.info("id{}: send out to master {} coins".format(my_user_id, count))
  141. continue
  142.  
  143. if buy_only:
  144. if idle_main_mode and my_user_id == master_user_id:
  145. continue
  146. item_price = calc_price(available_items[buy_only], my_items.count(buy_only))
  147. if verbose:
  148. log.info("id{}: next target is {} for cost {} coins".format(my_user_id, buy_only, item_price))
  149.  
  150. if my_balance < item_price:
  151. continue
  152.  
  153. log.info("id{}: buy {} for {} coins".format(my_user_id, buy_only, item_price))
  154. await send_data(websocket, "P{} B {}".format(random.randint(1, 20), buy_only), my_user_id)
  155. continue
  156.  
  157. if not idle_mode and not buy_only:
  158. if idle_main_mode and my_user_id == master_user_id:
  159. continue
  160. price_a = calc_price(available_items["cursor"], my_items.count("cursor"))
  161. price_b = calc_price(available_items["cpu"], my_items.count("cpu"))
  162. price_c = calc_price(available_items["cpu_stack"], my_items.count("cpu_stack"))
  163. price_d = calc_price(available_items["computer"], my_items.count("computer"))
  164. price_e = calc_price(available_items["server_vk"], my_items.count("server_vk"))
  165. price_f = calc_price(available_items["quantum_pc"], my_items.count("quantum_pc"))
  166. price_g = calc_price(available_items["datacenter"], my_items.count("datacenter"))
  167.  
  168. item_to_buy = "datacenter"
  169. if price_g / price_f >= 2:
  170. item_to_buy = "quantum_pc"
  171. if price_f / price_e >= 5:
  172. item_to_buy = "server_vk"
  173. if price_e / price_d >= 3:
  174. item_to_buy = "computer"
  175. if price_d / price_c >= 3:
  176. item_to_buy = "cpu_stack"
  177. if price_c / price_b >= 30:
  178. item_to_buy = "cpu"
  179. if price_b / price_a >= 3:
  180. item_to_buy = "cursor"
  181.  
  182. item_price = calc_price(available_items[item_to_buy], my_items.count(item_to_buy))
  183. if verbose:
  184. log.info("id{}: next target is {} for cost {} coins".format(my_user_id, item_to_buy, item_price))
  185. if my_balance > 0 and item_to_buy:
  186. if my_balance < item_price:
  187. continue
  188. await send_data(websocket, "P{} B {}".format(random.randint(1, 20), item_to_buy), my_user_id)
  189. log.info("id{}: buy {} for {} coins".format(my_user_id, item_to_buy, item_price))
  190. item_to_buy = None
  191.  
  192. except KeyboardInterrupt:
  193. log.info("^C catched")
  194. destroy_tasks()
  195. sys.exit(137)
  196. except Exception as e:
  197. log.error("error: {}".format(e))
  198. time.sleep(10)
  199. return await spawn_worker(uri, my_user_id)
  200. log.errror("reached unreachable")
  201. time.sleep(5)
  202. return await spawn_worker(uri, my_user_id)
  203.  
  204. async def dispatch_worker(token, user_id):
  205. if verbose:
  206. log.info("dispatch worker vk.com/id{}".format(user_id))
  207. url = "https://api.vk.com/method/execute.resolveScreenName?access_token={}&v=5.55&screen_name=app6915965_-176897109&owner_id=-176897109&func_v=3".format(token)
  208. try:
  209. response_json = requests.get(url).json()
  210. except Exception as e:
  211. log.error("failed to dispatch worker vk.com/id{}".format(user_id))
  212. log.error("request failed: {}".format(e))
  213. time.sleep(5)
  214. return await dispatch_worker(url, user_id)
  215.  
  216. if "error" in response_json:
  217. log.error("failed to dispatch worker vk.com/id{}".format(user_id))
  218. log.error("API answer: {}".format(response_json))
  219. time.sleep(5)
  220. return await dispatch_worker(url, user_id)
  221.  
  222. app_key = response_json["response"]["object"]["mobile_iframe_url"].split("?")[1]
  223.  
  224. #password = (user_id - 109) if (user_id % 2) else (user_id - 15)
  225. password = user_id - 1
  226. n = user_id % 32
  227.  
  228. #domain = "bagosi-go-go.vkforms.ru" if n > 7 else "coin.w5.vkforms.ru"
  229. domain = "coin-without-bugs.vkforms.ru"
  230. uri = "wss://{}/channel/{}?{}&pass={}".format(domain, n, app_key, password)
  231.  
  232. while True:
  233. try:
  234. await spawn_worker(uri, user_id)
  235. except KeyboardInterrupt:
  236. log.info("^C catched")
  237. destroy_tasks()
  238. sys.exit(137)
  239. except:
  240. return await dispatch_worker(uri, user_id)
  241.  
  242. def auth(login, password):
  243. url = "https://oauth.vk.com/token?grant_type=password&client_id=2274003&client_secret=hHbZxrka2uZ6jB1inYsH&username={}&password={}".format(urllib.parse.quote(login), urllib.parse.quote(password))
  244. try:
  245. response = requests.get(url).json()
  246. except Exception as e:
  247. log.error("failed to perform request: {}".format(e))
  248. time.sleep(5)
  249. return auth(login, password)
  250.  
  251. if "error" in response:
  252. log.error("failed to auth account {}@{}".format(login, password))
  253. log.error("API answer: {}".format(response))
  254. time.sleep(8)
  255. return auth(login, password)
  256.  
  257. return response
  258.  
  259. def destroy_tasks():
  260. global tasks_list
  261. for task in tasks_list:
  262. task.cancel()
  263. if verbose:
  264. log.info("destroyed task")
  265.  
  266. async def run_tasks(task_list):
  267. global tasks_list
  268. for task in task_list:
  269. tasks_list.append(asyncio.get_event_loop().create_task(task))
  270. try:
  271. return await asyncio.gather(*tasks_list)
  272. except KeyboardInterrupt:
  273. log.info("^C catched")
  274. destroy_tasks()
  275. sys.exit(137)
  276.  
  277. print("Wunderwaffle - a tiny VK Coin miner, www: github.com/txlyre/wunderwaffle")
  278. print("by @txlyre, www: txlyre.website\n")
  279.  
  280. if len(sys.argv) >= 2:
  281. try:
  282. opts, args = getopt.getopt(sys.argv[1:], "inmdvb:a:")
  283. except getopt.GetoptError as e:
  284. log.warning("{}".format(e))
  285.  
  286. for name, value in opts:
  287. if name == "-i":
  288. idle_mode = True
  289. log.info("idle_mode enabled")
  290. elif name == "-n":
  291. no_support = True
  292. log.info("no_support enabled")
  293. elif name == "-m":
  294. idle_main_mode = True
  295. log.info("idle_main_mode enabled")
  296. elif name == "-d":
  297. drop_all = True
  298. log.info("drop_all enabled")
  299. elif name == "-v":
  300. verbose = True
  301. log.info("verbose enabled")
  302. elif name == "-b":
  303. if value not in available_items:
  304. log.warning("invalid value for '-b': {}".format(value))
  305. continue
  306. buy_only = value
  307. log.info("buy_only setted to {}".format(buy_only))
  308. elif name == "-a":
  309. try:
  310. drop_amount = int(value)
  311. except ValueError:
  312. log.warning("invalid value for '-a': {}".format(value))
  313. continue
  314. log.info("drop_amount setted to {}".format(drop_amount))
  315. else:
  316. log.warning("unknown command line argument '{}'".format(name))
  317.  
  318.  
  319.  
  320. if not os.path.isfile("save.dat"):
  321. log.info("no save found, making a new one...")
  322. accounts = []
  323. master_account = ()
  324. with open("accs.txt", "r") as fd:
  325. lines = list(filter(lambda line: not line.startswith("#"), fd.readlines()))
  326. master_account = lines.pop(0).strip().split(":")
  327.  
  328. master_account = (master_account[0], master_account[1].split(" ")[0])
  329. for line in lines:
  330. parts = line.strip().split(":")
  331. accounts.append((parts[0], parts[1].split(" ")[0]))
  332. data_save = ""
  333. data = auth(*master_account)
  334. master_token, master_user_id = data["access_token"], data["user_id"]
  335. data_save += "{} {}\n".format(master_token, master_user_id)
  336. if verbose:
  337. log.info("added save for master vk.com/id{}".format(master_user_id))
  338. for account in accounts:
  339. data = auth(*account)
  340. token, user_id = data["access_token"], data["user_id"]
  341. print(data)
  342. data_save += "{} {}\n".format(token, user_id)
  343. if verbose:
  344. log.info("added save for worker vk.com/id{}".format(user_id))
  345. with open("save.dat", "w") as fd:
  346. fd.write(data_save.strip())
  347.  
  348. with open("save.dat", "r") as fd:
  349. lines = fd.readlines()
  350. master_account = lines.pop(0).strip().split(" ")
  351. if len(master_account) != 2:
  352. log.error("invalid master entry in save")
  353. sys.exit(1)
  354. master_token, master_user_id = master_account[0], int(master_account[1])
  355.  
  356. tasks.append(dispatch_worker(master_token, master_user_id))
  357. if verbose:
  358. log.info("added master vk.com/id{}".format(master_user_id))
  359.  
  360. for line in lines:
  361. parts = line.strip().split(" ")
  362. if len(parts) != 2:
  363. log.error("invalid worker entry in save")
  364. continue
  365. token, user_id = parts[0], int(parts[1])
  366. tasks.append(dispatch_worker(token, user_id))
  367. slave_ids.append(user_id)
  368. if verbose:
  369. log.info("added worker vk.com/id{}".format(user_id))
  370.  
  371. if not verbose:
  372. if len(slave_ids) == 0:
  373. log.info("account loaded")
  374. else:
  375. log.info("{} accounts loaded".format(len(slave_ids) + 1))
  376.  
  377. try:
  378. asyncio.get_event_loop().run_until_complete(run_tasks(tasks))
  379. except KeyboardInterrupt:
  380. log.info("^C catched")
  381. destroy_tasks()
  382. sys.exit(137)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement