Yahoo Fantasy Sports API路由/发布错误

时间:2017-04-13 16:09:37

标签: ruby-on-rails xml api post yahoo-api

作为一个快速背景:我已经成功建立了一个小型应用程序,该应用程序将连接到雅虎的API并使用我团队名单上的PUT请求每天设置我的阵容Yahoo Developer's Guide

具体来说,我现在遇到问题:

  

POST

     

使用POST,可以从团队中添加和/或删除玩家,或进行交易   可以提出。 POST到事务集合的URI是:

     

http://fantasysports.yahooapis.com/fantasy/v2/league//transactions

     

对事务API的POST请求的输入XML格式   用一个团队中的另一个玩家替换一个玩家是:

<fantasy_content>
  <transaction>
    <type>add/drop</type>
    <players>
      <player>
        <player_key>{player_key}</player_key>
        <transaction_data>
          <type>add</type>
          <destination_team_key>{team_key}</destination_team_key>
        </transaction_data>
      </player>
      <player>
        <player_key>{player_key}</player_key>
        <transaction_data>
          <type>drop</type>
          <source_team_key>{team_key}</source_team_key>
        </transaction_data>
      </player>
    </players>
  </transaction>
</fantasy_content>

我提出请求的方法如下:

  def self.make_signed_request(address, method, user_id, input_file=nil )

    # format http method and return false if not accepted API method
    method = method.upcase
    return false if ( method != "GET" ) && ( method != "POST" ) && ( method != "PUT")    

    # find user
    user = User.find(user_id)

    if ( user.yahoo_access_token_expiration.nil? || user.yahoo_access_token_expiration < Time.now )
      # expired token, so renew
      YahooOAuth.renew_token(user_id)
      user.reload
    end

    # normalize text HMAC-SHA1
    digest = OpenSSL::Digest.new('sha1') 
    nonce = rand(10 ** 30).to_s.rjust(30,'0')
    timestamp = Time.now.to_i
    text = method + "&" + CGI.escape("#{address}") + "&" + CGI.escape("oauth_consumer_key=#{YAHOO_OAUTH_API[:CLIENT_ID]}&oauth_nonce=#{nonce}&oauth_signature_method=HMAC-SHA1&oauth_timestamp=#{timestamp}&oauth_token=#{CGI.escape(user.yahoo_access_token)}&oauth_version=1.0")

    # create key for HMAC-SHA1
    key = CGI.escape("#{YAHOO_OAUTH_API[:CLIENT_SECRET]}")+ "&" + CGI.escape("#{user.yahoo_access_token_secret}")

    # create HMAC-SHA1 signature for api request
    hmac = OpenSSL::HMAC.digest(digest, key, text)
    signature_sha1 = CGI.escape(Base64.strict_encode64(hmac))    

    # make API request
    response = nil
    if method == "GET"
      response = Curl.get("#{address}?oauth_consumer_key=#{YAHOO_OAUTH_API[:CLIENT_ID]}&oauth_nonce=#{nonce}&oauth_signature_method=HMAC-SHA1&oauth_timestamp=#{timestamp}&oauth_token=#{CGI.escape(user.yahoo_access_token)}&oauth_version=1.0&oauth_signature=#{signature_sha1}")  
    elsif method == "POST"
      # return "Not implemented"
      response = Curl.post("#{address}?oauth_consumer_key=#{YAHOO_OAUTH_API[:CLIENT_ID]}&oauth_nonce=#{nonce}&oauth_signature_method=HMAC-SHA1&oauth_timestamp=#{timestamp}&oauth_token=#{CGI.escape(user.yahoo_access_token)}&oauth_version=1.0&oauth_signature=#{signature_sha1}", input_file) do |http|
        http.headers['Accept'] = 'application/xml'
        http.headers['Content-Type'] = 'application/xml'
      end
    elsif method == "PUT"
      response = Curl.put("#{address}?oauth_consumer_key=#{YAHOO_OAUTH_API[:CLIENT_ID]}&oauth_nonce=#{nonce}&oauth_signature_method=HMAC-SHA1&oauth_timestamp=#{timestamp}&oauth_token=#{CGI.escape(user.yahoo_access_token)}&oauth_version=1.0&oauth_signature=#{signature_sha1}", input_file) do |http|
        http.headers['Accept'] = 'application/xml'
        http.headers['Content-Type'] = 'application/xml'
      end
    end

    # return raw XML result
    return response.body

  end

