PHP / AJAX Image Grabbing скрипт похожий на функциональность сообщений Facebook - PullRequest
2 голосов
/ 06 января 2010

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

Я могу видеть, как это можно построить, но чтобы избавить меня от хлопот, мне интересно, если кто-то уже сделал это публичноДоступный формат?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 08 января 2010

Хорошо, пример кода, который я подготовил для вас, был слишком длинным, чтобы добавить его в качестве комментария к первому. Итак, вот правильный код, проверенный для работы в моей локальной среде PHP (5.3.1):

<?php
/**
 * Sample CURL Image Extractor
 * 
 * Prepared for stackoverflow.com 
 *
 * @author Sam Skjonsberg <skoneberg@gmail.com>
 **/

if(!function_exists('json_encode'))
{
    die('You need at least PHP 5.2 to use this script.');
}

//
// JSON & No-Cache Headers
// Uncoment when implemented as an actual JSON service
//
//header('Cache-Control: no-cache, must-revalidate');
// Date in the past to ensure it isn't cached
//header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
//header('Content-type: application/json');
//

//$url      =   parse_url($_REQUEST['url']);
// Harcoded url for demonstration
// Shameless self-plug :)
$url        =   'http://www.codeviking.net';

if(!empty($url))
{       

    if(!preg_match('%^https?://%i', $url))
    {
        echo get_json_error('Invalid URL');
    }

    $ch     =   curl_init();

    curl_setopt_array(  
                        $ch,    
                        array
                        (
                            CURLOPT_URL             =>  $url,
                            CURLOPT_RETURNTRANSFER  =>  true,
                            CURLOPT_FOLLOWLOCATION  =>  true
                        )
                     );

    $html   =   curl_exec($ch);

    if(!empty($html)) 
    {
        $doc                =   new DOMDocument($html);

        $doc->loadHTML($html);

        $images             =   $doc->getElementsByTagName('img');

        $image_srcs         =   array();

        foreach($images as $img) {
            foreach($img->attributes as $attribute_name => $attribute_node)
            {
                if($attribute_name == 'src')
                {
                    $src            =   $attribute_node->nodeValue;

                    // Parse image into absolute URL
                    if(!preg_match('%^https?://%i', $src))
                    {
                        $src    =   $url . '/' . preg_replace('%^\.?/%', '', $src);                         
                    }

                    $image_srcs[]   =   $src;

                }
            }
        }

        echo json_encode($image_srcs);  

        // And there you have it, a collection of image
        // paths to parse through on the client and add <img src="image_src" /> for each.
        //
        // So, for instance as your ajax success callback
        //
        //
        // var images = parseJSON(image_json);
        // for(var i = 0; i < images.length; i++)
        // {
        //  image_src = images[i];
        //  /* Requires jQuery */
        //  $('body').append($('<img />').attr('src', image_src));
        // }
    } 
    else 
    {
        echo get_json_error('Invalid URL');
    }
} 
else 
{
    echo get_json_error('Invalid URL');
}

function get_json_error($msg)
{   
    $error  =   array('error' => $msg);
    return json_encode($error);
}

Это действительно должно работать. Также я был бы признателен за голосование за ответ, поскольку я пытаюсь преодолеть отметку в 100 баллов! Спасибо и удачи!

1 голос
/ 06 января 2010

Реально не должно быть сложно реализовать. Кодирование - это весело, возьми это и катись с этим:

$ch = curl_init();

curl_setopt_array($ch, array(CURLOPT_URL => $_POST['url'], CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER, true));

$results = curl_exec($ch);

$doc = new DOMDocument();

$doc->loadHTML($results);

$images = $doc->getElementsByTagName('img');

Это должно вернуть DOMNodeList, я полагаю - оттуда вы перебираете и извлекаете атрибут src для каждого изображения, вставляете его в json_encode (), а затем пишете хороший веб-сервис для отправки URL-адреса и возвращаете симпатичную небольшую коллекцию изображений.

Я понимаю, что это не то, что вы просите, а начало.

...