0

他人のGitHubのissue一覧を見れるようにした

ソース
https://github.com/shokai/github-cmd


これの続き
橋本商会 » githubの自分のリポジトリのissue一覧を見るツール
橋本商会 » githubのissue見るコマンドにissue番号だした

他人やorganizationのリポジトリのissue一覧を見れるようにした。
ちょっかいかけたい人や就職したい組織に対して、issueにpull requestして存在感をアピールするのに有効だと思う。

実行時引数に複数の名前を入れられるので

% github-issues shokai masuilab masui --all
で自分と研究室と先生のissueが全部まとめて日付順で見れる。

0

GitHubの自分の全リポジトリのissueを一覧するwebサービス作った

GitHubのissue機能が好きすぎてヤバイので、最近90日以内に更新した全リポジトリのopenなissueを表示するサービスを作った。


何か思いつく毎にissueに書いて開発してて、手詰まりになったり精神が調子悪くなったら一旦手を止めて別のプロジェクトのissueを潰すようにしてると永遠にプログラマーズハイ状態を維持できるんだけど、自分の持っているissueを一覧できるページがGitHubにない。
GitHubには通知機能があるけど参加したりアサインされたissueしか通知されないので、全く手付かずのissueはだんだん下の方に下がっていって見つからなくなってしまう。
なので自分の持っているリポジトリ全体のissueを一覧したかった。


最近は21個のリポジトリをいじってて、73個もissue溜まってるんだなという事がわかる。

GitHub Issue Viewer



ソースコード
shokai/github-issue · GitHub


経緯

もともとこれ
githubの自分のリポジトリのissue一覧
を使っていたんだけど動かなくなったのでカッとなって作った。でもさっきgithubのパスワードリセットしたら動くようになった。意味なかった。
意味ないけどスマホでも見れるからまあいいかも・・


実装

SinatraでGitHub OAuthする (2)にissue表示する機能を足しただけなので、だいたい2時間ぐらいでできた。
issueの取得には時間がかかるから、1つリポジトリ取得する毎にsinatra-rocketioでブラウザに送っている。
取得したissueはmemcachedに3日間とっておいてる。

0

SinatraでGitHub OAuthする (2)

SinatraでGitHub OAuthするの続き

試しにGitHub認証して、成功したらリポジトリとGistの一覧を表示するだけのアプリを作ってHerokuに置いておいた
http://sinatra-github-oauth-sample.herokuapp.com/

ソースコード
shokai/sinatra-github-oauth-sample · GitHub


https://github.com/settings/applicationsからRegister new Applicationした
OAuthのコールバックは /auth.callback に来る。



右上からログインすると


一度GitHubに移動してから戻ってきて、GitHub APIが使われてリポジトリとGistの一覧が出てくる
右上にGitHubに登録したアイコンが表示される。


1. GitHub認証して(これはSinatraでGitHub OAuthするに書いた)
2. 乱数とMD5でセッションID作ってブラウザに渡して
3. memcachedにセッションIDをkeyにしてgithubの情報を入れておく(2週間でexpireする)
4. トップページでは、ログイン状態ならoauth tokenをoctokitに渡してGitHubからリポジトリ/Gist一覧を取得する(これはmemcacheで1時間保持する)

必要な時にmemcachedからユーザー情報を取り出せるhelperを書いた
libs/cache.rbcontroller/auth.rbに処理を詰め込んであるので、この2つだけコピーすれば他のSinatraアプリにもGitHubログイン機能追加できるはず。

RackやSinatraのログイン系のプラグインを使っても良いかと思ったが、memcachedクライアントにpure rubyかつバイナリプロトコルサポートしているdalliを使いたかったのと、
1つのmemcachedのkeyにprefix付けてログイン情報とリポジトリ/Gist一覧を保存できるようにしたかったので自分で書いた libs/cache.rb に任せた。配列のようにアクセスするとkeyにprefixが付いて読み書きできて便利。

0

SinatraでGitHub OAuthする

Webアプリに「GitHubで認証」ボタンを付けてログインさせる方法。


アプリを登録

https://github.com/settings/applications
からRegister new Applicationする。

ローカルで試すので、URLとコールバックURLはこうしておく

自分のアプリケーションのIDとsecret keyがもらえるのでメモしておく。(あとで使う)


OAuthする

ここに手順が書いてある。この通りにやればOAuthのtokenが手に入る。
OAuth | GitHub API
tokenが手に入れば、あとはoctokitなどにtokenを渡せばそのユーザーの権限でAPIを使わせてもらえる。


手順はおおまかに

1. GET https://github.com/login/oauth/authorize

ユーザーのWebブラウザをGETパラメータにアプリケーションID付けて上のURLにredirectする。
OAuthの承認画面が表示され、OKされればアプリ登録時に設定したURLにcallbackされる。

2. コールバックから”code”を取り出す。

callback URLに指定した通り、ユーザーのWebブラウザで http://localhost:5000/auth.callback が開かれる。
その時にGETパラメータで”code”が付いているので、実際のURLは
http://localhost:5000/auth.callback?code=1234abcd56
こうなる。
codeを取っておく。

3. POST https://github.com/login/oauth/access_token

Sinatraから上のURLにPOSTする。
“code”とアプリケーションIDとsecretをPOSTすると、ようやくOAuthのtokenが得られる。

4. tokenでOAuth認証

tokenで認証して、ようやく「この人がGitHub上でなんというアカウント名なのか」「持っているリポジトリ一覧」などが取得できるようになる。
ここからはoctokit使えばいいと思う。

なお1の時にscope(読み書き権限の詳細)やstate(クロスサイトリクエスト対策の文字列)を付ける事もできる。
無くても一応動く。


実装

起動前にRegister new Applicationした時に得たアプリケーションIDとsecretを環境変数に入れておく。
export GITHUB_APP_ID=a1b2cdef344565677asdf
export GITHUB_APP_SECRET=asdfhujikohujiko123456


あとはこのアプリを起動して、 /auth に移動させれば認証できる。

require "sinatra"
require "uri"
require "httparty"

get '/auth' do
query = {
:client_id => ENV["GITHUB_APP_ID"],
:redirect_uri => "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}/auth.callback",
}.map{|k,v|
"#{k}=#{URI.encode v}"
}.join("&")
redirect "https://github.com/login/oauth/authorize?#{query}"
end

get '/auth.callback' do
code = params["code"]
halt 400, "bad request (code)" if code.to_s.empty?

## get oauth token
query = {
:body => {
:client_id => ENV["GITHUB_APP_ID"],
:client_secret => ENV["GITHUB_APP_SECRET"],
:code => code
},
:headers => {
"Accept" => "application/json"
}
}
res = HTTParty.post("https://github.com/login/oauth/access_token", query)
halt 500, "github auth error" unless res.code == 200
begin
token = JSON.parse(res.body)["access_token"] ## tokenを取得!
rescue
halt 500, "github auth error"
end
## sessionに保存するなど自由に
redirect '/'
end


取得したtokenはoctokitで使える。
require 'octokit'

client = Octokit::Client.new :oauth_token => token
user = client.user
user.avatar_url # アイコン画像

0

githubのissue見るコマンドにissue番号だした

便利

shokai/github-cmd · GitHub