当我提出要求时 -

def add_drop(players)
    # players are added in [{player_key}, {add/drop}, {faab_bid (or nil if not FAAB)}] form
    url = "http://fantasysports.yahooapis.com/fantasy/v2/league/#{self.league.league_key}/transactions"
    builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
      xml.fantasy_content {
        xml.transaction {
          xml.type "add/drop"
          xml.faab_bid players[0][2] unless players[0][2].nil?
          xml.players {
            players.each do |player|
              xml.player {
                xml.player_key player[0]
                xml.transaction_data {
                  xml.type player[1] # this will be "add" or "drop"
                  # adds use "destination_team_key," drops use "source_team_key"
                  if player[1] == "add"
                    xml.destination_team_key self.team_key
                  else
                    xml.source_team_key self.team_key
                  end
                } # transaction_data
              } # player
            end
          } # players
        } # transaction
      } # fantasy_content
    end # builder 
    xml_input = builder.to_xml
    YahooOAuth.make_signed_request(url, 'put', self.user.id, xml_input)
  end

- 生成的XML如下所示 -

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<fantasy_content>\n  <transaction>\n    <type>add/drop</type>\n    <players>\n      <player>\n        <player_key>357.p.10171</player_key>\n        <transaction_data>\n          <type>add</type>\n          <destination_team_key>370.l.4801.t.7</destination_team_key>\n        </transaction_data>\n      </player>\n      <player>\n        <player_key>357.p.9317</player_key>\n        <transaction_data>\n          <type>drop</type>\n          <source_team_key>370.l.4801.t.7</source_team_key>\n        </transaction_data>\n      </player>\n    </players>\n  </transaction>\n</fantasy_content>\n"

- 我从雅虎获得的两个回复是:

> <?xml version="1.0" encoding="UTF-8"?> <error xml:lang="en-us"
> yahoo:uri="http://fantasysports.yahooapis.com/fantasy/v2/league/370.l.4801/transactions/?oauth_consumer_key=dj0yJmk9dHBIa0h4ekhTSVBnJmQ9WVdrOVlUZHFkMnhMTXpJbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD1lNQ--&amp;amp;oauth_nonce=892057444475304460343340318332&amp;amp;oauth_signature_method=HMAC-SHA1&amp;amp;oauth_timestamp=1492097395&amp;amp;oauth_token=A%3D2.86iTDxtT4nQ.wxTcn33mgnA8dm3AeME87YRjNthVjxiwfhqKr_oWt0HBgbBeS2DC_dNObN72m0ucgi7CsSFaRjpc5IcnZ_bpJNTC3pUXc37bgH8f0S4irpyXLz8s9ONAYYB.LIDT0sOUvdTgk_lPDnlr1GlPhCe7u54Sq.m_vwq1JQlNUzEVrEs3kOW9wiXk17BditA9OGaVE.tuepvpthDRVBhOye8qjb_ic7UZtT.lvccoGEdgvcShHSyg.YYcnShl7ks23G01hAcXrfGveEk0UncWKNmma42cYbg7bzSOY9ZZj3_hvU5rK3SjB1ADPe8bsIEe_Ba9KBhYxlWd9iyyAR_bloL9n0eeL_OQ6PoR4uGJ6VMUDn9n_ovDGvfgAfvtJs15pCcXPhYusuo1S7SJF1O3fLtR8TitmU1qW88x3SenY2U50dlRG9Y73iNUdnyYBpIHLg._pPkms26QhnuxSFfqpXcGleGXOuZ0.TNOE3Cp8VbLEOEIg6QkavgGLKyFetYhSQ879T4rfhfeEoWvwkjsO1BL2Y3n4Hp9cgfU4y3wZvT.b8qhP7QY0UTYtZkyYH.sydFUXUCec.yVGm29S.s.2N96tfr4qWaI0qntRE.X5MVdwfbhz94n9JshmduqurjKRLlMYVWnLZ_Yderm0HDvT7dnowjyUwBx2UxUKJooauQnNU67QQECmh.HZqcm_OBysLABvdtTtaPhnvJ1QViN_UUjslToVPOs1oyxoTNRbL0VL8yxJc&amp;amp;oauth_version=1.0&amp;amp;oauth_signature=UVmcj2S8c5vqkRgAxsdQ3MQZI54%3D"
> xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"
> xmlns="http://www.yahooapis.com/v1/base.rng"> 
> <description>subresource 'transactions' not supported.</description> 
> <detail/> </error>

