GitHubアカウントをtsvに保存して取得してみる。
開発環境
- Windows XP Pro SP3 32bit
- cmd.exe
- Python 2.7.2
- q 1.5.0
入手先
TSV
TSVファイルにはGitHubアカウント情報を設定する想定。
- GitHubAccount.tsv
- GitHubAccessToken.tsv
- GitHubOAuth.tsv
GitHubのユーザ名をキーにして、パスワード、AccessToken、CientIdなどを管理する。
ファイル名 | 保存項目 |
---|---|
GitHubAccount.tsv | パスワードとメールアドレス |
GitHubAccessToken.tsv | アクセストークン |
GitHubOAuth.tsv | CientIdとClientSecret |
パスワードなどの値はすべてダミー。
GitHubAccount.tsv
Username | Password | MailAddress | Created |
---|---|---|---|
user1 | pass1 | user1@domain.com | 2013/04/01 |
user0002 | pass2 | user2@domain.com | 2014/11/08 |
user3 | pass3 | user3@domain.com | 2015/12/15 |
user4 | pass4 | user4@domain.com | 2016/08/30 |
Username Password MailAddress Created
user1 pass1 user1@domain.com 2013/04/01
user0002 pass2 user2@domain.com 2014/11/08
user3 pass3 user3@domain.com 2015/12/15
user4 pass4 user4@domain.com 2016/08/30
なお、パスワードが平文で保存されているのはセキュリティ的に最悪である。 暗号化すべき。でも、今回はそこまで調べるつもりはない。
GitHubAccessToken.tsv
Username | AccessToken | TokenDescription | Created |
---|---|---|---|
user1 | 1R23456789abcdefghijklmnopqrstuvwxyz0123 | RepositoryControl | 2016/10/01 |
user1 | 1G23456789abcdefghijklmnopqrstuvwxyz0123 | GistControl | 2016/10/01 |
user2 | 2R23456789abcdefghijklmnopqrstuvwxyz0123 | RepositoryControl | 2016/10/01 |
user2 | 2G23456789abcdefghijklmnopqrstuvwxyz0123 | GistControl | 2016/10/01 |
user3 | 3R23456789abcdefghijklmnopqrstuvwxyz0123 | RepositoryControl | 2016/10/01 |
user3 | 3G23456789abcdefghijklmnopqrstuvwxyz0123 | GistControl | 2016/10/01 |
user4 | 4R23456789abcdefghijklmnopqrstuvwxyz0123 | RepositoryControl | 2016/10/01 |
user4 | 4G23456789abcdefghijklmnopqrstuvwxyz0123 | GistControl | 2016/10/01 |
user4 | 4F23456789abcdefghijklmnopqrstuvwxyz0123 | FullControl | 2016/10/01 |
Username AccessToken TokenDescription Created
user1 1R23456789abcdefghijklmnopqrstuvwxyz0123 RepositoryControl 2016/10/01
user1 1G23456789abcdefghijklmnopqrstuvwxyz0123 GistControl 2016/10/01
user2 2R23456789abcdefghijklmnopqrstuvwxyz0123 RepositoryControl 2016/10/01
user2 2G23456789abcdefghijklmnopqrstuvwxyz0123 GistControl 2016/10/01
user3 3R23456789abcdefghijklmnopqrstuvwxyz0123 RepositoryControl 2016/10/01
user3 3G23456789abcdefghijklmnopqrstuvwxyz0123 GistControl 2016/10/01
user4 4R23456789abcdefghijklmnopqrstuvwxyz0123 RepositoryControl 2016/10/01
user4 4G23456789abcdefghijklmnopqrstuvwxyz0123 GistControl 2016/10/01
user4 4F23456789abcdefghijklmnopqrstuvwxyz0123 FullControl 2016/10/01
OAuthApplications.tsv
Username | ApplicationName | ClientId | ClientSecret | Created |
---|---|---|---|---|
user1 | test | 1TCI34567890abcdefgh | 1TCS34567890abcdefghijklmnopqrstuvwx | 2016/10/01 |
user2 | test | 2TCI34567890abcdefgh | 2TCS34567890abcdefghijklmnopqrstuvwx | 2016/10/01 |
user3 | test | 3TCI34567890abcdefgh | 3TCS34567890abcdefghijklmnopqrstuvwx | 2016/10/01 |
user4 | test | 4TCI34567890abcdefgh | 4TCS34567890abcdefghijklmnopqrstuvwx | 2016/10/01 |
Username ApplicationName ClientId ClientSecret Created
user1 test 1TCI34567890abcdefgh 1TCS34567890abcdefghijklmnopqrstuvwx 2016/10/01
user2 test 2TCI34567890abcdefgh 2TCS34567890abcdefghijklmnopqrstuvwx 2016/10/01
user3 test 3TCI34567890abcdefgh 3TCS34567890abcdefghijklmnopqrstuvwx 2016/10/01
user4 test 4TCI34567890abcdefgh 4TCS34567890abcdefghijklmnopqrstuvwx 2016/10/01
バッチファイル
@echo off
::
:: qコマンドのテスト
::
:: TSVファイルからSQLのselect文にてデータを取得する。
::
:: qコマンド
:: http://harelba.github.io/q/
set q=C:\root\tool\System\q-1.5.0\bin\q.bat
:: 対象ファイル
set Tsv_Account=GitHubAccount.tsv
set Tsv_Token=GitHubAccessToken.tsv
set Tsv_OAuth=GitHubOAuthApplication.tsv
set TABLE=%Tsv_Account%
:: 全ユーザを取得する
setlocal enabledelayedexpansion
set USERS=
for /f "usebackq tokens=*" %%i in (`%q% -H -t "select username from %TABLE%"`) do (
set USERS=!USERS!^
%%i
)
:: 複数行データ
echo ----------qコマンドから取得した複数行のユーザ名----------
echo !USERS!
::echo ---------------------------------------------------------
echo ----------ユーザ名一覧----------
for %%I in ( %USERS% ) do echo [%%I]
::echo --------------------------------
echo ----------各ユーザのAccessToken('RepositoryControl')一覧----------
:: http://jisakupc-technical.info/programing/491/
set TABLE=%Tsv_Token%
set AccessToken=
for %%I in ( %USERS% ) do (
FOR /F "usebackq" %%i in (`%q% -H -t "select AccessToken from %TABLE% where username == '%%I' and TokenDescription == 'RepositoryControl'"`) DO set AccessToken=%%i
echo [%%I] !AccessToken!
)
::echo --------------------------------
set max_len_username=
FOR /F "usebackq" %%i in (`%q% -H -t "select MAX(LENGTH(username)) from %Tsv_Account%"`) DO @set max_len_username=%%i
echo ユーザ名の最大長:%max_len_username%
echo ----------各ユーザのAccessToken('RepositoryControl')一覧----------
:: http://jisakupc-technical.info/programing/491/
:: http://piyopiyocs.blog115.fc2.com/blog-entry-899.html
::set pad=16
set pad=%max_len_username%
set Username=
set TABLE=%Tsv_Token%
set AccessToken=
:: set userspace=0000000000000000%%I
for %%I in ( %USERS% ) do (
FOR /F "usebackq" %%i in (`%q% -H -t "select AccessToken from %TABLE% where username == '%%I' and TokenDescription == 'RepositoryControl'"`) DO set AccessToken=%%i
set userspace= %%I
set userspace=!userspace:~-%pad%!
echo !userspace! !AccessToken!
)
::echo --------------------------------
endlocal
:: アカウント件数を取得する
set TABLE=%Tsv_Account%
set account_num=
::call %q% -H -t "select COUNT(*) from %TABLE%"
FOR /F "usebackq" %%i in (`%q% -H -t "select COUNT(*) from %TABLE%"`) DO set account_num=%%i
echo アカウント件数 : %account_num%
:: AccessTokenの文字数を取得する
set whereUser=user3
set len_AccessToken=
::call %q% -H -t "select LENGTH(AccessToken) from GitHubAccessToken.tsv where username == '%whereUser%' and TokenDescription == 'RepositoryControl'"
FOR /F "usebackq" %%i in (`%q% -H -t "select LENGTH(AccessToken) from GitHubAccessToken.tsv where username == '%whereUser%' and TokenDescription == 'RepositoryControl'"`) DO @set len_AccessToken=%%i
echo AccessTokenの文字列長:%len_AccessToken%
:: ユーザ名の文字数を取得する
set whereUser=user3
set len_username=
::echo ユーザ名の文字数(%whereUser%)
::call %q% -H -t "select LENGTH(username) from %Tsv_Account% where username == '%whereUser%'"
FOR /F "usebackq" %%i in (`%q% -H -t "select LENGTH(username) from %Tsv_Account% where username == '%whereUser%'"`) DO @set len_username=%%i
echo ユーザ名の文字数(%whereUser%):%len_username%
:: ユーザ名の最大長
::echo ユーザ名の最大長
::call %q% -H -t "select MAX(LENGTH(username)) from %Tsv_Account%"
set max_len_username=
FOR /F "usebackq" %%i in (`%q% -H -t "select MAX(LENGTH(username)) from %Tsv_Account%"`) DO @set max_len_username=%%i
echo ユーザ名の最大長:%max_len_username%
:: ソート。
echo ---------- ソート。新しい順に並べ替える ----------
call %q% -H -t "select username, created from %Tsv_Account% order by Created desc"
echo --------------------------------------------------
:: エラー。%%が展開されずにqに渡されているっぽい
:: query error: near "%": syntax error
:: %q% -H -t "select RPAD(username, %max_len_username%, '-') from %Tsv_Account%"
:: エラー。RPAD関数はない
:: query error: no such function: RPAD
:: %q% -H -t "select RPAD(username, 12, '-') from %Tsv_Account%"
:: サブクエリは使えない?
::call %q% -H -t "select LENGTH(username) from %Tsv_Account% where LENGTH(username) > (select MAX(LENGTH(username)) from %Tsv_Account%)
:: ユーザの存在確認
::set whereUser=someUsername
set whereUser=user3
set username=
::%q% -H -t "select * from %TABLE% where username == '%whereUser%'"
FOR /F "usebackq" %%i in (`%q% -H -t "select * from %TABLE% where username == '%whereUser%'"`) DO set username=%%i
if "%username%" == "%whereUser%" (
echo ユーザ存在確認:ある:%whereUser%
) else (
echo ユーザ存在確認:ない:%whereUser%
)
set whereUser=user3
set password=
FOR /F "usebackq" %%i in (`%q% -H -t "select password from %TABLE% where username == '%whereUser%'"`) DO @set password=%%i
echo %whereUser% のパスワードは %password% です。
set MailAddress=
FOR /F "usebackq" %%i in (`%q% -H -t "select mailaddress from %TABLE% where username == '%whereUser%'"`) DO @set MailAddress=%%i
echo %whereUser% のメアドは %MailAddress% です。
set TABLE=%Tsv_Token%
set AccessToken=
FOR /F "usebackq" %%i in (`%q% -H -t "select AccessToken from %TABLE% where username == '%whereUser%' and TokenDescription == 'RepositoryControl'"`) DO @set AccessToken=%%i
echo %whereUser% の repo用アクセス・トークンは %AccessToken% です。
::echo (TokenDescription == 'RepositoryControl'のもののみ)
set TABLE=%Tsv_OAuth%
set ClientId=
FOR /F "usebackq" %%i in (`%q% -H -t "select ClientId from %TABLE% where username == '%whereUser%' and ApplicationName == 'test'"`) DO @set ClientId=%%i
echo %whereUser% の test ClientIdは %ClientId% です。
::echo (ApplicationName == 'test'のもののみ)
set TABLE=%Tsv_OAuth%
set ClientSecret=
FOR /F "usebackq" %%i in (`%q% -H -t "select ClientSecret from %TABLE% where username == '%whereUser%' and ApplicationName == 'test'"`) DO @set ClientSecret=%%i
echo %whereUser% の test ClientSecretは %ClientSecret% です。
::echo (ApplicationName == 'test'のもののみ)
::endlocal
pause
@echo on
所感
いろいろやってみた。
これだけ操作できれば不自由はしないと思う。