Folding@home Top 500に入っている日本チームを手動でリストアップするのは辛いのでPythonスクリプトを書こうと思い調べたらFolding@home APIがあった。
Folding@home API
curlコマンドを使う場合は次のようになる。ここでteamの後の番号はチームIDである。
- $ curl -G https://api.foldingathome.org/team/257261
ソースコード
Pythonのrequestsモジュールを使い書き換え、次のコードを作成した。Folding@homeでは国別の統計データがないのでトップ500のチームはチーム名、URLやその他情報を元に選んだ。抜けている場合は連絡頂ければありがたい。なお、新たなチームの追加や削除は8行目のjapan_team_idsを変更すればよい。
import datetime import json import re import requests from operator import attrgetter japan_team_ids = [162, 222, 106346, 252872, 253284, 254402, 255396, 257002, 257261, \ 257728, 258804, 259660, 260900, 261481, 263245, 263536, 263798, 264491] class JapanTeam: def __init__(self, id, rank, name, founder, wus, score): self.id = id self.rank = rank self.name = name self.founder = founder self.wus = wus self.score = score teams = [] for id in japan_team_ids: url = 'https://api.foldingathome.org/team/' + str(id) response = requests.get(url) dict = json.loads(response.text) teams.append(JapanTeam(dict['id'],dict['rank'],dict['name'],dict['founder'], \ dict['wus'], dict['score'])) teams = sorted(teams, key=attrgetter('rank')) date = datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S') print(" *** Folding@home Ranking in Japan (",date,") ***") print(" No Rank Name ID Score Works") for i in range(0, len(teams)): print('{0:>3} {1:>4} {2:<25} {3:>8} {4:>13} {5:>10}'.format(i+1, teams[i].rank, teams[i].name, teams[i].id, teams[i].score, teams[i].wus))
実行方法
- 上のコードにrank.pyと名前を付けて保存し、次のコマンドを実行する。実行結果は上の図である。
- $ python3 rank.py
問題点としては、チーム数(現在、17)だけHTTPリクエスト・レスポンスを処理しているので30秒ほど時間がかかることである。
コメント
コメントだとコードのインデントがなくなってしまうみたいですね。
forの前に適当のスペースを入れてください。
ありがとうございます。スペース入れました。
perlだとこんな感じですかね
(json_ppが破滅的な文字列を返さないと信じてevalを使ってます)
#!/bin/perl
chomp ( $date = `date +’%Y/%m/%d %H:%m:%S’` );
print ” *** Folding\@home Ranking in Japan ($date) ***\n”;
print ” No Rank Name ID Score Works\n”;
$d{$_} = eval `curl -s https://api.foldingathome.org/team/$_ | json_pp -t dumper`
for ( 162, 222, 106346, 252872, 253284, 254402, 255396, 257002, 257261, 257728,
258804, 259660, 260900, 261481, 263245, 263536, 263798, 264491 );
printf “%3d %4d %-25s %8d %13d %10d\n”, ++$no, $d{$_}{rank}, $d{$_}{name}, $_, $d{$_}{score}, $d{$_}{wus}
for sort { $d{$a}{rank} $d{$b}{rank} } keys %d;
ありがとうございます。