embed.ly问题,以确定结果beauser有时url字段缺失

时间:2014-04-15 21:50:43

标签: php json api embed oembed

我正在测试embed.ly并使用连接的逗号分隔链接字符串来请求一个请求的多个链接的详细信息。

类似的东西:

http://api.embed.ly/1/oembed?key=_key_&urls=url1,url2,url3

结果包括一些关于链接的详细信息,如描述,标题,缩略图等。

有时候没有网址字段。在大多数情况下,有一个。这个字段包含url,据我所知,它与来自requeststring的url相同。

我使用这个url字段就像一个外键,我需要清楚地识别结果。

这是我用来从embed.ly加载json数据的函数。我只是循环遍历一个数组,其中包含在另一个函数中提取的一些url,并将它们implode()到一个查询字符串。

收到json后我检查错误,如果有错误,我将链接bbcodes从rich html恢复到基本链接标记。

但如果没有sendback数据中使用过的url,我应该如何识别数据所属的链接?

private function getOPGdata(){

    $linklist = array();

    foreach ( $this->_extractions['ogp'] as &$v ) {

        $linklist[] = urlencode( $v );

    }

    $apicall = $this->_embedkey . implode( ',', $linklist );
    $data    = $this->file_get_contents_curl( $apicall );
    $data    = json_decode( $data, true );

    // we replace ogp tagged links if we don't get results
    // and reverse them to normal links
    $replace     = array();
    $replaceWith = array();

    unset( $apicall );
    unset( $linklist );
    unset( $this->_extractions['ogp'] );
    foreach ($data as &$v) {

        // check for errors
        if( isset( $v['error_code'] ) ){

            $replace[]     = '[ogp]'.$v['url'].'[ogp]';
            $replaceWith[] = '[url]'.$v['url'].'[url]';

        }

        else {

            $r = array(
                'provider_url'  => $v['provider_url'],
                'provider_name' => $v['provider_name'],
                'title'         => $v['title'],
                'description'   => $v['description'],
                'thumbnail_url' => $v['thumbnail_url'],
                'html'          => $v['html'],
                'type'          => $v['type']
            );

            $this->setOPGdata( $v['url'], $r );

        }

    }

    // finally remove links with no results
    $this->_text = str_replace( $replace, $replaceWith, $this->_text );

    return true;

}

在embedly.js中,他们这样做是为了跟踪结果:

  // Put everything into batches, even if these is only one.
  var batches = batch(valid_urls, options.batch), self = this;

  // Actually make those calls.
  $.each(batches, function(i, batch){
    $.ajax({
      url: self.build(method, batch, options),
      dataType: 'jsonp',
      success: function(data){
        // We zip together the urls and the data so we have the original_url
        $.each(zip([batch, data]), function(i, obj){
          var result = obj[1];
          result.original_url = obj[0];
          result.invalid = false;
          keeper.notify(result);
        });
      }
    });
  });

这在PHP中意味着什么?

网址示例:

  [1]=>
  array(11) {
    ["provider_url"]=>
    string(24) "http://stackoverflow.com"
    ["description"]=>
    string(143) "I'm testing embed.ly and use a concatenated comma separated link string to request details for multiple links with one request. Something like:"
    ["title"]=>
    string(79) "embed.ly Problems to identify results beauser somtimes the url field is missing"
    ["mean_alpha"]=>
    float(191.25)
    ["thumbnail_width"]=>
    int(316)
    ["url"]=>
    string(123) "http://stackoverflow.com/questions/23095192/embed-ly-problems-to-identify-results-beauser-somtimes-the-url-field-is-missing"
    ["thumbnail_url"]=>
    string(78) "http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon@2.png?v=fde65a5a78c6"
    ["version"]=>
    string(3) "1.0"
    ["provider_name"]=>
    string(13) "Stackoverflow"
    ["type"]=>
    string(4) "link"
    ["thumbnail_height"]=>
    int(316)
  }
  [2]=>
  array(11) {
    ["provider_url"]=>
    string(15) "http://embed.ly"
    ["description"]=>
    string(118) "Embedly allows developers to pull full article text for text analysis or building a read it later type applications..."
    ["title"]=>
    string(27) "Artiicle Tutorial | Embedly"
    ["mean_alpha"]=>
    float(32.7480314961)
    ["thumbnail_width"]=>
    int(399)
    ["url"]=>
    string(38) "http://embed.ly/docs/tutorials/article"
    ["thumbnail_url"]=>
    string(58) "http://embed.ly/static/images/logos/logo_color.png?v=4b245"
    ["version"]=>
    string(3) "1.0"
    ["provider_name"]=>
    string(5) "Embed"
    ["type"]=>
    string(4) "link"
    ["thumbnail_height"]=>
    int(127)
  }
}

还有一个与url无关:

  [0]=>
  array(14) {
    ["provider_url"]=>
    string(18) "https://vimeo.com/"
    ["description"]=>
    string(316) "Writers' Block is a short film written and directed by Tom Gran and Martin Woolley and produced by WONKY Films with the support of IdeasTap. Set in a prison for criminally poor writers, it follows a gang of cons who get ahold of the script to their own lives and attempt to re-write it in order to make their escape."
    ["title"]=>
    string(14) "Writers' Block"
    ["author_name"]=>
    string(12) "WÖNKY Films"
    ["height"]=>
    int(720)
    ["thumbnail_width"]=>
    int(1280)
    ["width"]=>
    int(1280)
    ["html"]=>
    string(389) ""
    ["author_url"]=>
    string(27) "http://vimeo.com/wonkyfilms"
    ["version"]=>
    string(3) "1.0"
    ["provider_name"]=>
    string(5) "Vimeo"
    ["thumbnail_url"]=>
    string(46) "http://i.vimeocdn.com/video/468861310_1280.jpg"
    ["type"]=>
    string(5) "video"
    ["thumbnail_height"]=>
    int(720)
  }

1 个答案:

答案 0 :(得分:0)

结果总是按照它们传入的顺序传回。您应该能够对请求URL执行for循环,并在响应数组中按索引匹配结果。您可以执行以下操作来制作响应请求URL的映射。

$urls = array(
  "http://www.google.com",
  "http://www.yahoo.com"
);

$results = get_embedly_results($urls)
$resultMap = array();

for ($i = 0; $i < count($urls); ++$i) {
  resultMap[$urls[$i]] = $results[$i];
}

这是未经测试的代码,我的PHP非常生疏,但它应该给你一般的想法。