eve欧服吧 关注:44,023贴子:1,668,917

【ESI】EVE宇宙中最大的黑洞

只看楼主收藏回复

一楼度娘,本贴为技术研究贴


IP属地:广东1楼2019-10-31 10:03回复
    沙发


    IP属地:广西来自Android客户端2楼2019-10-31 10:03
    回复
      2025-08-26 13:42:33
      广告
      不感兴趣
      开通SVIP免广告
      下面没了?


      4楼2019-10-31 10:06
      收起回复
        1、ESI数据是什么东西
        按通俗说来,ESI应该属于一套广播系统(比如:GPS的广播系统),它应该是全天无休的向全宇宙开放EVE游戏内绝大部分数据的一套系统,打个比喻:某玩家想能有3个角色在吉它市场挂单中,他不想一个个角色去登录游戏去了解每个角色的市场挂单情况,那他就可以能“下载”ESI数据来了解每个角色的情况;
        这里说明一下为什么是“下载”,而不是“读取”呢,就如前面所说ESI是一套广播系统,所有的数据前不是根据用户的需求而反馈数据的,他是“定时”更新的,更新好的临时数据会被放在一个缓存机制内,等待下一次更新的时候被覆盖;通俗来说就是EVE的缓存机制就是像很多个小房间,ESI就像一座大厦管理者轮流的向每一个房间放信息;
        案例:
        某玩家的3个角色,都在市场上挂单了,那CCP就会在ESI这个系统里每隔五分钟将这3个角色的信息缓存起来(PS:ESI的市场订单是约每隔五分钟更新一次);
        数据更新时间 :A角色为2019/03/24 15:37:25,B角色为2019/03/24 15:33:23,C角色为2019/03/24 15:34:15,
        下次更新时间 :A角色为2019/03/24 15:42:26,B角色为2019/03/24 15:38:24,C角色为2019/03/24 15:39:16,
        以上就ESI每一个API给出的更新时间是不一新的。像:市场订单类是约五分钟,物品库存是约一小时,其他还有些会出现是10小时更新一次的情况;因为ESI的API函数量较多,本节课就不一一例举了。
        ESI的网址: https://esi.evetech.net/
        2、SSO是什么东西
        讲了ESI的更新机制我们继续讲一下,这个向全宇宙开放的数据,是如何下载的呢?ESI数据虽然是全开放,但它还是属于“权限下载的”,就是说:如果你要下载一些涉及玩家的自身信息时,是需要授权的(如果不用授权的话,早就把敌对联盟的所有人下线位置下载来了)
        讲到授权,那我们就要讲一下“SSO" :
        什么是"SSO”,全称“Single Sign On”,中文“单点登录”,定义:“SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统”(度娘说的)
        通俗一点来说:A君有很多业务需要处理,这些需处理的业务数据都放在某栋大厦(ESI)的某个房间(API)里,理论上进入这个大厦是需要账号和密码的;实际情况是A君的时间有限并不能独自去处理这些业务,这时就有很多代理公司(各大EVE周边网站)去帮A君去处理这些业务;但A君不可能将自身的账号和密码交给这些代理公司(毕竟不安全),那就A君和大厦的管理者(CCP)_就做了一个约定,代理公司要帮A君去办理业务就要与A君一起去大厦的管理处,签一个协议,管理者验证A君的账号和密码(A君自己提供)和代理公司的工作范围(scope)向大厦的管理处申请了一个协议钥匙(refresh_token),而代理公司就可以用这个协议钥匙(refresh_token)到管理处换进入大厦的访问钥匙(access_token),从而帮A君处理业务了,这把访问钥匙(access_token)是有时间限制的(ESI这边是1200秒,时效过了就要去管理处重新换新的访问钥匙),而协议钥匙(refresh_token)将会保存很久(没去验证过,基本上A君不去管理处注销,那么这个钥匙可以一直用)。这就是SSO的基本流程;
        看大家可能会问,为什么不在管理处直接换到访问钥匙(access_token)呢,官方是这个样解释的:这个考虑到网络安全的问题,如果这个访问钥匙(access_token)中途被拦截了,那个这访问权限就会被公开了,劫持者会一直用A君的身份进入大厦,而A君因为将业务代理出去了,所以不会有所察觉,所有就不会主动注销访问钥匙了;
        (PS:其实截取了协议钥匙(refresh_token)也是可以随意访问大厦的);
        论SSO的安全性:
        A君:自己管理着账号密码;
        代理公司:可以协助A君管理业务,但无法取得A君的账号和密码;
        大厦管理处:协调业务对接,提供业务接口,也无账号密码泄露的可能性。
        EVE SSO原理:https://developers.eveonline.com/blog/article/sso-to-authenticated-calls
        这是本节课的内容,下节课将讲一下《如何保留“协议钥匙(refresh_token)"和EVE中的SSO钥匙交换过程》;


        IP属地:广东5楼2019-10-31 10:06
        回复
          第二节:
          第一步:用户在第三方网站中点击受权链接 >>>>>>>>>>> 第二步:链接引导至EVE的官网登录界面
          受权链接格式以下:
          https://login.eveonline.com/oauth/authorize?response_type={response type}&redirect_uri={redirect uri}&client_id={client id}&scope={scopes}&state={state}
          其中{ }内的容为参数值
          名词解释:
          {response type} :参数值为"code";
          {redirect uri} :此参数为回调网址(callback地址,这个网址是第三方在CCP开发平台的Applications注册中”Callback URL“的值)
          {client id} :此参数为第三方的账号ID(这个账号ID是第三方在CCP开发平台的Applications注册中”Client Id“的值要一样)
          {scopes} :此参数为第三方的申请的业务范围(这个账号ID是第三方在CCP开发平台的Applications注册中”Scopes“的对应)
          {state} :此参数为状态码。此参数将由第三方自行编写,CCP在回调的时候会以原样返回;(此参数为选用参数)
          第三步:客户登录账号并完成授权 >>>>>>>>>>>>>> 第四步:EVE官网反向访问第三方回调网址(Callback)
          回调网址格式以下:
          {redirect uri}?code=ckEZIa6JUOdoN6ijmqBI...qgpU-SmPsZ0
          如:回调网址信息为:https://www.test.com/callback
          那他的回调网址结果就是:https://www.test.com/callback?code=ckEZIa6JUOdoN6ijmqBI...qgpU-SmPsZ0
          其中{ }内的容为参数值
          名词解释:
          {redirect uri} :此参数为回调网址(callback地址,这个网址是第三方在CCP开发平台的Applications注册中”Callback URL“的值)
          {code} :此参数为EVE官网同意第三方和用户的授权码
          (PS:关于如何截取这个回调的CODE的问题。思路是,把自己的网站当成一个服务器,EVE的登录网页向我们的服务器发了一个GET申请)
          第五步:拿到授权码后向EVE发出申请Token请求:
          https://login.eveonline.com/oauth/token
          大家会发现这个网址没有参数了,那是因为这个要用POST来发送请求:
          POST参数内容为:
          header部分:
          {
          "Content-Type":"application/json",
          "Authorization" : 'Basic '+ base64encoded({client id}:{client_secret})
          }
          body部分:
          {
          "grant_type":"authorization_code",
          "code":"{the authorization code}"
          }
          其中{ }内的容为参数值
          名词解释:
          {client id} :此参数为第三方的账号ID(这个账号ID是第三方在CCP开发平台的Applications注册中”Client Id“的值要一样)
          {client_secret} :此参数为第三方的账号密码(这个账号ID是第三方在CCP开发平台的Applications注册中”Client Secret“的值要一样)
          {the authorization code} :此参数为第四步中回调网址提供的{code}值
          (PS:在header部分中,大家会发现在一个叫base64encoded()的函数,这个加密函数网上有不少提供的,大家可以自行去收集;而加密部份大家要注意的是[ {client id}:{client_secret} ],比如{client id}的值是123456,{client_secret}的值是789012,那加密部分为[ 123456:789012 ],注意”冒号“的存在,另一个要注意的是"Basic "这个关键字后的“空格”不能去除)
          base64encoded()函数的在线应用 https://www.base64decode.org/
          那我们接收到的结果(response)应该如下:
          {
          "access_token":"jZOzkRtA8B...LQJg2",
          "token_type":"Bearer",
          "expires_in":1199,
          "refresh_token":"RGuc...w1"
          }
          此时第三方已经拿到用户的协议钥匙(refresh_token),也拿到访问钥题(access_token)也拿到了,理论上是不是流程就结束了,大家有没发现,第三方好像都没拿到用户的ID,光用协议钥匙(refresh_token),无用户ID,那信息储存会有很大问题的。所以还有第六步。
          第六步:获取用户基本信息:
          https://login.eveonline.com/oauth/verify
          它与第五步的访问一样,都是以GET方法发送请求,但这次只需加header部分就好了
          header部分:
          {
          "Authorization": "Bearer " + {access_token}
          }
          其中{ }内的容为参数值
          名词解释:
          {access_token} :此参数为第五步中接收到的结果(Response)的”access_token“参数
          我们接收到的结果(response)应该如下:
          {
          "CharacterID":95465499,
          "CharacterName":"CCP Bartender",
          "ExpiresOn":"2017-07-05T14:34:16.5857101",
          "Scopes":"esi-characters.read_standings.v1",
          "TokenType":"Character",
          "CharacterOwnerHash":"lots_of_letters_and_numbers",
          "IntellectualProperty":"EVE"
          }
          第三方就拿到了用户的ID(CharacterID)和用户的名称(CharacterName)了。到此EVE的SSO的流程全部结束。
          附加情况,那第三方截取了Refresh_token后,以后怎么换access_token呢,因为只有1200秒的限时;那就要重复第五步,header的部分不变,将Body部分更换为以下:
          body部分:
          {
          "grant_type":"refresh_token",
          "refresh_token":"{the refresh token}"
          }
          就可以得到新的access_token了。
          关于本贴中涉及到的欧米伽账号问题,解释是这样的,如果小伙伴想自己开发第三方工具,那就要在EVE官网中申请一个程序接口”Applications“,而这个申请权限只限于欧米伽账号,阿尔法账号是申请不了的。。所以。。。。尴尬。。。
          EVE开发者平台 https://developers.eveonline.com/


          IP属地:广东6楼2019-10-31 10:09
          收起回复
            我觉得你这个大概可能也许没什么用,懂的人自然不需要科普,不懂对人看的还是云里雾里对.
            但是有这个勇气有个想法还是很棒的,楼主加油


            7楼2019-10-31 10:09
            收起回复
              赶上直播了


              来自Android客户端8楼2019-10-31 10:09
              回复
                第三课
                我们首先看一下ESI的网址截图

                以上图后示,ESI提供了种类繁多的接口类,每个类下面还有多项子类,
                从资源归类方面来,我们可以将ESI分成:
                1、公共资源:此类是无需验证授权就可以直接下载的;
                2、角色资源:此类属于色角的个人信息,需玩家授权才行下载;
                3、军团资源:此类属于军团的整体信息,除了需要角色授权,还要验证角色在军团内的职务后,才能下载;
                从网络请求方面来说,ESI也可以分成:
                1、GET类:ESI使用最多的类
                2、POST类:
                3、PUT类:
                4、DELETE类:
                前两类属于资源请求类型,就是向服务发出资源请求的命令(POST的用处虽然比较广泛,但此处只做资源请求)
                后两类属于操作类,就是向服务发相应该的操作命令,比如:邮件删除、邮件更新等等。
                我们来说一下详细的如何使用这个系统:
                我们选取”/corporations/{corporation_id}/orders/"这个API接口做为示例

                此类为:GET类、军团资源类
                他的参数主要有以下几个:

                我们点击右上角的“Try it out"来测一下API接口,会得到如下界面,参数请按上面的要求输入。

                另外他的返加数据的JSON包结构也会一下方显示出来

                点击“Execute”来请求API的JSON数据,会得到以下的几个数据:
                Curl 和 Responses URL

                这个链接就是GET的全参数链接,Url中的各项参数是对应该你前图中的参数列表来配值的,如果在开发过程中,请自行加入变量;
                JSON数据包

                如果你测试API的阶段,可以点一下右下角的“Download”下载全部数据;
                还有一个关键参数页

                这是数据Header提供了几个时间数据,字就对我在第一课所讲的问题。更新时间
                我们回想一下几个数据,在这个API的第一个载图有一个”缓存时间"的参数

                那综合几个参数就可以得出: <<<<最后修改时间+缓存时间=过期时间>>>>>


                IP属地:广东9楼2019-10-31 10:18
                回复
                  2025-08-26 13:36:33
                  广告
                  不感兴趣
                  开通SVIP免广告
                  关于为什么开这个内贴,其实这个技术贴嘛,更多的是为了一个小型军团做服务的(因为单人军团,网上已经有很多软件可以帮大家了),这个贴我之前是发在FRT的论坛,只是觉得,还是广播一下吧。
                  另一方面:现在网上的ESI软件都是单机版,所以我这个贴的前三个内容其实是基础。以后的讨论方向都围绕着GOOGLE SHEETS来开展,GOOGLE SHEETS因为他有自己的脚本语言,另一方面他是可共享的,多人共同浏览是关键。


                  IP属地:广东12楼2019-10-31 10:28
                  回复
                    其实特别简单
                    很多时候很多人之所以不知道说的是啥 纯粹是不知道缩写的英文实际意思
                    ESI是啥?
                    EVE swagger interface
                    EVE的动态接口 或者说 就是CCP**给API起了个别称而已
                    API就是应用接口啦 说白了就是允许你通过非游戏客户端方式获得游戏数据
                    OOS 其实就是这些API不是给你们随便用的 你不能看别人隐私啊 给API加了个权限而已


                    13楼2019-10-31 10:37
                    收起回复
                      技术贴**!!!


                      IP属地:辽宁来自Android客户端14楼2019-10-31 10:38
                      回复
                        技术干货,顶一下,顺便问下怎么查看某个星域的市场数据


                        IP属地:陕西来自Android客户端15楼2019-10-31 11:50
                        收起回复
                          为什么会没用呢?对于想开发第三方应用的初学者,不是学会了一门编程语言就能了解到不同接口之间的运作方式,有LZ的文章指导不好吗?


                          来自Android客户端16楼2019-10-31 12:08
                          回复
                            技术贴顶,看过esi,但是感觉接口开的不是很好


                            IP属地:四川来自Android客户端17楼2019-10-31 12:14
                            收起回复