Получить содержание Facebook, как Box плагин с curl - PullRequest
2 голосов
/ 11 ноября 2011

Я работаю над сайтом, который должен быть полностью видимым для пользователей в месте, где Facebook.com для них запрещен.так что мой плагин как Facebook не появится для них.(чтобы не локализовать этот вопрос, предположим, что я хочу обойти все клиентские брандмауэры и показать как плагин box как простой HTML на моем веб-сайте (мой веб-сайт там не заблокирован)).

Мой серверЯ мог получить доступ к Facebook.com, и я подумал, что могу получить содержимое моего плагина с помощью curl (на компьютере моего сервера), а затем выполнить и показать содержимое этой страницы в виде простого HTML-кода в любой части моего веб-сайта.Поэтому я только что написал следующий скрипт:

<?
$c = curl_init('https://www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2Fstevejobs&amp;width=292&amp;height=258&amp;colorscheme=dark&amp;show_faces=true&amp;border_color&amp;stream=false&amp;header=false');

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: www.facebook.com', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
', 'Accept-Language: en-us,en;q=0.5', 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Accept-Encoding: gzip, deflate'));
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0");

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt(CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);



$html = curl_exec($c);

if (curl_error($c))
    die(curl_error($c));

$status = curl_getinfo($c, CURLINFO_HTTP_CODE);

curl_close($c);
?>

Удивительно, но приведенный выше код работает для https://www.youtube.com(, который тоже там запрещен) или https://www.google.com, но не работает с этим URL или даже просто https://www.facebook.com на моем сервере.

Еще один вопрос: если я использую https://www.youtube.com вместо Facebook.com, я все равно не могу получить файлы CSS или Javascript, которые использовались на YouTube.com (потому что они тоже забанены и клиенты тоже не могут его скачать).Я просто могу видеть тексты и некоторые изображения.Я также хочу, чтобы curl автоматически получал содержимое файлов CSS и Javascript.

Я также использовал YQL для того, чтобы получить содержимое плагина like box от Facebook.com, но получил следующий результат:

YQL-оператор:

select * from html where url = 'https://www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2Fstevejobs&amp;width=292&amp;height=258&amp;colorscheme=dark&amp;show_faces=true&amp;border_color&amp;stream=false&amp;header=false'

Результат:

    <?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"
    yahoo:count="0" yahoo:created="2011-11-11T11:41:10Z" yahoo:lang="en-US">
    <diagnostics>
        <publiclyCallable>true</publiclyCallable>
        <url
            error="Redirected to a robots.txt restricted URL: https://www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2Fstevejobs&amp;amp;width=292&amp;amp;height=258&amp;amp;colorscheme=dark&amp;amp;show_faces=true&amp;amp;border_color&amp;amp;stream=false&amp;amp;header=false"
            execution-start-time="1" execution-stop-time="6"
            execution-time="5" http-status-code="403"
            http-status-message="Forbidden" proxy="DEFAULT"><![CDATA[https://www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2Fstevejobs&amp;width=292&amp;height=258&amp;colorscheme=dark&amp;show_faces=true&amp;border_color&amp;stream=false&amp;header=false]]></url>
        <user-time>6</user-time>
        <service-time>5</service-time>
        <build-version>23377</build-version>
    </diagnostics> 
    <results/>
</query>

Похоже, что есть проблема с robots.txt на facebook.com.Следует отметить, что вышеприведенный оператор YQL работает для других веб-сайтов (например, https://www.youtube.com или https://www.yahoo.com).

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

1 Ответ

3 голосов
/ 17 ноября 2011

в вашем коде есть ошибки:

1- изменить $ c на $ ch во всех частях вашего кода.

2- добавьте «echo $ html» после функции curl_exec.

3- , как @Dan упомянул в комментарии, CURLOPT_HTTPHEADER не требуется.просто удалите его.

4- настройка curlopt_cookiejar не обязательна, но я всегда устанавливаю ее с помощью curl.(просто чтобы убедиться, что все работает нормально)

5- удалите все до <!DOCTYPE, чтобы правильно отобразить содержимое.

попробуйте следующий код:

$ch = curl_init('https://www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2Fstevejobs&width=292&height=258&colorscheme=dark&show_faces=true&border_color&stream=false&header=false');

curl_setopt($ch, CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_COOKIEJAR , "facebookcookies"); 
curl_setopt($ch, CURLOPT_URL,"https://www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2Fstevejobs&width=292&height=258&colorscheme=dark&show_faces=true&border_color&stream=false&header=false"); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

$html = curl_exec($ch);

//remove everything before <!DOCTYPE
echo preg_replace('/^[^<!]*<!\s*/', '<!', $html);

if (curl_error($ch))
    die(curl_error($ch));

// Get the status code
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);
...