Получение окончательных URL-адресов сокращенных URL-адресов (например, bit.ly) с использованием php - PullRequest
3 голосов
/ 06 февраля 2011

[Обновлено внизу] Всем привет.

Начните с коротких URL-адресов: Представьте, что у вас есть коллекция из 5 коротких URL-адресов (например, http://bit.ly) в массиве php, например:

$shortUrlArray = array("http://bit.ly/123",
"http://bit.ly/123",
"http://bit.ly/123",
"http://bit.ly/123",
"http://bit.ly/123");

Конец с конечными, перенаправленными URL-адресами: Как я могу получить окончательный URL этих коротких URL с помощью php?Вот так:

http://www.example.com/some-directory/some-page.html
http://www.example.com/some-directory/some-page.html
http://www.example.com/some-directory/some-page.html
http://www.example.com/some-directory/some-page.html
http://www.example.com/some-directory/some-page.html

У меня есть один метод (найденный в сети), который хорошо работает с одним URL, но при циклическом перемещении по нескольким URL он работает только с последним URL в массиве.Для справки, метод таков:

function get_web_page( $url ) 
{ 
    $options = array( 
        CURLOPT_RETURNTRANSFER => true,     // return web page 
        CURLOPT_HEADER         => true,    // return headers 
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects 
        CURLOPT_ENCODING       => "",       // handle all encodings 
        CURLOPT_USERAGENT      => "spider", // who am i 
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect 
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect 
        CURLOPT_TIMEOUT        => 120,      // timeout on response 
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects 
    ); 

    $ch      = curl_init( $url ); 
    curl_setopt_array( $ch, $options ); 
    $content = curl_exec( $ch ); 
    $err     = curl_errno( $ch ); 
    $errmsg  = curl_error( $ch ); 
    $header  = curl_getinfo( $ch ); 
    curl_close( $ch ); 

    //$header['errno']   = $err; 
    //$header['errmsg']  = $errmsg; 
    //$header['content'] = $content; 
    print($header[0]); 
    return $header; 
}  


//Using the above method in a for loop

$finalURLs = array();

$lineCount = count($shortUrlArray);

for($i = 0; $i <= $lineCount; $i++){

    $singleShortURL = $shortUrlArray[$i];

    $myUrlInfo = get_web_page( $singleShortURL ); 

    $rawURL = $myUrlInfo["url"];

    array_push($finalURLs, $rawURL);

}

Закрыть, но недостаточно Этот метод работает, но только с одним URL.Я не могу использовать его в цикле for, что я и хочу сделать.При использовании в приведенном выше примере в цикле for первые четыре элемента возвращаются без изменений, и только последний элемент преобразуется в его окончательный URL-адрес.Это происходит независимо от того, содержит ли ваш массив 5 элементов или 500 элементов.

Требуемое решение: Пожалуйста, дайте мне подсказку о том, как бы вы изменили этот метод для работы при использовании внутри цикла for с коллекцией URL-адресов (а не только с одним).

-OR-

Если вам известен код, который лучше подходит для этой задачи, включите его в свой ответ.

Заранее спасибо.

Обновление: После некоторых дальнейших попыток я обнаружил, что проблема заключается не в приведенном выше методе (который, в конце концов, кажется, работает нормально для циклов), а, возможно, в кодировании.Когда я жестко кодирую массив коротких URL, цикл работает нормально.Но когда я передаю блок разделенных символом новой строки URL-адресов из HTML-формы, используя GET или POST, возникает вышеупомянутая проблема.Изменяются ли URL-адреса каким-либо образом в формат, несовместимый с методом, когда я отправляю форму ????

Новое обновление: Вы, ребята, я обнаружил, что моя проблема была связана с чем-то, не связанным с вышеуказанным методом.Моя проблема заключалась в том, что кодировка URL моих коротких URL-адресов преобразовывала то, что я считал просто символами новой строки (разделяя URL-адреса), в следующее:% 0D% 0A, которое является символом перевода строки или возврата ...У окончательного URL в коллекции к хвосту был добавлен символ-призрак, что делало невозможным получение окончательных URL-адресов только для них.Я опознал призрачного персонажа, исправил взрыв php и теперь все работает нормально.Извините и спасибо.

Ответы [ 3 ]

2 голосов
/ 06 февраля 2011

Это может помочь: Как поместить строку в массив, разделив ее на новую строку?

Возможно, вы бы сделали что-то подобное, предполагая, что возвращаемые URL-адреса возвращаютсяв POST:

$final_urls = array();

$short_urls = explode( chr(10), $_POST['short_urls'] ); //You can replace chr(10) with "\n" or "\r\n", depending on how you get your urls. And of course, change $_POST['short_urls'] to the source of your string.

foreach ( $short_urls as $short ) {
    $final_urls[] = get_web_page( $short );
}

Я получаю следующий вывод, используя var_dump($final_urls); и ваш bit.ly URL:

http://codepad.org/8YhqlCo1

И мой источник: $_POST['short_urls'] = "http://bit.ly/123\nhttp://bit.ly/123\nhttp://bit.ly/123\nhttp://bit.ly/123";

Я также получил ошибку, используя вашу функцию: Notice: Undefined offset: 0 in /var/www/test.php on line 27 Строка 27: print($header[0]); Я не уверен, что вы там хотели ...

Вот мой test.php,если это поможет: http://codepad.org/zI2wAOWL

2 голосов
/ 06 февраля 2011

Я думаю, что у вас это почти есть.Попробуйте это:

$shortUrlArray = array("http://yhoo.it/2deaFR",
    "http://bit.ly/900913",
    "http://bit.ly/4m1AUx");

    $finalURLs = array();

    $lineCount = count($shortUrlArray);

    for($i = 0; $i < $lineCount; $i++){
            $singleShortURL = $shortUrlArray[$i];
            $myUrlInfo = get_web_page( $singleShortURL );
            $rawURL = $myUrlInfo["url"];
             printf($rawURL."\n");
            array_push($finalURLs, $rawURL);
    }
0 голосов
/ 16 января 2017

Я реализовал, чтобы получить каждую строку простого текстового файла с одним сокращенным URL-адресом на строку, соответствующим URL-адресом перенаправления:

<?php
// input: textfile with one bitly shortened url per line
$plain_urls = file_get_contents('in.txt');
$bitly_urls = explode("\r\n", $plain_urls);

// output: where should we write
$w_out = fopen("out.csv", "a+") or die("Unable to open file!");

foreach($bitly_urls as $bitly_url) {
  $c = curl_init($bitly_url);
  curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36');
  curl_setopt($c, CURLOPT_FOLLOWLOCATION, 0);
  curl_setopt($c, CURLOPT_HEADER, 1);
  curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 20);
  // curl_setopt($c, CURLOPT_PROXY, 'localhost:9150');
  // curl_setopt($c, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
  $r = curl_exec($c);

  // get the redirect url:
  $redirect_url = curl_getinfo($c)['redirect_url'];

  // write output as csv
  $out = '"'.$bitly_url.'";"'.$redirect_url.'"'."\n";
  fwrite($w_out, $out);
}
fclose($w_out);

Получайте удовольствие и наслаждайтесь!* PW 1004 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...