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;
ありがとうございます。