grimoirelab-perceval icon indicating copy to clipboard operation
grimoirelab-perceval copied to clipboard

[meetup] Change REST API to GraphQL API

Open zhquan opened this issue 2 years ago • 2 comments

The meetup REST API changed to GraphQL API on Jan 31st, 2022.

When I execute meetup I get this error Error!: 401 Client Error

$ perceval meetup "nyc-cloud-foundry" -t XXX 
[2022-02-08 13:36:56,520] - Sir Perceval is on his quest.
[2022-02-08 13:36:56,533] - Fetching events of 'nyc-cloud-foundry' group from 1970-01-01 00:00:00+00:00 to --
[2022-02-08 13:36:57,061] - Error!: 401 Client Error: Unauthorized for url: https://api.meetup.com/nyc-cloud-foundry/events?fields=event_hosts,featured,group_topics,plain_text_description,rsvpable,series&status=cancelled,upcoming,past,proposed,suggested&order=updated&scroll=since%3A1970-01-01T00%3A00%3A00.000Z&page=200
[2022-02-08 13:36:57,064] - Sir Perceval completed his quest.

Going deeper into the error I realize the real error.

{"errors":[{"code":"auth_fail","message":"REST API support will stop on January 31, 2022, please switch to the new GraphQL API."}]}

zhquan avatar Feb 08 '22 12:02 zhquan

There is no way to fetch all the events of a group using pagination. The GraphQL API is not stable and they don't provide direct API support.

We submitted a form to Meetup with their bug, but we don't know if they will reply.


Here is the error:

The GraphQL API doesn't return all the events for a group using pagination. You can execute the following queries using Meetup GraphQL playground:

We want to get (for example) all the events of the "Diviertete-Bailando" group. The API should retrieve 19 past events:

First query

{
  groupByUrlname(urlname: "Diviertete-Bailando") {
    pastEvents (input: {first: 10, after: null}) {
      count
      pageInfo {
        hasNextPage
        endCursor
      }
      edges {
        cursor
        node
        {
          dateTime
        }
      }
    }
  }
}

Response (10 events)

{
  "data": {
    "groupByUrlname": {
      "pastEvents": {
        "count": 19,
        "pageInfo": {
          "hasNextPage": true,
          "endCursor": "MjY5MDY2OTczOjE1ODM0NTY0MDAwMDA="
        },
        "edges": [
          {
            "cursor": "MjY4NDU2NDE1OjE1ODEyMDY0MDAwMDA=",
            "node": {
              "dateTime": "2020-02-08T19:00+01:00"
            }
          },
          {
            "cursor": "MjY4MjkyNzczOjE1ODEyMTM2MDAwMDA=",
            "node": {
              "dateTime": "2020-02-08T21:00+01:00"
            }
          },
          {
            "cursor": "MjY4MzU0MTk4OjE1ODE4MDc2MDAwMDA=",
            "node": {
              "dateTime": "2020-02-15T18:00+01:00"
            }
          },
          {
            "cursor": "MjY4MzU0MDU3OjE1ODE4MTQ4MDAwMDA=",
            "node": {
              "dateTime": "2020-02-15T20:00+01:00"
            }
          },
          {
            "cursor": "MjY4Mzk0OTc0OjE1ODI0MTI0MDAwMDA=",
            "node": {
              "dateTime": "2020-02-22T18:00+01:00"
            }
          },
          {
            "cursor": "MjY4Mzk0OTc2OjE1ODI0MTk2MDAwMDA=",
            "node": {
              "dateTime": "2020-02-22T20:00+01:00"
            }
          },
          {
            "cursor": "MjY4OTA4MTk2OjE1ODI4NTE2MDAwMDA=",
            "node": {
              "dateTime": "2020-02-27T20:00+01:00"
            }
          },
          {
            "cursor": "MjY4NzQ4MjQxOjE1ODMwMTcyMDAwMDA=",
            "node": {
              "dateTime": "2020-02-29T18:00+01:00"
            }
          },
          {
            "cursor": "MjY4OTA5MzIyOjE1ODMwMjQ0MDAwMDA=",
            "node": {
              "dateTime": "2020-02-29T20:00+01:00"
            }
          },
          {
            "cursor": "MjY5MDY2OTczOjE1ODM0NTY0MDAwMDA=",
            "node": {
              "dateTime": "2020-03-05T20:00+01:00"
            }
          }
        ]
      }
    }
  }
}

Second query. We use the last cursor to obtain the next page:

{
  groupByUrlname(urlname: "Diviertete-Bailando") {
    pastEvents (input: {first: 10, after: "MjY5MDY2OTczOjE1ODM0NTY0MDAwMDA="}) {
      count
      pageInfo {
        hasNextPage
        endCursor
      }
      edges {
        cursor
        node
        {
          dateTime
        }
      }
    }
  }
}

Response (last page.)

