"Ingrex is a python lib for ingress" import requests import re import json class Intel(object): "main class with all Intel functions" def __init__(self, cookies, field): self.DEBUG = True token = re.findall(r'csrftoken=(\w*);', cookies)[0] self.headers = { 'accept-encoding': 'gzip, deflate', 'content-type': 'application/json; charset=UTF-8', 'cookie': cookies, 'origin': 'https://www.ingress.com', 'referer': 'https://www.ingress.com/intel', 'user-agent': 'Mozilla/5.0 (MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'x-csrftoken': token, } self.field = { 'maxLatE6': field['maxLatE6'], 'minLatE6': field['minLatE6'], 'maxLngE6': field['maxLngE6'], 'minLngE6': field['minLngE6'], } self.point = { 'latE6': (field['maxLatE6'] + field['minLatE6']) >> 1, 'lngE6': (field['maxLngE6'] + field['minLngE6']) >> 1, } self.session = requests.session() self.refresh_version() def refresh_version(self): "refresh api version for request" request = self.session.get('https://www.ingress.com/intel', headers=self.headers) self.version = re.findall(r'gen_dashboard_(\w*)\.js', request.text)[0] def fetch(self, url, payload): "raw request with auto-retry and connection check function" payload['v'] = self.version count = 0 while count < 3: try: request = self.session.post(url, data=json.dumps(payload), headers=self.headers, timeout=600) return request.json()['result'] except requests.ConnectionError: raise IntelError except Exception: count += 1 continue raise CookieError def fetch_msg(self, mints=-1, maxts=-1, reverse=False, tab='all'): "fetch message from Ingress COMM, tab can be 'all', 'faction', 'alerts'" url = 'https://www.ingress.com/r/getPlexts' payload = { 'maxLatE6': self.field['maxLatE6'], 'minLatE6': self.field['minLatE6'], 'maxLngE6': self.field['maxLngE6'], 'minLngE6': self.field['minLngE6'], 'maxTimestampMs': maxts, 'minTimestampMs': mints, 'tab': tab } if reverse: payload['ascendingTimestampOrder'] = True return self.fetch(url, payload) def fetch_map(self, tilekeys): "fetch game entities from Ingress map" url = 'https://www.ingress.com/r/getEntities' payload = { 'tileKeys': tilekeys } return self.fetch(url, payload) def fetch_portal(self, guid): "fetch portal details from Ingress" url = 'https://www.ingress.com/r/getPortalDetails' payload = { 'guid': guid } return self.fetch(url, payload) def fetch_score(self): "fetch the global score of RESISTANCE and ENLIGHTENED" url = 'https://www.ingress.com/r/getGameScore' payload = {} return self.fetch(url, payload) def fetch_region(self): "fetch the region info of RESISTANCE and ENLIGHTENED" url = 'https://www.ingress.com/r/getRegionScoreDetails' payload = { 'lngE6': self.point['lngE6'], 'latE6': self.point['latE6'], } return self.fetch(url, payload) def fetch_artifacts(self): "fetch the artifacts details" url = 'https://www.ingress.com/r/getArtifactPortals' payload = {} return self.fetch(url, payload) def send_msg(self, msg, tab='all'): "send a message to Ingress COMM, tab can be 'all', 'faction'" url = 'https://www.ingress.com/r/sendPlext' payload = { 'message': msg, 'latE6': self.point['latE6'], 'lngE6': self.point['lngE6'], 'tab': tab } return self.fetch(url, payload) def send_invite(self, address): "send a recruit to an email address" url = 'https://www.ingress.com/r/sendInviteEmail' payload = { 'inviteeEmailAddress': address } return self.fetch(url, payload) def redeem_code(self, passcode): "redeem a passcode" url = 'https://www.ingress.com/r/redeemReward' payload = { 'passcode': passcode } return self.fetch(url, payload) class IntelError(BaseException): """Intel Error""" pass class CookieError(IntelError): """Intel Error""" pass if __name__ == '__main__': pass