说实在的个人对游戏并没有多大的兴趣,但唯独对暴雪的Diablo系列很有感情,去年年初开始玩Diablo3,断断续续,感觉最麻烦的是选择技能,每次版本更新可能都有更优的build,这对于我这样的业余玩家来说可不是件好事,好在宏伟秘境后有了天梯,借鉴排名在前的高级玩家们build总没错,于是花了点时间写了这个脚本。
脚本只是统计了主动技能、被动技能和传奇宝石的使用情况,理论上统计其它如装备等信息也是一样简单可行的,但Diablo装备的生成机制使得统计这个没有多大意义,相同的装备属性可能各有优劣,难以比较,而且某些装备坑爹的掉率也不是你想要就能有的。
题外话,不得不说Python太适合写这类功能相对简单的脚本了,一个字:快。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
|
# -*- coding: utf-8 -*-
"""
Diablo3 排名前1000玩家英雄使用技能统计
python diablo.py help
python diablo.py [barbarian|crusader|demon-hunter|monk'|witch-doctor|wizard]
默认使用的是亚服的数据,如果需要美服或欧服,更改`_rank_page`和`_api`变量地址即可
Copyright (c) 2015 JinnLynn <eatfishlin@gmail.com>
Released under the terms of the MIT license.
"""
from __future__ import unicode_literals, print_function, absolute_import
import os
import sys
import urllib2
import json
import re
__version__ = '1.0.0'
__author__ = 'JinnLynn <eatfishlin@gmail.com>'
__license__ = 'The MIT License'
__copyright__ = 'Copyright 2015 JinnLynn'
# 排名页面
_rank_page = 'http://tw.battle.net/d3/zh/rankings/'
# api
_api = 'http://tw.battle.net/api/d3/'
_api_profile = os.path.join(_api, 'profile' )
_api_data = os.path.join(_api, 'data' )
_hero_classes = {
'barbarian' : '野蠻人' , 'crusader' : '聖教軍' , 'demon-hunter' : '狩魔獵人' ,
'monk' : '武僧' , 'witch-doctor' : '巫醫' , 'wizard' : '秘術師' }
_retry = 5
_hero_class = ''
_active_skills = {}
_passive_skills = {}
_unique_gems = {}
def _clear_output(msg = ''):
sys.stdout.write( '\r{:30}' . format ( ' ' ))
sys.stdout.write( '\r{}' . format (msg))
sys.stdout.flush()
def _process(stated, total):
msg = '英雄数据分析中... {}/{}' . format (stated, total)
_clear_output(msg)
def _get(url, is_json = True ):
# print('GET: ', url)
retry = 5 if _retry < 1 else _retry
while retry > 0 :
try :
req = urllib2.urlopen(url.encode( 'utf8' ), timeout = 10 )
return json.load(req) if is_json else req.read()
except KeyboardInterrupt, e:
raise e
except Exception, e:
retry - = 1
# print('retry', retry, e)
# raise e
def _api_url( * args, * * kwargs):
slash = kwargs.get( 'slash' , False )
args = [ unicode (arg) for arg in args]
url = os.path.join( * args).rstrip( '/' )
return url + '/' if slash else url
def get_era():
req = urllib2.urlopen(_rank_page)
return req.geturl().split( '/' )[ - 2 ]
def get_rank_page_url(era):
url_part = 'rift-'
if _hero_class = = 'demon-hunter' :
url_part + = 'dh'
elif _hero_class = = 'witch-doctor' :
url_part + = 'wd'
else :
url_part + = _hero_class
return os.path.join(_rank_page, 'era' , era, url_part)
def fetch_rank_list():
tags = []
try :
_clear_output( '获取当前游戏纪元...' )
era = get_era()
_clear_output( '获取当前排名前1000的玩家...' )
url = get_rank_page_url(era)
html = _get(url, is_json = False )
# re parse
lst = re.findall(
r "a href=\"(.*)\" id="codetool">
延伸 · 阅读
精彩推荐
|