{
  "data": {
    "groupByUrlname": {
      "pastEvents": {
        "count": 19,
        "pageInfo": {
          "hasNextPage": false,
          "endCursor": "MjgyMzQ1MDU2OjE2Mzk4NzIwMDAwMDA="
        },
        "edges": [
          {
            "cursor": "MjY5MjUzOTQyOjE1ODU0NDAwMDAwMDA=",
            "node": {
              "dateTime": "2020-03-28T20:00+01:00"
            }
          },
          {
            "cursor": "MjY5MjYxODU0OjE1ODU4NzIwMDAwMDA=",
            "node": {
              "dateTime": "2020-04-02T20:00+02:00"
            }
          },
          {
            "cursor": "MjgwOTkxMTg0OjE2MzM4MjA0MDAwMDA=",
            "node": {
              "dateTime": "2021-10-09T19:00+02:00"
            }
          },
          {
            "cursor": "MjgwOTkxMTkxOjE2MzQ0MjUyMDAwMDA=",
            "node": {
              "dateTime": "2021-10-16T19:00+02:00"
            }
          },
          {
            "cursor": "MjgxNDgxNjIzOjE2MzYyMzk2MDAwMDA=",
            "node": {
              "dateTime": "2021-11-06T19:00+01:00"
            }
          },
          {
            "cursor": "MjgyMDQzODMyOjE2MzgwNTc2MDAwMDA=",
            "node": {
              "dateTime": "2021-11-27T19:00+01:00"
            }
          },
          {
            "cursor": "MjgyMzQ1MDU2OjE2Mzk4NzIwMDAwMDA=",
            "node": {
              "dateTime": "2021-12-18T19:00+01:00"
            }
          }
        ]
      }
    }
  }
}

If you sum up the number of events it is 17, while it should be 19. If I change the pagination number from 10 to a different number, I get a different number of events.

jjmerchante avatar Feb 16 '22 13:02 jjmerchante

Here is the error:

The GraphQL API doesn't return all the events for a group using pagination. You can execute the following queries using Meetup GraphQL playground:

We want to get (for example) all the events of the "Diviertete-Bailando" group. The API should retrieve 19 past events:

First query

{
  groupByUrlname(urlname: "Diviertete-Bailando") {
    pastEvents (input: {first: 10, after: null}) {
      count
      pageInfo {
        hasNextPage
        endCursor
      }
      edges {
        cursor
        node
        {
          dateTime
        }
      }
    }
  }
}

Response (10 events)

{
  "data": {
    "groupByUrlname": {
      "pastEvents": {
        "count": 19,
        "pageInfo": {
          "hasNextPage": true,
          "endCursor": "MjY5MDY2OTczOjE1ODM0NTY0MDAwMDA="
        },
        "edges": [
          {
            "cursor": "MjY4NDU2NDE1OjE1ODEyMDY0MDAwMDA=",
            "node": {
              "dateTime": "2020-02-08T19:00+01:00"
            }
          },
          {
            "cursor": "MjY4MjkyNzczOjE1ODEyMTM2MDAwMDA=",
            "node": {
              "dateTime": "2020-02-08T21:00+01:00"
            }
          },
          {
            "cursor": "MjY4MzU0MTk4OjE1ODE4MDc2MDAwMDA=",
            "node": {
              "dateTime": "2020-02-15T18:00+01:00"
            }
          },
          {
            "cursor": "MjY4MzU0MDU3OjE1ODE4MTQ4MDAwMDA=",
            "node": {
              "dateTime": "2020-02-15T20:00+01:00"
            }
          },
          {
            "cursor": "MjY4Mzk0OTc0OjE1ODI0MTI0MDAwMDA=",
            "node": {
              "dateTime": "2020-02-22T18:00+01:00"
            }
          },
          {
            "cursor": "MjY4Mzk0OTc2OjE1ODI0MTk2MDAwMDA=",
            "node": {
              "dateTime": "2020-02-22T20:00+01:00"
            }
          },
          {
            "cursor": "MjY4OTA4MTk2OjE1ODI4NTE2MDAwMDA=",
            "node": {
              "dateTime": "2020-02-27T20:00+01:00"
            }
          },
          {
            "cursor": "MjY4NzQ4MjQxOjE1ODMwMTcyMDAwMDA=",
            "node": {
              "dateTime": "2020-02-29T18:00+01:00"
            }
          },
          {
            "cursor": "MjY4OTA5MzIyOjE1ODMwMjQ0MDAwMDA=",
            "node": {
              "dateTime": "2020-02-29T20:00+01:00"
            }
          },
          {
            "cursor": "MjY5MDY2OTczOjE1ODM0NTY0MDAwMDA=",
            "node": {
              "dateTime": "2020-03-05T20:00+01:00"
            }
          }
        ]
      }
    }
  }
}

I have run again both queries. On the first one I am getting the same result.

