embed.ly Проблемы с идентификацией результатов из-за того, что иногда отсутствует поле URL

Я тестирую embed.ly и использую объединенную строку ссылки, разделенную запятыми, чтобы запросить детали для нескольких ссылок с одним запросом.

Что-то типа:

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

Результаты включают в себя некоторые сведения о ссылке, такие как описание, заголовок, миниатюра и т. д.

Иногда нет поля URL. В большинстве случаев есть один. Это поле содержит URL-адрес и, насколько я могу судить, идентично URL-адресу из строки запроса.

Я использовал это поле URL-адреса как внешний ключ, и мне нужно четко идентифицировать результаты.

Это функция, которую я использую для загрузки данных json из embed.ly. Я просто перебираю массив, содержащий некоторые URL-адреса, извлеченные в другой функции, и внедряю их в строку запроса.

После получения json я проверяю наличие ошибок и, если есть ошибки, восстанавливаю bbcode ссылок из расширенного html в базовый тег ссылки.

Но без используемого 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?

Пример с URL-адресами:

  [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/[email protected]?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)
  }

person user2429266    schedule 15.04.2014    source источник


Ответы (1)


Результаты всегда возвращаются в том же порядке, в котором они были переданы. Вы должны иметь возможность выполнять цикл for для URL-адресов ваших запросов и просто сопоставлять результаты по индексу в массиве ответов. Вы можете сделать что-то вроде следующего, чтобы составить карту 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 очень ржавый, но он должен дать вам общее представление.

person doki_pen    schedule 16.04.2014
comment
да. Похоже, они возвращают свои данные в правильном порядке. Но я был бы счастливее, если бы они возвращали данные с URL-адресом темы в качестве ключа. Спасибо. Все о доверии.. Как только возникает аномалия (все может произойти по многим причинам), это испортит мою базу данных кеша... Поэтому все, что я могу сделать, это проверить длину массива и сравнить ее с количеством URL-адресов и пропустить ссылки, если количество возвращенных массивов не соответствует количеству отправленных массивов... Я бы посчитал это грязным. - person user2429266; 16.04.2014
comment
strpos() в домене - это все, что я могу сделать (домен/провайдер всегда возвращается, насколько я вижу) и снова пропустить весь пакет ссылок, как только произойдет одна ошибка. - person user2429266; 16.04.2014