> <?xml version="1.0" encoding="UTF-8"?> <error xml:lang="en-us"
> yahoo:uri="http://fantasysports.yahooapis.com/fantasy/v2/league/370.l.4801/transactions?oauth_consumer_key=dj0yJmk9dHBIa0h4ekhTSVBnJmQ9WVdrOVlUZHFkMnhMTXpJbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD1lNQ--&amp;amp;oauth_nonce=503128074504907304111221170641&amp;amp;oauth_signature_method=HMAC-SHA1&amp;amp;oauth_timestamp=1492097198&amp;amp;oauth_token=A%3D2.86iTDxtT4nQ.wxTcn33mgnA8dm3AeME87YRjNthVjxiwfhqKr_oWt0HBgbBeS2DC_dNObN72m0ucgi7CsSFaRjpc5IcnZ_bpJNTC3pUXc37bgH8f0S4irpyXLz8s9ONAYYB.LIDT0sOUvdTgk_lPDnlr1GlPhCe7u54Sq.m_vwq1JQlNUzEVrEs3kOW9wiXk17BditA9OGaVE.tuepvpthDRVBhOye8qjb_ic7UZtT.lvccoGEdgvcShHSyg.YYcnShl7ks23G01hAcXrfGveEk0UncWKNmma42cYbg7bzSOY9ZZj3_hvU5rK3SjB1ADPe8bsIEe_Ba9KBhYxlWd9iyyAR_bloL9n0eeL_OQ6PoR4uGJ6VMUDn9n_ovDGvfgAfvtJs15pCcXPhYusuo1S7SJF1O3fLtR8TitmU1qW88x3SenY2U50dlRG9Y73iNUdnyYBpIHLg._pPkms26QhnuxSFfqpXcGleGXOuZ0.TNOE3Cp8VbLEOEIg6QkavgGLKyFetYhSQ879T4rfhfeEoWvwkjsO1BL2Y3n4Hp9cgfU4y3wZvT.b8qhP7QY0UTYtZkyYH.sydFUXUCec.yVGm29S.s.2N96tfr4qWaI0qntRE.X5MVdwfbhz94n9JshmduqurjKRLlMYVWnLZ_Yderm0HDvT7dnowjyUwBx2UxUKJooauQnNU67QQECmh.HZqcm_OBysLABvdtTtaPhnvJ1QViN_UUjslToVPOs1oyxoTNRbL0VL8yxJc&amp;amp;oauth_version=1.0&amp;amp;oauth_signature=oNaLute5djkIryUEKq0zF6prVFU%3D"
> xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"
> xmlns="http://www.yahooapis.com/v1/base.rng">  
> <description>Invalid XML POSTed. Error code 25 at line 3, column 0 of input XML.</description>
> <detail/> </error>

老实说,我不确定两个响应之间有什么区别,因为我已经得到了两个响应,我非常确定相同的XML输入和POST参数。

有人有任何见解吗?

1 个答案:

答案 0 :(得分:0)

刚遇到同样的问题,这篇Stack Overflow文章是我在网上找到的唯一相关链接。决定是时候我回馈这个社区......

问题是Yahoo的交易页面上的一个示例XML是错误的。带有{}占位符且没有&lt; faab_bid&gt;的示例节点是正确的,但它下面的FAAB示例有&lt; destination_team_key&gt;而不是&lt; source_team_key&gt;作为“下降”交易的一部分。当我确保使用“source_team_key”而不是“destination_team_key”作为drop节点集时,事务开始工作。

我猜测错误代码25是一般错误,表明XML的某些部分是错误的或意外的。如果这不能解决您的问题,请尝试从第一个添加/删除示例XML开始,逐个填写值。

希望这有帮助。

-Igor