Second query. We use the last cursor to obtain the next page:

{
  groupByUrlname(urlname: "Diviertete-Bailando") {
    pastEvents (input: {first: 10, after: "MjY5MDY2OTczOjE1ODM0NTY0MDAwMDA="}) {
      count
      pageInfo {
        hasNextPage
        endCursor
      }
      edges {
        cursor
        node
        {
          dateTime
        }
      }
    }
  }
}

Response (last page.)

{
  "data": {
    "groupByUrlname": {
      "pastEvents": {
        "count": 19,
        "pageInfo": {
          "hasNextPage": false,
          "endCursor": "MjgyMzQ1MDU2OjE2Mzk4NzIwMDAwMDA="
        },
        "edges": [
          {
            "cursor": "MjY5MjUzOTQyOjE1ODU0NDAwMDAwMDA=",
            "node": {
              "dateTime": "2020-03-28T20:00+01:00"
            }
          },
          {
            "cursor": "MjY5MjYxODU0OjE1ODU4NzIwMDAwMDA=",
            "node": {
              "dateTime": "2020-04-02T20:00+02:00"
            }
          },
          {
            "cursor": "MjgwOTkxMTg0OjE2MzM4MjA0MDAwMDA=",
            "node": {
              "dateTime": "2021-10-09T19:00+02:00"
            }
          },
          {
            "cursor": "MjgwOTkxMTkxOjE2MzQ0MjUyMDAwMDA=",
            "node": {
              "dateTime": "2021-10-16T19:00+02:00"
            }
          },
          {
            "cursor": "MjgxNDgxNjIzOjE2MzYyMzk2MDAwMDA=",
            "node": {
              "dateTime": "2021-11-06T19:00+01:00"
            }
          },
          {
            "cursor": "MjgyMDQzODMyOjE2MzgwNTc2MDAwMDA=",
            "node": {
              "dateTime": "2021-11-27T19:00+01:00"
            }
          },
          {
            "cursor": "MjgyMzQ1MDU2OjE2Mzk4NzIwMDAwMDA=",
            "node": {
              "dateTime": "2021-12-18T19:00+01:00"
            }
          }
        ]
      }
    }
  }
}

If you sum up the number of events it is 17, while it should be 19. If I change the pagination number from 10 to a different number, I get a different number of events.

Now I am getting good results. The number of events is ok (now it is 20), and changing the pagination number does not change the number of events.

Here is the response:

{
    "data": {
      "groupByUrlname": {
        "pastEvents": {
          "count": 20,
          "pageInfo": {
            "hasNextPage": false,
            "endCursor": "MjgzNTI4NjYzOjE2NDc3MzA4MDAwMDA="
          },
          "edges": [
            {
              "cursor": "MjY5MDY1MTU5OjE1ODM2MjkyMDAwMDA=",
              "node": {
                "dateTime": "2020-03-07T20:00+01:00"
              }
            },
            {
              "cursor": "MjY5MjUzOTQyOjE1ODU0NDAwMDAwMDA=",
              "node": {
                "dateTime": "2020-03-28T20:00+01:00"
              }
            },
            {
              "cursor": "MjY5MjYxODU0OjE1ODU4NzIwMDAwMDA=",
              "node": {
                "dateTime": "2020-04-02T20:00+02:00"
              }
            },
            {
              "cursor": "MjY5MDAwMzM2OjE1ODY2NDk2MDAwMDA=",
              "node": {
                "dateTime": "2020-04-11T20:00+02:00"
              }
            },
            {
              "cursor": "MjgwOTkxMTg0OjE2MzM4MjA0MDAwMDA=",
              "node": {
                "dateTime": "2021-10-09T19:00+02:00"
              }
            },
            {
              "cursor": "MjgwOTkxMTkxOjE2MzQ0MjUyMDAwMDA=",
              "node": {
                "dateTime": "2021-10-16T19:00+02:00"
              }
            },
            {
              "cursor": "MjgxNDgxNjIzOjE2MzYyMzk2MDAwMDA=",
              "node": {
                "dateTime": "2021-11-06T19:00+01:00"
              }
            },
            {
              "cursor": "MjgyMDQzODMyOjE2MzgwNTc2MDAwMDA=",
              "node": {
                "dateTime": "2021-11-27T19:00+01:00"
              }
            },
            {
              "cursor": "MjgyMzQ1MDU2OjE2Mzk4NzIwMDAwMDA=",
              "node": {
                "dateTime": "2021-12-18T19:00+01:00"
              }
            },
            {
              "cursor": "MjgzNTI4NjYzOjE2NDc3MzA4MDAwMDA=",
              "node": {
                "dateTime": "2022-03-19T19:00+01:00"
              }
            }
          ]
        }
      }
    }
  }
  

It seems the API now is working properly, so maybe they have fixed the bug.

Pablohn26 avatar Mar 23 '22 12:03 Pablohn26