grindr-session/bot.py

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'])