首页 > 解决方案 > Chainlink 请求未在后续路径返回整数

问题描述

我有一个非常简单的智能合约,它使用 get>uint256 作业创建并发送 Chainlink 请求到 Kovan Linkpool 节点。合约看起来像这样(API 私钥被移除)。

contract OracleChainlink is ChainlinkClient {
    using Chainlink for Chainlink.Request;

    uint256 public H_Index;
    address private Oracle;
    bytes32 private JobId;
    uint256 private Fee = .1 * 10 ** 18; //kovan is .1 link per call

    constructor() public {
        setPublicChainlinkToken();
        Oracle = 0x56dd6586DB0D08c6Ce7B2f2805af28616E082455; //Chainlink linkpool node on Kovan
        JobId = "b6602d14e4734c49a5e1ce19d45a4632";
    }

    function getChainlinkToken() public view returns (address) {
        return chainlinkTokenAddress();
    }

    function RequestH_index() public returns (bytes32 Reqid) {
        Chainlink.Request memory Req = buildChainlinkRequest(JobId, address(this), this.fulfill.selector);

        Req.add("get", "https://serpapi.com/.....");
        Req.add("path", "cited_by.table.1.h_index.all");

        return sendChainlinkRequestTo(Oracle, Req, Fee);        
    }
    
    function fulfill(bytes32 Reqid, uint256 _Hindex) public recordChainlinkFulfillment(Reqid) {
        H_Index = _Hindex;
    }

Google Scholar Author API https://serpapi.com/google-scholar-author-api返回一个非常大的 json,如果向下滚动,可以在链接中看到。我需要遵循的片段/路径如下所示(cited_by 位于 json 的顶层)。

  "cited_by": {
    "table": [
      {
        "citations": {
          "all": 23351,
          "since_2016": 13660
        }
      },
      {
        "h_index": {
          "all": 46,
          "since_2016": 37
        }
      },
      {
        "i10_index": {
          "all": 60,
          "since_2016": 53
        }
      }
    ],

运行时,我得到了 Chainlink 请求事件的日志,但公共 H_Index 值仍然为 0。我是否遗漏了适配器方面的某些内容?我已经通过 JSON 尝试了各种路径格式,但没有运气。我也尝试过不同的节点和作业。有什么方法可以确保 API 甚至被调用?我错过了什么?

标签: google-search-apichainlink

解决方案


您的 JSON 路径应如下所示:

Req.add("path", "cited_by.table.1.h_index.all");

查看 Etherscan 活动,您正在使用的节点看起来可能处于非活动状态。试试这个节点和jobId:

Oracle = 0xc57B33452b4F7BB189bB5AfaE9cc4aBa1f7a4FD8; 
JobId = "d5270d1c311941d0b08bead21fea7747";

这些取自Chainlink 官方文档

要检查节点是否正在运行,请在区块浏览器中查看预言机地址。您可以在这里看到您尝试使用的原始节点已经很长时间没有发布交易了。

如果一个节点处于非活动状态,您将需要找到一个新节点或自己托管一个。要查找更多节点和作业,您可以查看market.link或使用前面提到的文档中的那个。


推荐阅读