mkreiser / ESPN-Fantasy-Football-API

Connect to ESPN's fantasy football API via this JS API client for web and NodeJS. Available as an npm package.
http://espn-fantasy-football-api.s3-website.us-east-2.amazonaws.com/
GNU Lesser General Public License v3.0
304 stars 76 forks source link

getTeamsAtWeek returning error with years before 2018 #175

Closed cmjarrett closed 10 months ago

cmjarrett commented 3 years ago

When using the Client.getTeamsAtWeek() function for league stats prior to 2018, the api fails with a 404.

(node:24828) UnhandledPromiseRejectionWarning: Error: Request failed with status code 404 at createError (C:\scratch\GitHub\GentlemensLeague\node_modules\espn-fantasy-football-api\node-dev.js:1014:15) at settle (C:\scratch\GitHub\GentlemensLeague\node_modules\espn-fantasy-football-api\node-dev.js:1289:12) at IncomingMessage.handleStreamEnd (C:\scratch\GitHub\GentlemensLeague\node_modules\espn-fantasy-football-api\node-dev.js:361:11) at IncomingMessage.emit (events.js:327:22) at endReadableNT (_stream_readable.js:1220:12) at processTicksAndRejections (internal/process/task_queues.js:84:21) (node:24828) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2) (node:24828) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

I've found that I can get the relevent Teams map by utilizing the same endpoint as the getHistoricalScoreboardForWeek() api, 'https://fantasy.espn.com/apis/v3/games/ffl/leagueHistory/' and then building the Teams array.

--but I thought I would at least let anyone else know that it is possible to get historical information at least to 2011.

This is the hacky temporary workaround I made in node-dev.js if anyone needs it. I'll try to mock up a pull request that isn't my hack, maybe add a getHistoricalTeamsAtWeek() function instead for those years < 2018

 {
    key: "getTeamsAtWeek",
    value: function getTeamsAtWeek(_ref5) {
      var _this4 = this;
      console.log(_ref5.seasonId);
      if(_ref5.seasonId > 2017) {
        var seasonId = _ref5.seasonId,
        scoringPeriodId = _ref5.scoringPeriodId;

        var route = this.constructor._buildRoute({
          base: "".concat(seasonId, "/segments/0/leagues/").concat(this.leagueId),
          params: "?scoringPeriodId=".concat(scoringPeriodId, "&view=mRoster&view=mTeam")
        });
        console.log(route);

        return axios__WEBPACK_IMPORTED_MODULE_4___default.a.get(route, this._buildAxiosConfig()).then(function (response) {
          var data = lodash_get__WEBPACK_IMPORTED_MODULE_3___default()(response.data, 'teams');

          return lodash_map__WEBPACK_IMPORTED_MODULE_1___default()(data, function (team) {
            return _team_team__WEBPACK_IMPORTED_MODULE_9__["default"].buildFromServer(team, {
              leagueId: _this4.leagueId,
              seasonId: seasonId
            });
          });
        });
      } else {
        var _this4 = this;

        var seasonId = _ref5.seasonId,
            matchupPeriodId = _ref5.scoringPeriodId,
            scoringPeriodId = _ref5.scoringPeriodId;

        var route = this.constructor._buildRoute({
          base: "".concat(this.leagueId),
          params: "?scoringPeriodId=".concat(scoringPeriodId, "&seasonId=").concat(seasonId) + '&view=mMatchupScore&view=mScoreboard&view=mSettings&view=mTopPerformers&view=mTeam'
        });

        var axiosConfig = this._buildAxiosConfig({
          baseURL: 'https://fantasy.espn.com/apis/v3/games/ffl/leagueHistory/'
        });
        console.log(route);

        return axios__WEBPACK_IMPORTED_MODULE_4___default.a.get(route, axiosConfig).then(function (response) {
          var data = lodash_get__WEBPACK_IMPORTED_MODULE_3___default()(response.data[0], 'teams');it 

          return lodash_map__WEBPACK_IMPORTED_MODULE_1___default()(data, function (team) {
            return _team_team__WEBPACK_IMPORTED_MODULE_9__["default"].buildFromServer(team, {
              leagueId: _this4.leagueId,
              seasonId: seasonId
            });
          });
        });
      }
    }
cmjarrett commented 3 years ago

I'm using Team objects so that I can display league standings across multiple years. While I could retrieve the historical boxscores and recreate the standings, and in fact that was my initial approach once I found the getTeamsAtWeek() api didn't work for older years. I eventually looked into each endpoint themselves to see what data was returned, and to my surprise I discovered that the endpoint simply gave me all the information I wanted (but that getHistoricalScoreboardForWeek function didn't parse and return the Team object data).

mkreiser commented 10 months ago

Added in #233 (v1.5.0)