自分のuser名で、ページ付きで検索をする。
let url = `https://api.github.com/users/${u}/gists?page=${i}`
//ex. u=gnjo,i = 1 ... 100
ページが存在するかは headerの linkで見ることができるが、存在しないページを表示すれば、配列が[]で返ってくるので打ち切りがわかる。
if(d.length==0) return sol(ary)
1pageは30gistまで検索できる。20 loop とりあえずする。
1gistは truncatedなしで300fileまで表示できる。
function searchall(sys,max=20){return new Promise(sol=>{
let ary=[],i=1
,str =sys.auth
,url =`https://api.github.com/users/${sys.u}/gists`
,opt={method:'GET',mode:'cors',headers:{"Authorization":str}}
,f=()=>{
let u=`${url}?page=${i}`
,loop =(d)=>{
if(d.length==0) return sol(ary)
;[].push.apply(ary,d);
if(i>max) return sol(ary)
i++;
return f()
}
;
return fetch(u,opt).then(res=>res.json()).then(loop)
}
;
f()///
;
})}
結果最大で180000filesまで表示可能。
これだけあれば十分だろう。
実際のデータは raw_urlを表示するのみ。認証は必要なし。
function read(raw_url){
let log=(d)=>{console.log(d);return d}
return fetch(raw_url)
.then(d=>d.text())
.then(log)
;
}
全部
pickを変更して、必要な情報の取捨をする。
<button onclick="b()">go</button>
<pre></pre>
function searchall(sys,max=20){return new Promise(sol=>{
let ary=[],i=1
,str =sys.auth
,url =`https://api.github.com/users/${sys.u}/gists`
,opt={method:'GET',mode:'cors',headers:{"Authorization":str}}
,f=()=>{
let u=`${url}?page=${i}`
,loop =(d)=>{
if(d.length==0) return sol(ary)
;[].push.apply(ary,d);
if(i>max) return sol(ary)
i++;
return f()
}
;
return fetch(u,opt).then(res=>res.json()).then(loop)
}
;
f()///
;
})}
;
function b(){
var u= window.prompt('u?');
if(!u) return;
var p =window.prompt('p?');
if(!p) return;
var sys={};
sys.u =u
sys.auth ='basic '+btoa(sys.u+':'+p)
;
let draw =(d)=>{document.querySelector('pre').innerHTML = JSON.stringify(d,null,2);return d;}
,pick =(d)=>{
let ary=[];
d.forEach(d=>{
Object.keys(d.files).forEach(key=>{
let add ={id_url:d.url, id:d.id, description:d.description}
ary.push( Object.assign({},d.files[key],add) )
})
})
;
return ary;
}
,log=(d)=>{console.log(d);return d}
;
//30*20 =max 600gist 600*300files =max 180000 files
searchall(sys,20)
.then(log)
.then(pick) //
.then(draw)
;
}
//raw_url be the no-auth.
function read(raw_url){
let log=(d)=>{console.log(d);return d}
return fetch(raw_url)
.then(d=>d.text())
.then(log)
;
}