Last active
August 12, 2020 04:31
-
-
Save mike820324/c3f49c04684659a6607e78c950dabb33 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const graphql_query = ` | |
query UserStreamOverview($userId: ID!, $pagingOptions: PagingOptions) { | |
user(username: $userId) { | |
name | |
profileStreamConnection(paging: $pagingOptions) { | |
...commonStreamConnection | |
__typename | |
} | |
__typename | |
} | |
} | |
fragment commonStreamConnection on StreamConnection { | |
pagingInfo { | |
next { | |
limit | |
page | |
source | |
to | |
ignoredIds | |
__typename | |
} | |
__typename | |
} | |
stream { | |
...StreamItemList_streamItem | |
__typename | |
} | |
__typename | |
} | |
fragment StreamItemList_streamItem on StreamItem { | |
...StreamItem_streamItem | |
__typename | |
} | |
fragment StreamItem_streamItem on StreamItem { | |
itemType { | |
__typename | |
... on StreamItemPostPreview { | |
post { | |
id | |
mediumUrl | |
title | |
firstPublishedAt | |
creator { | |
name | |
} | |
previewImage { | |
id | |
} | |
tags { | |
id | |
} | |
__typename | |
} | |
__typename | |
} | |
} | |
__typename | |
} | |
` | |
const page_limit = 25; | |
async function get_medium_post(username, page) { | |
let graphql_body = { | |
"operationName": "UserStreamOverview", | |
"query": graphql_query, | |
"variables": { | |
"userId": username, | |
"pagingOptions": { | |
"limit": page_limit, | |
"page": null, | |
"source": null, | |
"to": page ? String(page) : String(Date.now()), | |
"ignoredIds":null | |
} | |
} | |
} | |
// NOTE: sending request to rss2json to help us transofrm rss to json data | |
let resp = await fetch( | |
"https://medium.com/_/graphql", | |
{ | |
method: "POST", | |
headers: { | |
"Content-Type": "application/json" | |
}, | |
body: JSON.stringify(graphql_body) | |
} | |
); | |
// NOTE: strip non-post items and strip description fields | |
let resp_data = await resp.json(); | |
let author = resp_data.data.user.name; | |
let posts = resp_data.data.user.profileStreamConnection.stream | |
.map(stream => { | |
return stream.itemType.post | |
}) | |
.map(post => { | |
return { | |
"title": post.title, | |
"link": post.mediumUrl, | |
"pubDate": post.firstPublishedAt, | |
"thumbnail": "https://miro.medium.com/focal/875/263/11/60/" + post.previewImage.id, | |
"categories": post.tags.map(tag_obj => tag_obj.id) | |
} | |
} | |
); | |
if (posts.length === page_limit) { | |
next = resp_data.data.user.profileStreamConnection.pagingInfo.next.to; | |
} else { | |
next = null; | |
} | |
return { | |
"author": author, | |
"posts": posts, | |
"next": next | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment