osu吧 关注:168,985贴子:1,921,648

osu!API用法

只看楼主收藏回复

突然想从GitHub搬到主吧来,不知道有没有人看 (
URL:https://osu.ppy.sh/api/
Api 版本: 1.0
概览
这个API是为了方便用户开发一些基于屙屎的第三方小程序而设计的。
它还不够成熟,并且主要是根据用户的需求来编写的,如果你有任何改进想法,请向本条目提交Issue。带上你的用途,加快我们的速度——如果我看到你的想法会被用在什么很屌的东西上,我会很愿意马上添加它。
使用条款
使用它的目的应该是建设而不是破坏。拒绝滥用。如果你有可能造成滥用,在使用前询问我们。本条目最终解释权归ppy。
目前,我们对并发请求的设置特别的高,每分钟可以发起1200个请求,作为对爆发请求的兼容,最高可以达到1400.
如果这还满足不了你,我们有理由怀疑你触犯了上一条关于滥用的规则。如果你每分钟发起超过60个请求,最好给ppy吱一声。
申请步骤
https://osu.ppy.sh/p/api申请一个API-KEY。


1楼2017-04-12 01:53回复
    谱面相关
    /api/get_beatmaps
    概览:返回通用的谱面信息。
    URL:/api/get_beatmaps
    参数:
    k - api key (必须)
    since - 返回在该日期之后ranked的所有谱面。必须是MySQL格式。
    s - 指定一个谱面的SetID。(/s/xxxxx)
    b - 指定一个谱面的Beatmap ID。(/b/xxxxx)
    u - 指定一个用户名/用户数字id。
    type - 指定u参数是数字id还是用户名。对于数字id,该参数值为id,而用户名则参数值为string。默认为智能识别,在纯数字用户名时可能出现问题。
    m - 模式 (0 = osu!, 1 = Taiko, 2 = CtB, 3 = osu!mania). 默认返回所有模式的谱面。
    a - 指定是否包括被转换的谱面(?) (0 = 不包括, 1 = 包括). 只在包含了m参数,并且不为0的情况下有效.被转换的谱面显示它们转换后的难度。默认为0。
    h - 谱面哈希值。举个栗子,如果你尝试获取某个rep对应的谱面,而osr文件只包含谱面的哈希值。(例子:a5b99395a42bd55bc5eb1d2411cbdf8b). 默认情况下, 返回的谱面与Hash值无关。
    limit - 返回值的数量. 默认值(同样是最大值)是500。
    返回值:
    一个包含所有符合指定条件的、ranked谱面的JSON列表。每个难度一个列表。
    [{"approved" : "1", // 4 = loved, 3 = qualified, 2 = approved, 1 = ranked, 0 = pending, -1 = WIP, -2 = graveyard
    "approved_date" : "2013-07-02 01:01:12", // ranked日期, 时区为UTC+8
    "last_update" : "2013-07-06 16:51:22", // 最后更新日期,时区同上。 如果谱面被Unranked之后Reranked,该日期可能晚于上面的日期。
    "artist" : "Luxion",
    "beatmap_id" : "252002", // 每个难度的Beatmap_ID
    "beatmapset_id" : "93398", // 所有难度的BeatmapSet_ID
    "bpm" : "196",
    "creator" : "RikiH_",
    "difficultyrating" : "5.59516", // 游戏中和网站上的难度星数
    "diff_size" : "4", // CS
    "diff_overall" : "6", // OD
    "diff_approach" : "7", // AR
    "diff_drain" : "6", // HP
    "hit_length" : "113", // 第一个note到最后一个note的间隔(不计算breaks)
    "source" : "BMS",
    "genre_id" : "1", // 0 = any, 1 = unspecified, 2 = video game, 3 = anime, 4 = rock, 5 = pop, 6 = other, 7 = novelty, 9 = hip hop, 10 = electronic (note that there's no 8)
    "language_id" : "5", // 0 = any, 1 = other, 2 = english, 3 = japanese, 4 = chinese, 5 = instrumental, 6 = korean, 7 = french, 8 = german, 9 = swedish, 10 = spanish, 11 = italian
    "title" : "High-Priestess", // 歌曲名称
    "total_length" : "145", // 第一个note到最后一个note的间隔(计算breaks)
    "version" : "Overkill", // 难度名
    "file_md5" : "c8f08438204abfcdd1a748ebfae67421", // 谱面文件(不知道是.osz还是.osu)的MD5哈希值
    "mode" : "0", // 模式,
    "tags" : "melodious long", // tags
    "favourite_count" : "121", // 被收藏的次数。特别的,该条目采用英式英语,而不是美式英语(favorite_count)
    "playcount" : "9001", // 被玩(。)的次数
    "passcount" : "1337", // 被pass的次数(玩家没有fail或者retry)
    "max_combo" : "2101" // 最大combo数
    }, { ... }, ...]


    2楼2017-04-12 01:54
    收起回复
      谱面内容的demo
      【这部分GitHub是没有的,自己编一个作为例子,后面几项用法类似,替换URL中的部分就可以了。】
      网址格式:osu.ppy.sh/api/get_beatmaps?k=【你申请的API KEY】&b=1167438
      用Chrome访问会直接将JSON文件打印出来,而IE则会弹出下载提示。
      [{"beatmapset_id":"551125","beatmap_id":"1167438","approved":"1","total_length":"61","hit_length":"60","version":"BunnyExtinction","file_md5":"f6d0769a54458c8b6ff99c4f163e5b0a","diff_size":"4.6","diff_overall":"8.1","diff_approach":"9","diff_drain":"6","mode":"0","approved_date":"2017-04-11 23:00:37","last_update":"2017-04-04 17:38:38","artist":"3R2","title":"Bounce Bounce","creator":"Nozhomi","bpm":"158","source":"Rabi-Ribi","tags":"\u30e9\u30d3-\u30ea\u30d3 rabiribi original soundtrack kano-bi crespirit animen sekai project plurk gemayue erina xinely","genre_id":"2","language_id":"5","favourite_count":"11","playcount":"795","passcount":"186","max_combo":"381","difficultyrating":"4.5120086669921875"}]
      这些就是Beatmap ID为1167438(osu.ppy.sh/b/1167438)的歌曲信息。
      作为JSON格式,虽然它运用了JavaScript语法,却能被很多语言解析,比如PHP,JAVA,.NET,Python等等等等,还可以转换为xml等其他格式。


      3楼2017-04-12 02:08
      回复
        用户
        /api/get_user
        概览:返回用户信息。
        URL:/api/get_user
        参数:
        k - api key (必须)
        u - 指定一个用户名/用户数字id。
        m - 模式(0 = osu!, 1 = Taiko, 2 = CtB, 3 = osu!mania).默认值为0。
        type - 指定u参数是数字id还是用户名。对于数字id,该参数值为id,而用户名则参数值为string。默认为智能识别,在纯数字用户名时可能出现问题。
        event_days - 打出最后成绩的日期(last event date),距离现在的最大天数。取值范围为1-31,默认值为1。
        【实际使用时好像没有用。同时指定u参数和该参数,和直接指定u参数没有区别。单指定该参数没有返回。】
        回复
        包含用户信息的JSON列表。
        [{"user_id" : "1",
        "username" : "User name",
        "count300" : "1337",
        "count100" : "123",
        "count50" : "69",
        "playcount" : "42", // 以上四条为所有Ranked,Approved,Loved谱面中的计数
        "ranked_score" : "666666", // 所有Ranked,Approved,Loved谱面中的最高分计数
        "total_score" : "999999998", // 所有Ranked,Approved,Loved谱面中所有成绩的总分。
        "pp_rank" : "2442",
        "level" : "50.5050",
        "pp_raw" : "3113", // 不活跃的玩家PP值是0,以将他们排除出PP榜单
        "accuracy" : "98.1234",
        "count_rank_ss": "54",
        "count_rank_s" : "81", // 获得的SS S A的数目
        "count_rank_a" : "862",
        "country" : "DE", // 使用ISO3166-1 alpha-2国家命名规范。 参考http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2/wiki/ISO_3166-1_alpha-2
        "pp_country_rank":"1337", // 国内的PP排名
        "events" : [{ // 记录这个用户上传的成绩【但是实际应用并没有获取到】
        "display_html": "<img src='\/images\/A_small.png'\/>...",//评级对应的图片
        "beatmap_id": "222342",
        "beatmapset_id": "54851",
        "date": "2013-07-07 22:34:04",
        "epicfactor": "1" // 这个成绩有多么的“史诗级”,取值范围是1-32
        }, { ... }, ...]
        }]


        4楼2017-04-12 02:31
        收起回复
          分数
          /api/get_scores
          概览:获取某张地图前100名的分数信息。
          URL:/api/get_scores
          参数:
          k - api key (必须)
          b - 指定一个谱面的Beatmap ID。(/b/xxxxx)(必须)
          u - 指定一个要返回分数的用户名/用户数字id。
          m - 模式 (0 = osu!, 1 = Taiko, 2 = CtB, 3 = osu!mania),默认为0。
          mods -指定一个或者一些mod (具体用法参见后文)
          type - 指定u参数是数字id还是用户名。对于数字id,该参数值为id,而用户名则参数值为string。默认为智能识别,在纯数字用户名时可能出现问题。
          limit - 返回值的数量. 默认值是50,最大值是100。
          返回值:
          包含选定谱面前100分数信息的JSON列表。
          [{"score" : "1234567",
          "username" : "User name",
          "count300" : "300",
          "count100" : "50",
          "count50" : "10",
          "countmiss" : "1",
          "maxcombo" : "321",
          "countkatu" : "10",
          "countgeki" : "50",
          "perfect" : "0", // 只有取得了地图的最大cb时,该值为1
          "enabled_mods" : "76", // 具体参见枚举
          "user_id" : "1",
          "date" : "2013-06-22 9:11:16",
          "rank" : "SH",
          "pp" : "1.3019" //4位小数
          },
          { ...},
          ...]
          enum Mods
          {
          None = 0,
          NoFail = 1,
          Easy = 2,
          //NoVideo = 4,
          Hidden = 8,
          HardRock = 16,
          SuddenDeath = 32,
          DoubleTime = 64,
          Relax = 128,
          HalfTime = 256,
          Nightcore = 512, // 只和DT搭配使用。例如带NC的成绩,返回576(512+64)
          Flashlight = 1024,
          Autoplay = 2048,
          SpunOut = 4096,
          Relax2 = 8192,// Autopilot?
          Perfect = 16384,
          Key4 = 32768,
          Key5 = 65536,
          Key6 = 131072,
          Key7 = 262144,
          Key8 = 524288,
          keyMod = Key4 | Key5 | Key6 | Key7 | Key8,
          FadeIn = 1048576,
          Random = 2097152,
          LastMod = 4194304,
          FreeModAllowed = NoFail | Easy | Hidden | HardRock | SuddenDeath | Flashlight | FadeIn | Relax | Relax2 | SpunOut | keyMod,
          Key9 = 16777216,
          Key10 = 33554432,
          Key1 = 67108864,
          Key3 = 134217728,
          Key2 = 268435456
          }


          5楼2017-04-12 02:47
          收起回复
            Best Performance
            /api/get_user_best
            概览
            获取指定用户的BP
            URL:/api/get_user_best
            参数:
            k - api key (必须)
            u - 指定一个要返回分数的用户名/用户数字id。
            m - 模式 (0 = osu!, 1 = Taiko, 2 = CtB, 3 = osu!mania),默认为0。
            limit - 返回值的数量. 默认值是10,最大值是100。
            type - 指定u参数是数字id还是用户名。对于数字id,该参数值为id,而用户名则参数值为string。默认为智能识别,在纯数字用户名时可能出现问题。
            返回值
            包含了指定用户的BP前10的JSON列表。
            [{"beatmap_id" : "222342",
            "score" : "1234567",
            "username" : "User name",
            "maxcombo" : "321",
            "count300" : "300",
            "count100" : "50",
            "count50" : "10",
            "countmiss" : "1",
            "countkatu" : "10",
            "countgeki" : "50",
            "perfect" : "0", //只有取得了地图的最大cb时,该值为1
            "enabled_mods" : "76", //具体参见前文枚举
            "user_id" : "1",
            "date" : "2013-06-22 9:11:16",
            "rank" : "SH",
            "pp" : "1.3019" //四位小数
            },
            { ... },
            ...]


            6楼2017-04-12 02:52
            回复
              最近的游戏记录
              /api/get_user_recent
              概览:获取玩家最近的10次游戏记录。
              URL:/api/get_user_recent
              参数:与获取BP一样,只不过limit的最大值是50。
              返回值:包含玩家最近10次游戏记录的JSON列表。
              格式与BP一致,不再赘述


              7楼2017-04-12 03:02
              回复
                MP历史记录
                /api/get_match
                概览:返回一把mp的历史记录。
                URL:/api/get_match
                参数:
                k - api key (必须)
                mp - 房间id(必须)【可以邀请其他玩家,从邀请链接中获取】
                Response
                包括房间信息和玩家成绩的JSON列表。
                [{"match":{"match_id" : "1936471",
                "name" : "Marcin's game",
                "start_time" : "2013-10-06 03:34:54",
                "end_time" : null // 并不支持——永远是null },
                "games":[{
                "game_id" : "45668898",
                "start_time" : "2013-10-06 03:36:27",
                "end_time" : "2013-10-06 03:40:01",
                "beatmap_id" : "181717",
                "play_mode" : "0", // standard = 0, taiko = 1, ctb = 2, o!m = 3
                "match_type" : "0", // 并不支持
                "scoring_type" : "0", // 胜利条件:score = 0, accuracy = 1, combo = 2, score v2 = 3
                "team_type" : "0", // 比赛模式:Head to head = 0, Tag Co-op = 1, Team vs = 2, Tag Team vs = 3
                "mods" : "0", // 房间使用的Mod,参看前文
                "scores" : [{"slot" : "0", // 从0开始,按玩家所在的玩家位排列
                "team" : "0", // 未开启队伍模式则为0, 1为蓝队,2为红队
                "user_id" : "722665",
                "score" : "3415874",
                "maxcombo" : "411",
                "rank" : "0", //并不支持
                "count50" : "0",
                "count100" : "11",
                "count300" : "425",
                "countmiss" : "1",
                "countgeki" : "67",
                "countkatu" : "9",
                "perfect" : "0", //最大CB
                "pass" : "1" // 如果玩家在结尾失败了则为0,pass或者复活了则为1},
                { ... } ...] },
                { ... }, ...]
                }]


                9楼2017-04-12 03:17
                收起回复
                  获取rep数据
                  /api/get_replay
                  概览
                  获取指定玩家在指定谱面的rep。
                  并发请求限制
                  该请求对服务器负担较大,每分钟只允许10次查询。同样请注意该请求不是为批处理预设的。
                  URL:/api/get_replay
                  Parameters
                  k - api key (必须)
                  m - 模式 (0 = osu!, 1 = Taiko, 2 = CtB, 3 = osu!mania),默认为0。(必须)
                  b - 指定谱面id(注意!不是BeatmapSet ID,也就是说不是/s/xxxxx而是/b/xxxxx)(必须)
                  u - 指定玩家。(必须)
                  Response
                  一个包含"content"值的JSON列表,该值中含有base-64加密的rep。
                  {"content":"喵喵喵","encoding":"base64"}
                  请注意,这段二进制数据用base-64解码后,并不是.osr文件的目录。这是LZMA流,在osu-wiki中可以参看定义:
                  The remaining data contains information about mouse movement and key presses in an wikipedia:LZMA stream (https://osu.ppy.sh/wiki/Osr_(file_format)#Format)


                  10楼2017-04-12 03:20
                  收起回复
                    网页API到这里就结束了,后面是几个osu://协议的连接用法:
                    osu://mp/<int mpID>/[<string password>]
                    加入某个mp房间的连接。前文搞错了一点,这个mpID和前文API用的id不同。如果存在密码,就加上密码参数。
                    osu://edit/<xx:xx:xxx>[ (x,x,x,x...)]
                    (x为0-9的整数。) xx:xx:xxx 是某首歌的具体时间点。x,x,x,x,x 没有数量限制 ,是被选中的一些Object,例如滑条,note,转盘等。通常用于mod,直接在编辑器中选中这些Object,按Ctrl+C复制,再复制到论坛里,就是这样的连接了。
                    osu://chan/#<string ChanName>
                    加入osu!聊天频道的连接。(例如osu://chan/#italian)
                    osu://dl/<int mapsetID>
                    打开某个谱面的osu!Direct下载。
                    osu://spectate/<String username or int userid>
                    围观某人。
                    注意:这些连接在实际应用时,<>必须要去掉。
                    举个栗子:[osu://spectate/7679162 点击围观]
                    将这串发送到osu!中任何频道(当然为了社区礼仪,建议发送到私聊或者#announce)再点击,就可以开始围观id是7679162的人,只要他在线。也可以直接在浏览器访问osu://spectate/7679162这个链接。
                    ————————————搬运完成 ————————————


                    11楼2017-04-12 03:46
                    收起回复
                      滋磁(虽然看不懂


                      IP属地:日本来自Android客户端12楼2017-04-12 07:53
                      回复
                        滋磁(虽然看不懂


                        IP属地:山东来自Android客户端13楼2017-04-12 08:21
                        回复
                          滋磁(虽然看不懂


                          IP属地:广东来自iPhone客户端14楼2017-04-12 08:48
                          回复
                            滋磁(虽然看不懂


                            IP属地:浙江来自Android客户端15楼2017-04-12 09:50
                            回复
                              哇哇哇 mark mark


                              IP属地:河南来自Android客户端16楼2017-04-12 12:35
                              收起回复