PHP class для Goo.gl

    image
    И опять немного о Goo.gl. Листая хабр видел предложения на JS, но лично мне они не подходили. Сегодня случайно наткнутся на симпатичное для меня решения, коим и делюсь с общественностью…

    <?php  
    
    // Для начала проверим существование возможности ;)
    if (!function_exists('curl_init')) 
        trigger_error('CURL is not installed');     
    
    /** 
     * GoogleURL 
     *  
     * Небольшой класс для модификации урлов посредством Goo.gl  
     *  
     * @author Bas van Dorst <info@basvandorst.nl> 
     * @version 1.0  
     * @package Google 
     */ 
    
    class GoogleURL { 
         
        /** 
         * Адрес Google URL shortener API 
         * @var string 
         */ 
        private static $_api = "http://goo.gl/api/shorten"; 
         
        /** 
         * Таймаут Curl 
         * @var int 
         */ 
        private static $_curl_timeout = 5; 
         
        /** 
         * URL-regex (http://flanders.co.nz/2009/11/08/a-good-url-regular-expression-repost/) 
         * @var string 
         */ 
        private static $_urlregex = '/(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?:\w+:\w+@)?(?:(?:[-\w]+\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?::[\d]{1,5})?(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?/'; 
         
        /** 
         * Замена существующего URL ссылкой, полученной от Goo.gl URL. 
         *  
         * @param string|array $input_url 
         * @return string если успешно, и запрашиваемый URL при провале. 
         */ 
        public static function shortURL($input_url)  
        { 
            /** 
             * Получаем первое значение массива, если $input_url является массивом (результат shortText) 
             */ 
            $url = ( is_array( $input_url ) ) ? $input_url[0] : $input_url; 
             
            /** 
             *  
             */ 
            $post_fields = array(    "security_token" => "null", 
                                                 "url"                    => $url 
                                            );   
              
            $ch = curl_init(); 
            curl_setopt($ch, CURLOPT_URL, self::$_api); 
            curl_setopt($ch, CURLOPT_HEADER, 0); 
            curl_setopt($ch, CURLOPT_POST, TRUE); 
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query( $post_fields ) ); 
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
            curl_setopt($ch, CURLOPT_TIMEOUT, self::$_curl_timeout); 
            $output = json_decode( curl_exec($ch) ); // Google возвращает JSON-объект 
            curl_close($ch); 
             
            return (isset( $output->short_url )) ? $output->short_url : $url; 
        } 
         
        /** 
         * Заменяем все  ссылки в text/HTML-document на Goo.gl ссылки 
         *  
         * @param string $input_text 
         * @return array|null 
         */ 
        public static function shortText($input_text)  
        { 
            return preg_replace_callback( 
                        self::$_urlregex,  
                        __CLASS__.'::shortURL',  
                        $input_text 
                    ); 
        } 
    }
    


    Мне кажется, изобилие слов тут не требуется, все предельно понятно. Пользуйтесь на здоровье ;) GPL тому способствует ;)

    p.s.
    Требования для работы класса:
    1. Поддержка curl, или еще тут посмотреть
    2. PCRE компилируется по-умолчанию. Если отключили при компилировании — то на вашей совести.
    3. Для JSON библиотека компилируется также по-умолчанию

    Обучать, как включать расширения в рамках данного топика, думаю, не стоит.
    А все остальное — требует наличие php ;)

    Similar posts

    Ads

    Comments 45

      +10
      Главное, что радует. Что даже в таком небольшом кусочке кода не поленились написать комментарии.
      Спасибо)
        0
        В противном случае банды критиков с хабра дадут о себе знать :~)
          +1
          Но на русском -(.
            +2
            :) Вас не устраивает? Трудно читать?
          +1
          Спасибо.
            0
            Впервые услышал о Goo.gl. И только по коду понял, о чем речь :) Спасибо за комментарии в коде. Написано просто и понятно.
              0
              думаю надо дописать что требуется к этому классу
              например php-extension curl итп
                +1
                Ну вроде отсюда:

                if (!function_exists('curl_init')) 
                    trigger_error('CURL is not installed');   
                


                это будет и так всем понятно.
                  0
                  ledworm верно подметил, все что не касается curl — есть по дефолту при установке. Ну если вдруг кому понадобится не ошибка, а первичные требования — добавил в конец.
                  –4
                  как это использовать?
                    0
                    Вот как использовать — имхо кому что. Я использую для того, чтобы обернуть в такой вид все ссылки, которые отличаются от основного домена, при генерации страницы.
                      –4
                      Не, я скорее именно про способ использования — в ручную ему url вставлять или повесить на кнопку в браузере или ещё что?
                        0
                        murka3000, Вы издеваетесь?

                        пункт 1.

                        private static $_urlregex = '/(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?:\w+:\w+@)?(?:(?:[-\w]+\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?::[\d]{1,5})?(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?/';
                        


                        Пункт 2.

                        public static function shortText($input_text)  
                            { 
                                return preg_replace_callback( 
                                            self::$_urlregex,  
                                            __CLASS__.'::shortURL',  
                                            $input_text 
                                        ); 
                            } 
                        


                        вывод — ссылки ему подставлять не надо. ему надо дать текст с ссылками.
                          –4
                          Я может, конечно, с утра плохо соображаю, но непонятно как раз «ему надо дать текст с ссылками». Где давать?!
                          • UFO just landed and posted this here
                            0
                            Если бы Вы в конце кода добавили строчку, как пример использования:
                            echo GoogleURL::shortURL(«habrahabr.ru/blogs/google/105546»);
                            То у меня бы вопросов не возникало, я бы не нахватал минусов и, к тому же, не выглядел бы идиотом.
                          +3
                          А зачем это делать?
                          0
                          вам еще рано это знать
                          0
                          А функцию file_fet_contents('http://goo.gl/api/shorten?...'); можно юзать?
                            0
                            прошу прощения file_get_contents
                              0
                              можно, только отправлять данные нужно через POST.
                                0
                                file_get_content() с лёгкостью справляется с отправкой данных методом POST
                                  +1
                                  Я и не спорю, что справляется. Я всего лишь подчеркнул с каким методом нужно работать.
                                0
                                curl быстрее, зачем?
                                  0
                                  Возможен случай, что на сервере не доступен curl. Если бы можно было применить какую ни будь альтернативу — было бы очень даже кстати.
                                –2
                                Вас уже взяли на работу в google? :)
                                  –1
                                  Пока нет ;)
                                  0
                                  Спасибо. Выглядит и правдо симпатично, сохраню в коллекцию полезностей.
                                    +3
                                    private static $_urlregex = '/(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?:\w+:\w+@)?(?:(?:[-\w]+\.)+(?:ru|su|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?::[\d]{1,5})?(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?/';
                                    OMG… неужели попроще нельзя из текста ссылки выбирать?
                                      0
                                      Пример простого парсера ссылок в студию, пожалуйста.
                                        +1
                                        интересно, автор топика зачем-то добавил в код ru|su|, хотя эти зоны и так захватываются через [a-z]{2}
                                        0
                                        а как же поддержка доменов в $_urlregex на нац. языках?
                                          +1
                                          допишите. в чем проблема?
                                          0
                                          без кеширования, имхо, не имеет смысла. при том кешировать стоит, наверное, не только отрендеренный текст (что можно делать уже в приложении), но и отправленные-полученные урлы. например, в тексте может несколько раз встречатся ссылка на одно и то же место.
                                          не хватает проверки на то, не сокращена ли уже ссылка.

                                          по хорошему — надо было бы это сделать без статики с возможность наследования. скажем, абстрактный класс UrlShortener, а от него уже наследовать всякие goo.gl, j.mp и остальные. И сразу сделать несколько классов для выбора, может кому-то не нравится goo.gl, т.к. надо не больше четырех символов.
                                            0
                                            хотя, я так понял, вы только комменты на русский перевели
                                              0
                                              Увы, не только.
                                                0
                                                просто я глянул и сходу не обнароужил различий в сравнении с оригиналом
                                                  0
                                                  Ну оригинал никто не скрывал )))

                                                  return (isset( $output->short_url ))? $output->short_url: $url;

                                                  эта строчка, к примеру, исправлена. Т.к. Она имела отношение к оригиналу — то внес изменение.

                                                  Моя модификация еще не завершена и второсортный продукт показывать смысла не вижу. А этого будет достаточно для затей у других + класс достаточен.
                                                    0
                                                    я заметил, ссылку взял из вашего сообщения. да, в строчке ошибка была
                                              0
                                              Меня также посетила подобная мысль (про несколько сервисов). Проблема сейчас одна — неимение времени, но зачатки модуля для Drupal 7 уже заложены.

                                              При моей реализации (то, как я применил на сайте) — все урлы, которые попадают из стороны и отличаются от базового домена я перевожу в короткие, сохраняя их при этом в БД. shortText не юзаю, а вот shortURL на ура. При этом, есть косяк — при большом изобилии ссылок наткнетесь на квоту. Потому просто текст обрабатывать… ну у меня через раз работало…
                                                0
                                                я так понимаю, надо парсить пост при его добавлении, а не когда выводишь. но, по хорошему, лучше пользоваться своим сокращателем. как на хабре: habr.ru/p/105546/. Не будете зависеть от других служб.
                                                  0
                                                  По логике да — парсить надо при сохранении. Но на практике только этим не отделаться (в начале). Да и вопрос еще тот — а оно вам точно надо? Это ведь дорогостоящая операция получается.

                                                  дык если бы всем надо было писать свои сокращатели — то не нужны бы были другие сервисы. Вас силком никто не заставляет использовать…
                                                    0
                                                    вы мне так отвечаете, словно я вас критикую. просто обсуждаю тему, предлагаю варианты.
                                                    вы молодец, что не сидите на месте, а что-то делаете
                                                      0
                                                      А я всегда рад критике. Она заставляет мозги шевелиться ;)
                                              –1
                                              в последнее время гугл отказывается обрабатывать ссылки после некоторого числа обработок. на примере моего собственного сайта — почти на всех популярных записях гугл короткую ссылку не отдает, а пишет про ошибку квота екседед. итого как вывод: данный класс бесполезен без без кеширования полученных ссылок, иначе гугл вас забанит.

                                              Only users with full accounts can post comments. Log in, please.