grimoirelab-perceval
grimoirelab-perceval copied to clipboard
[meetup] Change REST API to GraphQL API
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."}]}
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.
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.