node-pokemon
Version:
Pokemon Go API
85 lines (72 loc) • 2.45 kB
text/typescript
import Provider from './Provider';
import PokemonGo from '../PokemonGo';
import request = require('request');
export default class PokemonClubProvider extends Provider {
public static loginUrl: string = "https://sso.pokemon.com/sso/login?service=https%3A%2F%2Fsso.pokemon.com%2Fsso%2Foauth2.0%2FcallbackAuthorize";
public static loginOauth: string = "https://sso.pokemon.com/sso/oauth2.0/accessToken";
public login(username: string, password: string, self: PokemonGo, callback: (err, token: string) => void): void {
let options = {
url: PokemonClubProvider.loginUrl,
headers: {
'User-Agent': 'niantic'
}
};
request.get(options, function(err, response, body) {
if(err)
return callback(err, null);
if(body.trim().indexOf('<') === 0)
return callback(new Error('Invalide response from PTC server'), null);
let data;
try {
data = JSON.parse(body);
} catch(err) {
return callback(err, null);
}
let options = {
url: PokemonClubProvider.loginUrl,
form: {
'lt': data.lt,
'execution': data.execution,
'_eventId': 'submit',
'username': username,
'password': password
},
headers: {
'User-Agent': 'niantic'
}
};
request.post(options, function(err, response, body) {
if(err)
return callback(err, null);
if(body) {
let parsedBody = JSON.parse(body);
if(parsedBody.errors && parsedBody.errors.length !== 0)
return callback(new Error('Error logging in: ' + parsedBody.errors[0]), null);
}
let ticket = response.headers['location'].split('ticket=')[1];
let options = {
url: PokemonClubProvider.loginOauth,
form: {
'client_id': 'mobile-app_pokemon-go',
'redirect_uri': 'https://www.nianticlabs.com/pokemongo/error',
'client_secret': 'w8ScCUXJQc6kXKw8FiOhd8Fixzht18Dq3PEVkUCP5ZPxtgyWsbTvWHFLm2wNY0JR',
'grant_type': 'refresh_token',
'code': ticket
}
};
request.post(options, function(err, response, body) {
if(err)
return callback(err, null);
let token = body.split('token=')[1];
if(!token)
return callback(new Error('Login failed #1'), null);
token = token.split('&')[0];
if(!token)
return callback(new Error('Login failed #2'), null);
self.setToken(token);
callback(null, token);
});
});
});
}
}