API简介和网易云音乐API

/ 0评 / 1

    近日肝了不少的Java代码,而在流的编程还有GUI编程当中 用到的更多是API。首先API(Application Programming Interface  应用编程接口)提供了一个友好的接口,让编程的复杂度大大降低,而其 设计的目的也是希望其自身能够成为一种通用的语言,类似算法一样的存在,让不同软件进行信息共享。

    尽管不同的语言都拥有不同的API库,但是API也是常常被看作是“网络 应用API”,一般情况下程序员通过HTTP协议向API发起请求以获得某种信息,而API会用XML(可扩展标记语言)或者JSON(对象表示)格式返回服务器响应的信息,尽管大多数API依旧使用XML,但是相信我 JS肯定会崛起无敌的(奶一口)

    而这是放在数据采集分区的一篇博客 ,表面看来数据采集和API是沾不到边的,但是网络应用API更多的技术使用是和Python网络数据采集的方法是一样的(发送HTTP请求,然后获取信息)两者相辅相成。

API概述

    虽然在网络而言,API并非随处可见,但是依旧可以从仅剩不多的可 获取的API当中提取不少有用的信息(比如我沉迷电音,我可以使用一些API来获取名称 、歌手名字、专辑什么的),而在此期间我也见识到了Google的API强大。

    API非常容易使用:可以通过简单的网址来发送请求:

https://freegeoip.net/json/119.75.217.109

    这里继续以百度为基准:通过发送上述HTTP请求我获得了一下内容:

{"ip":"119.75.217.109","country_code":"CN","country_name":"China",
"region_code":"11","region_name":"Beijing","city":"Beijing","zip_code":"",
"time_zone":"Asia/Shanghai","latitude":39.9289,"longitude":116.3883,
"metro_code":0}

     从上面可以清楚地得知百度主机源自CN China Bejing,但是这里可能只会是得到了一个JSON格式的信息,这样的API和普通的网址访问又有什么区别吗。API只是通过HTTP协议来下载文件 ,和URL访问网站获取数据的协议是一样的,但API之所以 叫API是因为API的使用遵循严谨的语法,其次API用JSON或者XML格式表示数据,而不是HTML,这有着本质的区别。

API通用规则和验证

    和大多数采集数据的方式不同,API用一套非常标准的规则生成数据,而且生成的数据也是按照非常 标准的方式组织的,所以这些标准的规则成了我们使用API的制胜宝典。但是并非所有API都十分简单,有些API的规则十分复杂,所以在 使用时查看文档也是非常重要的。

利用 HTTP 从网络服务获取信息有四种方式:
    • GET
    • POST
    • PUT
    • DELETE
    GET
就是你在浏览器中输入网址浏览网站所做的事情。当访问 http://freegeoip.net/json/119.75.217.109时, 就会使用 GET 方法
    POST 基本就是当填写表单或提交信息到网络服务器的后端程序时所做的事情。每次当登录网站的时候,就是通过用户名和(有可能加密的)密码发起一个 POST 请求。如果你用API 发起一个 POST 请求,相当于说“请把信息保存到你的数据库里”。
    PUT 在网站交互过程中不常用,但是在 API 里面有时会用到。 PUT 请求用来更新一个对象或信息。例如, API 可能会要求用 POST 请求创建新用户,但是如果要更新老用户的邮箱地址,就要用 PUT 请求了。
    DELETE 用于删除一个对象。例如,如果向 http://myapi.com/user/23 发出一个 DELETE 请求,就会删除 ID 号是 23 的用户。 DELETE 方法在公共 API 里面不常用,它们主要用于创建信息,不能随便让一个用户去删掉数据库的信息。
    虽然有些 API 不需要验证操作(就是说任何人都可以使用 API,不需要注册),但是很多新式 API 在使用之前都要求客户验证。 有些 API 要求客户验证是为了计算 API 调用的费用,或者是提供了包月的服务。有些验证是为了“限制”用户使用 API( 限制每秒钟、每小时或每天 API 调用的次数),或者是限制一部分用户对某种信息或某类 API 的访问。还有一些 API 可能不要求验证,但是可能会为了市场营销而跟踪用户的使用行为。
    通常 API 验证的方法都是用类似令牌( token)的方式调用,每次 API 调用都会把令牌传递到服务器上。 这种令牌要么是用户注册的时候分配给用户,要么就是在用户调用的时候才提供,可能是长期固定的值,也可能是频繁变化的,通过服务器对用户名和密码的组合处理后生成。

服务器响应

    上面提到API 有一个重要的特征是它们会反馈格式友好的数据。大多数反馈的数据格式都是 XML JSON。目前从百科和论坛的消息来看XML似乎没有JSON那么受欢迎了,对于XML我自己不是特别了解(所以接下来几天我要了解了解=-=)但是在之前的一些小型Java项目当中,有关于xml文件的配置。明显XML的复杂度是高于JSON的(以下话来源百科:过去,服务器端用 PHP.NET 这些程序作为 API 的接收端。现在,服务器端也会用一些 JavaScript 框架作为 API的发送和接收端, 像 Angular Backbone 等。 虽然服务器端的技术无法预测它们即将收到的数据格式,但是像 Backbone 之类的 JavaScript 库处理 JSON 比处理 XML 要更简单。 

    API调用:不同 API 的调用语法大不相同,但是有几条共同准则。当使用 GET 请求获取数据时,用URL 路径描述你要获取的数据范围,查询参数可以作为过滤器或附加请求使用。

网易云音乐

    既然前面说能 获取json,那就上手?

    这一下我可以确定api是 有,但是我并不知道网易API的规则,那好办百度一下:有人给了我一些查询的基本准则:

    获取歌手专辑列表

    GET http://music.163.com/api/artist/albums/[artist_id]/

    那好,我试一试 就拿Vicetone来吧:

    

    illegal request ??非法了?那好吧,既然是非法请求,那就是HTTP请求头出了问题,果断查询后改变头部:

    

Host: music.163.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Origin: http://music.163.com
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0, no-cache
Referer: http://music.163.com/search/
Pragma: no-cache

     得,访问:

    我成功得到了JSON,尝试访问一下网址:

    其中p4是存储位置,而后面的那一串是加密后图片名字

确认是猫厂二帅了。我们继续狗下去获得一些其他东西:

专辑下手:http://music.163.com/api/album/34750015

    这里得出了Nevada的相关信息

    

发现了文件位置所在,但如果是直接下载呢?

最终回:下载。网易云的歌曲下载中歌曲id经过加密处理,所以还得稍微绕一下

 

   由上可以得出: http://m2.music.126.net/CLdb50dbVG20PMXFG1BNZQ==/34750015.mp3

歌词:

这样下去只要搞定API方法也就计划通了。最终感谢参考 给予参考API

https://github.com/maweiyi/MusicServer/blob/master/music/api.py

(事实告诉我们查文档最重要啊=-=)

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注