TI8比赛刚刚过去,趁热介绍一个dota2的python包,叫dota2api,在上面能查到公开的一些比赛数据。dota2api是一个python模块,由一个外国人将V社提供的官方API封装而成,查看其源码请戳这。
通过pip安装
$ pip install dota2api
如果pip安装不成功,可从github处下载源码,执行其中的setup文件进行安装
$ git clone https://github.com/joshuaduffy/dota2api/ && cd dota2api/
$ python setup.py install
参照原文
class dota2api.Initialise(api_key=None, executor=None, language=None, logging=None, raw_mode=None)
从始至终都要调用的一个对象,通过它内置的一些方法获取数据,除api_key
外,其他都为非必需参数。
api_key
api_key
的获取使用你的steam账号从这获取api_key
,如果以前从没有注册过,随便写个域名就行了,重点是密钥后面的字符串,我们就是用它来通过steam获取Dota2的数据信息。
api_key
的使用注意api_key为一个字符串变量
>>> import dota2api
>>> api = dota2api.Initialise("你的api_key", raw_mode=True)
$ export D2_API_KEY='your api_key'
executor
默认为None,不用管它language
传入字符集名称,默认为None,即使用en_US字符集。可传入zh_CN即可表示为中文logging
是否打印输出日志,默认为None,不打印。raw_mode
是否将输出变为可读的数据,默认为True。感觉就是输出格式好看了一点get_game_items
get_game_items()
获取全部装备信息
{'items': [{'id': 1,
'name': 'item_blink',
'cost': 2250,
'secret_shop': 0,
'side_shop': 1,
'recipe': 0,
'localized_name': '闪烁匕首',
'url_image': 'http://cdn.dota2.com/apps/dota2/images/items/blink_lg.png'},
{'id': 2,
'name': 'item_blades_of_attack',
'cost': 430,
'secret_shop': 0,
'side_shop': 0,
'recipe': 0,
'localized_name': '攻击之爪',
'url_image': 'http://cdn.dota2.com/apps/dota2/images/items/blades_of_attack_lg.png'},
{'id': 3,
'name': 'item_broadsword',
'cost': 1200,
...}
'status':200}
items
所有装备信息组成一个列表存储在此字段中
id
装备idname
装备名称,注意cost
购买装备所花费金钱secret_shop
是否在神秘商店出售side_shop
是否在边路商店出售recipe
是否需要合成卷轴localized_name
装备官方全称,例如这件装备是跳刀,如果初始化时未指定language
参数,这个字段的值就为Blink Dagger,如果指定language
参数为zh_CN,那么这个字段的值就为闪烁匕首url_image
装备图片所在url,已不可用status
请求状态码get_heroes
get_heroes()
获取所有英雄信息
{'heroes': [{'name': 'npc_dota_hero_antimage',
'id': 1,
'localized_name': '敌法师',
'url_small_portrait': 'http://cdn.dota2.com/apps/dota2/images/heroes/antimage_sb.png',
'url_large_portrait': 'http://cdn.dota2.com/apps/dota2/images/heroes/antimage_lg.png',
'url_full_portrait': 'http://cdn.dota2.com/apps/dota2/images/heroes/antimage_full.png',
'url_vertical_portrait': 'http://cdn.dota2.com/apps/dota2/images/heroes/antimage_vert.jpg'},
{'name': 'npc_dota_hero_axe',
'id': 2,
'localized_name': '斧王',
'url_small_portrait': 'http://cdn.dota2.com/apps/dota2/images/heroes/axe_sb.png',
'url_large_portrait': 'http://cdn.dota2.com/apps/dota2/images/heroes/axe_lg.png',
'url_full_portrait': 'http://cdn.dota2.com/apps/dota2/images/heroes/axe_full.png',
'url_vertical_portrait': 'http://cdn.dota2.com/apps/dota2/images/heroes/axe_vert.jpg'},
{'name': 'npc_dota_hero_bane',
'id': 3,
'localized_name': '祸乱之源',
...}
'status': 200,
'count': 116}
heroes
所有英雄的信息组成一个列表存储在此字段中
name
英雄名称id
英雄idlocalized_name
英雄官方名全称,例如敌法的英文名是Anti-Mage,中文名是敌法师url_small_portrait
英雄小头像url_large_portrait
英雄大头像url_full_portrait
英雄超大型头像url_vertical_portrait
英雄超大型头像,长度大于宽度status
网页状态码count
英雄数量get_league_listing
get_league_listing()
获取所有联赛信息
{'leagues': [{'name': '“乐者为王”Dota 2联赛',
'leagueid': 1212,
'description': '64支巴西顶尖的业余战队将争夺首届“乐者为王”Dota 2联赛的冠军头衔。',
'tournament_url': 'https://binarybeast.com/xDOTA21404228/',
'itemdef': 10541},
{'name': 'joinDOTA联赛第3赛季',
'leagueid': 1640,
'description': 'Dota 2全球赛事,面向所有玩家!激烈的比赛中不乏高手的顶尖对决,也有业余战队的精彩过招。每售出一张门票奖金都将增加1.00美元!',
'tournament_url': 'http://www.joindota.com/en/leagues/',
'itemdef': 10742},
{'name': 'Killing Spree:北美系列赛',
'leagueid': 25,
'description': 'Killing Spree是长期的战队争霸活动,参赛队伍是四支来自北美的顶尖战队。每支队伍想要获胜必须一路奋战,连赢三场,达到“大杀特杀(killing spree)”。比赛由NEO Dota主办。',
...}
leagues
返回值仅含的一个字段,所有联赛信息按时间顺序组成一个列表储存在此字段中
name
联赛全称,TI8中文全称为2018年国际邀请赛公开预选赛,英文全称为The International 2018 Open Qualifiersleagueid
联赛iddescription
联赛简介tournament_url
联赛简介urlitemdef
似乎这个数越大,比赛日期就越靠后get_match_details
get_match_details(match_id=None, **kwargs)
获取比赛详细信息,其中match_id
即比赛编号,为必选参数。
{'players': [{'account_id': 125581247,
'player_slot': 0,
'hero_id': 109,
'item_0': 1,
'item_1': 46,
'item_2': 63,
'item_3': 116,
'item_4': 236,
'item_5': 154,
'backpack_0': 0,
'backpack_1': 0,
'backpack_2': 0,
'kills': 7,
'deaths': 5,
'assists': 11,
'leaver_status': 0,
'last_hits': 338,
'denies': 24,
'gold_per_min': 546,
'xp_per_min': 540,
'level': 21,
'hero_damage': 19005,
'tower_damage': 1047,
'hero_healing': 0,
'gold': 1652,
'gold_spent': 17510,
'scaled_hero_damage': 12613,
'scaled_tower_damage': 611,
'scaled_hero_healing': 0,
'ability_upgrades': [{'ability': 5621, 'time': 948, 'level': 1},
{'ability': 5619, 'time': 1032, 'level': 2},
{'ability': 5621, 'time': 1134, 'level': 3},
...]
...]
'radiant_win': False,
'duration': 2188,
'pre_game_duration': 90,
'start_time': 1535249730,
'match_id': 4080856812,
'match_seq_num': 3539243234,
'tower_status_radiant': 4,
'tower_status_dire': 2036,
'barracks_status_radiant': 3,
'barracks_status_dire': 63,
'cluster': 113,
'first_blood_time': 153,
'lobby_type': 1,
'human_players': 10,
'leagueid': 9870,
'positive_votes': 14848,
'negative_votes': 859,
'game_mode': 2,
'flags': 1,
'engine': 1,
'radiant_score': 34,
'dire_score': 35,
'radiant_team_id': 15,
'radiant_name': 'PSG.LGD',
'radiant_logo': 927056072280704321,
'radiant_team_complete': 1,
'dire_team_id': 2586976,
'dire_name': 'OG',
'dire_logo': 862855679982708969,
'dire_team_complete': 0,
'radiant_captain': 101695162,
'dire_captain': 19672354,
'picks_bans': [{'is_pick': False, 'hero_id': 67, 'team': 0, 'order': 0},
{'is_pick': False, 'hero_id': 19, 'team': 1, 'order': 1},
{'is_pick': False, 'hero_id': 12, 'team': 0, 'order': 2},
{'is_pick': False, 'hero_id': 6, 'team': 1, 'order': 3},
{'is_pick': False, 'hero_id': 58, 'team': 0, 'order': 4},
...]
'lobby_name': 'Practice',
'game_mode_name': 'Captains Mode',
'cluster_name': 'US West'}
players
比赛选手信息组成一个列表储存在这个字段中
account_id
选手的账号id
player_slot
一个8位二进制数,第一位代表选手的队伍,最后三位代表在团队的位置(注意返回的为一个十进制数,需要进行转码)
hero_id
选手挑选的英雄id
hero_name
英雄全称
item_0
,item_1
,item_2
,item_3
,item_4
,item_5
比赛结束时选手装备栏物品对应的id
item_0_name
,item_1_name
,item_2_name
,item_3_name
,item_4_name
,item_5_name
装备栏物品对应名称(如果item_3=0
那么将不会有item_3_name
这个字段)
backpack_0
,backpack_1
,backpack_2
比赛结束时选手三个背包栏中物品对应id
kills
杀人数
deaths
死亡数
assists
助攻数
denies
反补数
gold_per_min
GPM,每分钟金钱
xp_per_min
XPM,每分钟经验
level
比赛结束时英雄等级
hero_damage
对敌方造成的总伤害量
tower_damage
对敌方塔造成的总伤害量
hero_healing
总治疗量
gold
比赛结束时金钱
gold_spent
总花费金钱
ability_upgrades
升级技能树
ability
技能代号time
升级时间level
级别radiant_win
天辉方是否取得胜利,1代表是,0代表否
duration
比赛持续时间,以s为单位
pre_game_duration
赛前ban-pick消耗时间
start_time
开始时间,为一个10位的时间戳
match_id
比赛编号
match_seq_num
tower_status_radiant
天辉方防御塔状态,一个16位的二进制数(注意返回的为一个十进制数,需要进行转码)。
barracks_status_radiant
天辉方兵营状态,一个8位的二进制数(注意返回的为一个十进制数,需要进行转码)
first_blood_time
一血时间(s)
leagueid
联赛id
radiant_score
天辉方杀人数
dire_score
夜魇方杀人数
radiant_team_id
天辉方队伍id
radiant_name
天辉方队伍名称
dire_team_id
夜魇方队伍id
dire_name
夜魇方队伍名称
radiant_captain
picks_bans
比赛BP情况
is_pick
是否为选人hero_id
BP的英雄team
所属队伍,0表示天辉,1表示夜魇game_mode_name
游戏模式名称
get_match_history
get_match_history(account_id=None, **kwargs)
获取历史比赛信息
account_id
玩家ID,只显示该玩家最近的比赛信息hero_id
英雄ID,只显示最近的关于该英雄的比赛信息league_id
联赛ID,只显示该联赛中的比赛信息start_at_match_id
比赛ID,只显示时间早于该比赛的比赛信息matches_requested
设置显示比赛的场数,默认为100tournament_games_only
限制显示的比赛为官方举办的锦标赛{'status': 1,
'num_results': 100,
'total_results': 500,
'results_remaining': 400,
'matches': [{'match_id': 4109095754,
'match_seq_num': 3561915451,
'start_time': 1536499629,
'lobby_type': 4,
'radiant_team_id': 0,
'dire_team_id': 0,
'players': [{'account_id': 4294967295, 'player_slot': 0, 'hero_id': 49},
{'account_id': 872413016, 'player_slot': 1, 'hero_id': 36},
{'account_id': 4294967295, 'player_slot': 2, 'hero_id': 111},
{'account_id': 4294967295, 'player_slot': 3, 'hero_id': 69},
{'account_id': 4294967295, 'player_slot': 4, 'hero_id': 65},
{'player_slot': 128, 'hero_id': 2},
{'player_slot': 129, 'hero_id': 15},
{'player_slot': 130, 'hero_id': 20},
{'player_slot': 131, 'hero_id': 4},
{'player_slot': 132, 'hero_id': 37}]},
{'match_id': 4109094705,
'match_seq_num': 3561913149,
'start_time': 1536499598,
'lobby_type': 0,
'radiant_team_id': 0,
'dire_team_id': 0,
...}]
}
num_results
显示的比赛信息数目total_results
全部符合条件的比赛信息数目results_remaining
剩余未显示的比赛信息数目matches
包含比赛信息的列表
get_player_summaries
get_player_summaries(steamids=None, **kwargs)
获取玩家steam账号的主页,头像,在线状态等信息
{'players': [{'steamid': '76561198067128891',
'communityvisibilitystate': 2,
'profilestate': 1,
'personaname': 'sqm',
'lastlogoff': 1536298714,
'profileurl': 'https://steamcommunity.com/id/106863163/',
'avatar': 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/07/0770d08f36d7a9aa5272a2e2ff5be29ebc7dd55a.jpg',
'avatarmedium': 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/07/0770d08f36d7a9aa5272a2e2ff5be29ebc7dd55a_medium.jpg',
'avatarfull': 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/07/0770d08f36d7a9aa5272a2e2ff5be29ebc7dd55a_full.jpg',
'personastate': 0}]}
steamids
一个包含玩家32位ID的列表,如果是64位会被强行转为32位注意还有个64位ID,steamID_64 = steamID_32 + 76561197960265728
steamid
玩家64位的steamIDcommunityvisibilitystate
资料可见性状态码personaname
steam账号名称lastlogoff
玩家最后一次登陆steam时间戳profileurl
玩家主页urlavatar
,avatarmedium
,avatarfull
玩家不同大小的头像personastate
玩家在线状态码get_team_info_by_team_id
get_team_info_by_team_id(start_at_team_id=None, **kwargs)
获取一系列按ID升序排列的战队信息
{'status': 1,
'teams': [{'name': 'PSG.LGD',
'tag': 'PSG.LGD',
'time_created': 1338727837,
'calibration_games_remaining': 3,
'logo': 927056072280704321,
'logo_sponsor': 965345547605295955,
'country_code': 'cn',
'url': '',
'games_played': 1400,
'player_0_account_id': 89217927,
'player_1_account_id': 89399750,
'player_2_account_id': 89407113,
'player_3_account_id': 89598554,
'player_4_account_id': 92590479,
'player_5_account_id': 94296097,
'player_6_account_id': 94738847,
'admin_account_id': 118678359}]}
start_at_team_id
按ID指定从某个战队开始显示teams_requested
限制显示的战队数目status
状态码,成功获取战队信息则为1,否则为其他数值teams
包含战队信息的数组
name
战队名称tag
战队简称time_created
战队成立时间戳country_code
战队所属的国家,ISO 3166-1 country code。见维基百科games_played
当前队员在该战队进行的总比赛数player_0_account_id
,player_1_account_id
… 战队当前队员steamIDadmin_account_id
战队team admin(团队管理员???)IDget_tournament_prize_pool
get_tournament_prize_pool(leagueid=None)
获取联赛奖金池信息
{'prize_pool': 25532177,
'league_id': 9870,
'status': 200}
prize_pool
奖金池总金额update_game_items
update_game_items()
将从get_game_items
方法得到的返回值保存,替代安装模块中的ref\items.json
文件
update_heroes
update_heroes()
将从get_heroes
方法得到的返回值保存,替代安装模块中的ref\heroes.json
文件
get_live_league_games
get_live_league_games()
获取正在直播的比赛信息,也就是DOTA2客户端那个观战列表里的比赛
见原文
get_top_live_games
get_top_live_games(partner='')
获取客户端观战人数排名前十的比赛
见原文