1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
"Ingrex is a python lib for ingress"
import requests
import re
import json
import os
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)
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
|