Client.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import asyncio
  2. from webbot.webbot import Browser
  3. import time
  4. from lxml import html
  5. from lxml import etree
  6. import requests
  7. from requests_futures import sessions
  8. import re
  9. class RRBotException(Exception):
  10. pass
  11. class Client:
  12. def __init__(self, login_method, username, password, expires=None, show_window=False):
  13. self.login_method = login_method
  14. self.username = username
  15. self.password = password
  16. self.expires = expires
  17. self.resource_id = {'oil': 3,
  18. 'ore': 4,
  19. 'uranium': 11,
  20. 'diamond': 15,
  21. 'liquid oxygen': 21,
  22. 'helium-3': 24,
  23. 'antirad': 13,
  24. 'energy drink': 17,
  25. 'spacerockets': 20,
  26. 'tanks': 2,
  27. 'aircrafts': 1,
  28. 'missiles': 14,
  29. 'bombers': 16,
  30. 'battleships': 18,
  31. 'moon tanks': 22,
  32. 'space stations': 23}
  33. self.session_id = None
  34. self.c = None
  35. self.show_window = show_window
  36. if login_method in ["g", "google", "v", "vk", "f", "facebook"]:
  37. self.login()
  38. else:
  39. raise RRBotException("Not a valid login method.")
  40. def login(self):
  41. login_method = self.login_method
  42. self.s = requests.Session()
  43. auth_text = requests.get("http://rivalregions.com").text
  44. web = Browser(showWindow=self.show_window)
  45. if login_method == ("g" or "google"):
  46. auth_text1 = auth_text.split('\t<a href="')
  47. auth_text2 = auth_text1[1].split('" class="sa')
  48. web.go_to(auth_text2[0])
  49. web.type(self.username, into='Email')
  50. web.click('Next')
  51. time.sleep(5)
  52. web.type(self.password, into='Password')
  53. web.click('Next')
  54. time.sleep(5)
  55. web.click(css_selector=".sa_sn.float_left.imp.gogo")
  56. time.sleep(5)
  57. elif login_method == ("v" or "vk"):
  58. auth_text1 = auth_text.split("(\'.vkvk\').attr(\'url\', \'")
  59. auth_text2 = auth_text1[1].split('&response')
  60. web.go_to(auth_text2[0])
  61. web.type(self.username, into='email')
  62. web.type(self.password, xpath="/html/body/div/div/div/div[2]/form/div/div/input[7]")
  63. web.click('Log in')
  64. time.sleep(5)
  65. elif login_method == ("f" or "facebook"):
  66. auth_text1 = auth_text.split('">\r\n\t\t\t\t<div class="sa_sn imp float_left" ')
  67. auth_text2 = auth_text1[0].split('200px;"><a class="sa_link" href="')
  68. url = auth_text2[1]
  69. web.go_to(url)
  70. web.type(self.username, into='Email')
  71. web.type(self.password, into='Password')
  72. web.click('Log In')
  73. time.sleep(5)
  74. web.click(css_selector='.sa_sn.imp.float_left')
  75. time.sleep(5)
  76. sessid = web.get_cookie('PHPSESSID')
  77. expires = sessid.get('expiry', None)
  78. sessid.pop('expiry', None)
  79. sessid.pop('httpOnly', None)
  80. sessid['expires'] = expires
  81. web.close_current_tab()
  82. self.expires = expires
  83. self.session_id = sessid
  84. self.s.cookies.set(**sessid)
  85. self.set_c()
  86. def set_c(self):
  87. r = self.s.get('http://rivalregions.com/#overview')
  88. lines = r.text.split("\n")
  89. for line in lines:
  90. if re.match("(.*)var c_html(.*)", line):
  91. self.c = line.split("'")[-2]
  92. return
  93. def create_article(self, title, article, article_lang="en", paper_id=0, category='0', region="4524"):
  94. r = self.s.get('http://rivalregions.com/#overview')
  95. r = self.s.post("http://rivalregions.com/news/post", data={"c":self.c,
  96. 'newspaper': paper_id,
  97. 'category': category,
  98. 'paper': article,
  99. 'title': title,
  100. 'region': region})
  101. def market_info(self, resource, r_id=False):
  102. """
  103. Returns a list of data about current resource market state.
  104. In form price, amount selling, player id, player name string, total offers on market.
  105. """
  106. if not r_id:
  107. res_id = self.resource_id[resource]
  108. else:
  109. res_id = resource
  110. r = self.s.get(f'http://rivalregions.com/storage/market/{res_id}?{self.c}')
  111. return self.parse_market_response(r, res_id)
  112. def get_all_market_info(self):
  113. session = sessions.FuturesSession(session=self.s)
  114. results = {}
  115. for type_ in self.resource_id:
  116. if type_ == 'energy drink':
  117. continue
  118. results[type_] = session.get(f'http://rivalregions.com/storage/market/{self.resource_id[type_]}?{self.c}')
  119. for res in results:
  120. r = results[res].result()
  121. price, selling_amount, player_id, player_name, total_offers = self.parse_market_response(r, self.resource_id[res])
  122. results[res] = {'price': price,
  123. 'amount': selling_amount,
  124. 'player_id': player_id,
  125. 'player_name': player_name,
  126. 'total_offers':total_offers}
  127. return results
  128. @staticmethod
  129. def parse_market_response(r, res_id):
  130. price = re.search('<input price="(.*)" type', r.text).group(1)
  131. selling_amount = re.search('<span max="(.*)" url="', r.text).group(1)
  132. player_id = re.search('<span action="slide/profile/(.*)" class="storage_see pointer dot hov2', r.text).group(1)
  133. player_name = re.search(f'<span action="slide/profile/{player_id}" class="storage_see pointer dot hov2">(.*)</span>', r.text).group(1)
  134. total_offers = re.search(f'Best offer out of <span action="storage/listed/{res_id}" class="storage_see pointer hov2"><span class="dot">(.*)</span></span>:', r.text).group(1)
  135. return price, selling_amount, player_id, player_name, total_offers