124 lines
3.9 KiB
Python
Executable File
124 lines
3.9 KiB
Python
Executable File
import hashlib
|
|
import os
|
|
import pickle
|
|
|
|
import geohash2
|
|
import requests
|
|
import simplejson
|
|
|
|
import gcm_re
|
|
import util
|
|
|
|
|
|
class GrindrSession(requests.Session):
|
|
|
|
def __init__(self, email, password):
|
|
super().__init__()
|
|
|
|
self.headers.update({
|
|
'User-Agent': 'grindr3/3.21.2.29102;29102;Unknown;Android 5.0.1',
|
|
})
|
|
|
|
if util.email_valid(email):
|
|
self.email = email
|
|
self.filename = hashlib.sha256(email.encode('utf-8')).hexdigest()
|
|
else:
|
|
raise ValueError("The email provided is invalid")
|
|
|
|
self.password = password
|
|
|
|
# Generated GCM device information
|
|
self.androidId = None
|
|
self.securityToken = None
|
|
|
|
# GCM Token returned
|
|
self.gcmToken = None
|
|
|
|
# Grindr specific information
|
|
self.profileId = None
|
|
self.sessionId = None
|
|
self.xmppToken = None
|
|
self.authToken = None
|
|
|
|
self._config = {
|
|
'androidId': None,
|
|
'securityToken': None,
|
|
'gcmToken': None,
|
|
'authToken': None,
|
|
}
|
|
if os.path.isfile(self.filename):
|
|
self._config = pickle.load(open(self.filename, 'rb'))
|
|
self.androidId = self._config['androidId']
|
|
self.securityToken = self._config['securityToken']
|
|
self.gcmToken = self._config['gcmToken']
|
|
self.authToken = self._config['authToken']
|
|
self._init_session()
|
|
else:
|
|
self._init_tokens()
|
|
|
|
def _init_tokens(self):
|
|
self.androidId, self.securityToken = gcm_re.get_android_id()
|
|
self.gcmToken = gcm_re.get_gcm_token(self.androidId, self.securityToken)
|
|
payload = {
|
|
'email': self.email,
|
|
'password': self.password,
|
|
'token': self.gcmToken,
|
|
}
|
|
response = self.post('https://grindr.mobi/v3/sessions', json=payload)
|
|
|
|
if response.status_code == 200:
|
|
login_data = simplejson.loads(response.text)
|
|
self.profileId = login_data['profileId']
|
|
self.sessionId = login_data['sessionId']
|
|
self.xmppToken = login_data['xmppToken']
|
|
self.authToken = login_data['authToken']
|
|
|
|
self.headers.update({
|
|
'Authorization': 'Grindr3 ' + self.sessionId
|
|
})
|
|
self._dump_config()
|
|
else:
|
|
raise ValueError('Invalid login')
|
|
|
|
def _init_session(self):
|
|
payload = {
|
|
'authToken': self.authToken,
|
|
'email': self.email,
|
|
'token': self.gcmToken,
|
|
}
|
|
response = self.post('https://grindr.mobi/v3/sessions', json=payload)
|
|
|
|
if response.status_code == 200:
|
|
login_data = simplejson.loads(response.text)
|
|
self.profileId = login_data['profileId']
|
|
self.sessionId = login_data['sessionId']
|
|
self.xmppToken = login_data['xmppToken']
|
|
self.headers.update({
|
|
'Authorization': 'Grindr3 ' + self.sessionId
|
|
})
|
|
else:
|
|
raise ValueError('Invalid login')
|
|
|
|
def _dump_config(self):
|
|
self._config['androidId'] = self.androidId
|
|
self._config['securityToken'] = self.securityToken
|
|
self._config['gcmToken'] = self.gcmToken
|
|
self._config['authToken'] = self.authToken
|
|
|
|
pickle.dump(self._config, open(self.filename, 'wb+'))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
session = GrindrSession('', '') # email, password
|
|
|
|
response = session.get('https://grindr.mobi/v3/profile/taps')
|
|
print(response.text)
|
|
|
|
geohash = geohash2.encode(44.029821, -123.076826)
|
|
response = session.get('https://grindr.mobi/v3/locations/{}/profiles'.format(geohash))
|
|
|
|
data = simplejson.loads(response.text)
|
|
|
|
for profile in data['profiles']:
|
|
print(profile['displayName'])
|