Open nameisxi opened 2 years ago
Jälkimmäisen esimerkin README.md:
Firstly, GitHub API doesn't allow sorting by contributions, so instead it is first sorted by number of followers to get a larger list, which is then sorted by contributions. This means you need a minimum number of followers to be on this list. Each page shows the minimum number of followers needed.
Eli varmaankin vähiten huono ratkaisu on vaan kerryttää mahdollisimman iso lista henkilöitä ja sortata ne kontribuutioiden määrän mukaan? Mikä on kaiketi se mitä tehdään jo tällä hetkellä?
Eikun niin joo nythän ei varsinaisesti tehdä itse mitään käyttäjiä listaavaa kyselyä. Eli varmaan tää olis hyvä korvata suoralla GraphQL-kyselyllä, jotta voidaan hakea enemmän kuin top 1000 eniten seurattua käyttäjää?
Toinen puute tossa github haussa on atm se että noi sijaintitiedot taitaa olla vapaata tekstiä. Näköjään github osaa kuitenkin matchata kaupungit niiden sisältämiin maihin (esim. "South Korea" = "Seoul, South Korea") ainakin joissain tapauksissa.
Tein tän copy paste-luonnoksen jossain editorissa, koitan lisätä ens viikolla paginaation ja tarvittavat kentät tohon
query {
search(type: USER, query:"type:user sort:followers-desc location:South Korea location:Republic of Korea location:Seoul, location:Korea", first:50) {
userCount
edges {
node {
__typename
... on User {
login
avatarUrl
name
company
location
organizations(first: 100) {
nodes {
login
}
}
followers {
totalCount
}
contributionsCollection {
contributionCalendar {
totalContributions
}
totalCommitContributions
totalPullRequestContributions
restrictedContributionsCount
}
}
}
cursor
}
}
}
tää
Kyllä.
Toinen puute tossa github haussa on atm se että noi sijaintitiedot taitaa olla vapaata tekstiä. Näköjään github osaa kuitenkin matchata kaupungit niiden sisältämiin maihin (esim. "South Korea" = "Seoul, South Korea") ainakin joissain tapauksissa.
Joo ne valitettavasti on vapaata tekstiä. Noi mun linkkaamat resurssit sisältää listan joitain muitakin kaupunkeja, mutta mä voin antaa täyden listan kun tarvetta.
Tein tän copy paste-luonnoksen jossain editorissa, koitan lisätä ens viikolla paginaation ja tarvittavat kentät tohon
query { search(type: USER, query:"type:user sort:followers-desc location:South Korea location:Republic of Korea location:Seoul, location:Korea", first:50) { userCount edges { node { __typename ... on User { login avatarUrl name company location organizations(first: 100) { nodes { login } } followers { totalCount } contributionsCollection { contributionCalendar { totalContributions } totalCommitContributions totalPullRequestContributions restrictedContributionsCount } } } cursor } } }
Tiiätkö miten kallis toi on rate limitin kannalta? Kuinka monta käyttäjää tolla saa per tunti? Ainakin GitHubin Search endpoint on kaikista kallein ja sillä saa vaan 30 kutsua per tunti. Toisaalta se oli muistaakseni erillinen "core" endpointeista joiden quota per tunti on 5000 callia.
Tein tän copy paste-luonnoksen jossain editorissa, koitan lisätä ens viikolla paginaation ja tarvittavat kentät tohon
query { search(type: USER, query:"type:user sort:followers-desc location:South Korea location:Republic of Korea location:Seoul, location:Korea", first:50) { userCount edges { node { __typename ... on User { login avatarUrl name company location organizations(first: 100) { nodes { login } } followers { totalCount } contributionsCollection { contributionCalendar { totalContributions } totalCommitContributions totalPullRequestContributions restrictedContributionsCount } } } cursor } } }
Ja kiitti organisaatioiden lisäyksestä! Yhden asiakkaan kaks main halua oli nähdä organisaatiot ja ohjelmointikielien käyttömäärä vuosi vuodelta -- jälkimmäinen on luultavasti liian kallis toteuttaa, mut kerron siitä lisää myöhemmin
https://github.com/nameisxi/outliers-backend/tree/main/scratch Täällä datat ja käytetty skripti. Github sallii max 100 rivin palauttamisen per request. Toi search-endpointti palauttaa max 1000 käyttäjää per kysely (eli 10 requestia/sivua).
Ainoa keino kiertää rajoitusta on käyttää tavallaan manuaalista paginaatiota siinä päällä sorttaamalla ja rajaamalla jonkun kentän perusteella. followers
toimisi muuten, mutta niin harvalla käyttäjällä on yhtään seuraajaa että suunnilleen 1000 seuratuimman käyttäjän jälkeen rajaus ei enää tuota tuloksia.
Sain ton nyt kuitenkin toimimaan sorttaamalla ja rajaamalla repojen määrän perusteella. Numerot ei ihan täsmää githubin ilmoittamaan käyttäjämäärään verratessa, eli datassa on varmasti jonkun verran duplikaatteja johtuen github apin outouksista, mutta sain ladattua noin 50k käyttäjää, eli käytännössä kaikki Korean sijainnikseen merkinneet käyttäjät joilla on yli 6 repoa.
Tiputin kyselystä aika paljon kenttiä pois rate limitin välttämiseksi (GraphQL-apin kohdalla rate limit lasketaan vähän jännästi), mutta ainakin käyttäjänimet tms löytyy.
Täällä datat ja käytetty skripti. Github sallii max 100 rivin palauttamisen per request. Toi search-endpointti palauttaa max 1000 käyttäjää per kysely (eli 10 requestia/sivua).
Eli jos ymmärsin oikein, niin kun search endpoint palauttaa 1000 resulttia, niin core API määrää, että joudut vielä paginoimaan ne 100 paloissa?
Sain ton nyt kuitenkin toimimaan sorttaamalla ja rajaamalla repojen määrän perusteella. Numerot ei ihan täsmää githubin ilmoittamaan käyttäjämäärään verratessa, eli datassa on varmasti jonkun verran duplikaatteja johtuen github apin outouksista, mutta sain ladattua noin 50k käyttäjää, eli käytännössä kaikki Korean sijainnikseen merkinneet käyttäjät joilla on yli 6 repoa.
IMO parempi kun follower count joka ei meinaa mitään. Mut tohon pitää ehkä keksiä vielä joku "on ollut aktiivinen viimeisenä kolmena vuotena" ehto, kuten contributionCallendarin käyttö, jos näyttää siltä että liian moni noista käyttäjistä on täysin inaktiivinen.
Tiputin kyselystä aika paljon kenttiä pois rate limitin välttämiseksi (GraphQL-apin kohdalla rate limit lasketaan vähän jännästi), mutta ainakin käyttäjänimet tms löytyy.
Ai, mut ainakin mun käsityksen mukaan ne kentät joita oon valinnu "kuuluu" jo siihen User datan piiriin, eikä vaatinu ylimääräsiä kyselyitä. Ehitkö testaan tota ratelimit ongelmaa ja millä kentillä? Voisin tsekata tota lisää.
Edit: puhuit varmaan näistä kentistä:
organizations(first: 100) {
nodes {
login
}
}
followers {
totalCount
}
contributionsCollection {
contributionCalendar {
totalContributions
}
totalCommitContributions
totalPullRequestContributions
restrictedContributionsCount
}
Esimerkki 1: https://github.com/gayanvoice/top-github-users Esimerkki 2: https://github.com/lauripiispanen/most-active-github-users-counter