Кто-нибудь работал с этой библиотекой Highrise API PHP Wrapper? Мне нужна помощь в аутентификации - PullRequest
5 голосов
/ 25 мая 2011

Итак, я скачал класс-обёртку по этой ссылке на github:

https://github.com/ignaciovazquez/Highrise-PHP-Api

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

Я попытался запустить один из тестовых файлов в Терминале без аргументов, и вот чтоон сказал мне:

Usage: php users.test.php [account-name] [access-token]

Хорошо, так что тогда решил получить мои полномочия.Так что это то, что я понимаю, и, пожалуйста, исправьте, если я ошибаюсь:

имя учетной записи - это та часть, которая входит в URL вашей учетной записи высокого уровня.Поэтому, если ваш URL-адрес:

https://exampleaccount.highrisehq.com/

, тогда имя вашей учетной записи: "exampleaccount"

и ваш токен доступа - это токен аутентификации, который вы можете найти, перейдящелкнув Моя информация> API-токен в вашей учетной записи Highrise.

Это правильно?

Ну, в любом случае, я ввожу эту информацию, и скрипт завершается с фатальной ошибкой и таким сообщением:

Fatal error: Uncaught exception 'Exception' with message 'API for User returned Status Code: 0 Expected Code: 200' in /Users/me/Sites/sandbox/PHP/highrise_api_class/lib/HighriseAPI.class.php:137
Stack trace:
#0 /Users/me/Sites/sandbox/PHP/highrise_api_class/lib/HighriseAPI.class.php(166): HighriseAPI->checkForErrors('User')
#1 /Users/me/Sites/sandbox/PHP/highrise_api_class/test/users.test.php(13): HighriseAPI->findMe()
#2 {main}
  thrown in /Users/me/Sites/sandbox/PHP/highrise_api_class/lib/HighriseAPI.class.php on line 137

Я полон n00b и яЯ не понимаю, о чем идет речь, поэтому мне было интересно, может ли кто-нибудь помочь.Буду признателен.

Источник тестового сценария (users.test.php):

<?php
require_once("../lib/HighriseAPI.class.php");

if (count($argv) != 3)
    die("Usage: php users.test.php [account-name] [access-token]\n");

$hr = new HighriseAPI();
$hr->debug = false;
$hr->setAccount($argv[1]);
$hr->setToken($argv[2]);

print "Finding my user...\n";
$user = $hr->findMe();
print_r($user);

print "Finding all users...\n";
$users = $hr->findAllUsers();
print_r($users);

?>

и исходный код файла оболочки Highrise API (Highrise.API.класс) это:

<?php

    /*
        * http://developer.37signals.com/highrise/people
        *
        * TODO LIST:
        * Add Tasks support
        * Get comments for Notes / Emails
        * findPeopleByTagName
        * Get Company Name, etc proxy
        * Convenience methods for saving Notes $person->saveNotes() to check if notes were modified, etc.
        * Add Tags to Person
    */

    class HighriseAPI
    {
        public $account;
        public $token;
        protected $curl;
        public $debug;

        public function __construct()
        {
            $this->curl = curl_init();
            curl_setopt($this->curl,CURLOPT_RETURNTRANSFER,true);

        curl_setopt($this->curl, CURLOPT_HTTPHEADER, array('Accept: application/xml', 'Content-Type: application/xml'));
            // curl_setopt($curl,CURLOPT_POST,true);
            curl_setopt($this->curl,CURLOPT_SSL_VERIFYPEER,0);
            curl_setopt($this->curl,CURLOPT_SSL_VERIFYHOST,0);  
        }

        public function setAccount($account)
        {
            $this->account = $account;
        }

        public function setToken($token)
        {
            $this->token = $token;
            curl_setopt($this->curl,CURLOPT_USERPWD,$this->token.':x');
        }

        protected function postDataWithVerb($path, $request_body, $verb = "POST")
        {
            $this->curl = curl_init();

            $url = "https://" . $this->account . ".highrisehq.com" . $path;

            if ($this->debug)
                print "postDataWithVerb $verb $url ============================\n";


            curl_setopt($this->curl, CURLOPT_URL,$url);
            curl_setopt($this->curl, CURLOPT_POSTFIELDS, $request_body);
            if ($this->debug == true)
                curl_setopt($this->curl, CURLOPT_VERBOSE, true);

            curl_setopt($this->curl, CURLOPT_HTTPHEADER, array('Accept: application/xml', 'Content-Type: application/xml'));
          curl_setopt($this->curl, CURLOPT_USERPWD,$this->token.':x');
            curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER,0);
            curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST,0);
            curl_setopt($this->curl, CURLOPT_RETURNTRANSFER,true);


            if ($verb != "POST")
              curl_setopt($this->curl, CURLOPT_CUSTOMREQUEST, $verb);
            else
                curl_setopt($this->curl, CURLOPT_POST, true);

            $ret = curl_exec($this->curl);

            if ($this->debug == true)
                print "Begin Request Body ============================\n" . $request_body . "End Request Body ==============================\n";

            curl_setopt($this->curl,CURLOPT_HTTPGET, true);

            return $ret;
        }

        protected function getURL($path)
        {
            curl_setopt($this->curl, CURLOPT_HTTPHEADER, array('Accept: application/xml', 'Content-Type: application/xml'));
          curl_setopt($this->curl, CURLOPT_USERPWD,$this->token.':x');
            curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER,0);
            curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST,0);
            curl_setopt($this->curl, CURLOPT_RETURNTRANSFER,true);

            $url = "https://" . $this->account . ".highrisehq.com" . $path;

            if ($this->debug == true)
                curl_setopt($this->curl, CURLOPT_VERBOSE, true);


            curl_setopt($this->curl,CURLOPT_URL,$url);
            $response = curl_exec($this->curl);

            if ($this->debug == true)
                print "Response: =============\n" . $response . "============\n";

            return $response;

        }

        protected function getLastReturnStatus()
        {
            return curl_getinfo($this->curl, CURLINFO_HTTP_CODE); 
        }

        protected function getXMLObjectForUrl($url)
        {
            $xml = $this->getURL($url);
            $xml_object = simplexml_load_string($xml);
            return $xml_object;
        }

        protected function checkForErrors($type, $expected_status_codes = 200)
        {
            if (!is_array($expected_status_codes))
                $expected_status_codes = array($expected_status_codes);

            if (!in_array($this->getLastReturnStatus(), $expected_status_codes))
            {
                switch($this->getLastReturnStatus())
                {
                    case 404:
                        throw new Exception("$type not found");
                        break;
                    case 403:
                        throw new Exception("Access denied to $type resource");
                        break;
                    case 507:
                        throw new Exception("Cannot create $type: Insufficient storage in your Highrise Account");
                        break;

                    default:
                        throw new Exception("API for $type returned Status Code: " . $this->getLastReturnStatus() . " Expected Code: " . implode(",", $expected_status_codes));
                        break;
                }               
            }
        }

        /* Users */

        public function findAllUsers()
        {
            $xml = $this->getUrl("/users.xml");
            $this->checkForErrors("User");

            $xml_object = simplexml_load_string($xml);

            $ret = array();
            foreach($xml_object->user as $xml_user)
            {
                $user = new HighriseUser();
                $user->loadFromXMLObject($xml_user);
                $ret[] = $user;
            }

            return $ret;
        }

        public function findMe()
        {
            $xml = $this->getUrl("/me.xml");
            $this->checkForErrors("User");

            $xml_obj = simplexml_load_string($xml);
            $user = new HighriseUser();
            $user->loadFromXMLObject($xml_obj);
            return $user;
        }

        /* Tasks */

        public function findCompletedTasks()
        {
            $xml = $this->getUrl("/tasks/completed.xml");
            $this->checkForErrors("Tasks");
            return $this->parseTasks($xml);
        }

        public function findAssignedTasks()
        {
            $xml = $this->getUrl("/tasks/assigned.xml");
            $this->checkForErrors("Tasks");
            return $this->parseTasks($xml);
        }


        public function findUpcomingTasks()
        {
            $xml = $this->getUrl("/tasks/upcoming.xml");
            $this->checkForErrors("Tasks");
            return $this->parseTasks($xml);
        }

        private function parseTasks($xml)
        {
            $xml_object = simplexml_load_string($xml);          
            $ret = array();
            foreach($xml_object->task as $xml_task)
            {
                $task = new HighriseTask($this);
                $task->loadFromXMLObject($xml_task);
                $ret[] = $task;
            }

            return $ret;

        }

        public function findTaskById($id)
        {
            $xml = $this->getURL("/tasks/$id.xml");
            $this->checkForErrors("Task");
            $task_xml = simplexml_load_string($xml);
            $task = new HighriseTask($this);
            $task->loadFromXMLObject($task_xml);
            return $task;

        }

        /* Notes & Emails */

        public function findEmailById($id)
        {
            $xml = $this->getURL("/emails/$id.xml");
            $this->checkForErrors("Email");
            $email_xml = simplexml_load_string($xml);
            $email = new HighriseEmail($this);
            $email->loadFromXMLObject($email_xml);
            return $email;
        }

        public function findNoteById($id)
        {
            $xml = $this->getURL("/notes/$id.xml");
            $this->checkForErrors("Note");
            $note_xml = simplexml_load_string($xml);
            $note = new HighriseNote($this);
            $note->loadFromXMLObject($note_xml);
            return $note;
        }

        public function findPersonById($id)
        {
            $xml = $this->getURL("/people/$id.xml");

            $this->checkForErrors("Person");


            $xml_object = simplexml_load_string($xml);

            $person = new HighrisePerson($this);
            $person->loadFromXMLObject($xml_object);
            return $person;
        }

        public function findAllTags()
        {
            $xml = $this->getUrl("/tags.xml");
            $this->checkForErrors("Tags");

            $xml_object = simplexml_load_string($xml);          
            $ret = array();
            foreach($xml_object->tag as $tag)
            {
                $ret[(string)$tag->name] = new HighriseTag((string)$tag->id, (string)$tag->name);
            }

            return $ret;
        }

        public function findAllPeople()
        {
            return $this->parsePeopleListing("/people.xml");    
        }

        public function findPeopleByTagName($tag_name)
        {
            $tags = $this->findAllTags();
            foreach($tags as $tag)
            {
                if ($tag->name == $tag_name)
                    $tag_id = $tag->id;
            }

            if (!isset($tag_id))
                throw new Excepcion("Tag $tag_name not found");

            return $this->findPeopleByTagId($tag_id);
        }

        public function findPeopleByTagId($tag_id)
        {
            $url = "/people.xml?tag_id=" . $tag_id;
            $people = $this->parsePeopleListing($url);
            return $people; 
        }

        public function findPeopleByEmail($email)
        {
         return $this->findPeopleBySearchCriteria(array("email"=>$email));
        }

        public function findPeopleByTitle($title)
        {
            $url = "/people.xml?title=" . urlencode($title);

            $people = $this->parsePeopleListing($url);
            return $people;
        }



        public function findPeopleByCompanyId($company_id)
        {
            $url = "/companies/" . urlencode($company_id) . "/people.xml";
            $people = $this->parsePeopleListing($url);
            return $people;
        }

        public function findPeopleBySearchTerm($search_term)
        {
            $url = "/people/search.xml?term=" . urlencode($search_term);
            $people = $this->parsePeopleListing($url, 25);
            return $people;
        }

        public function findPeopleBySearchCriteria($search_criteria)
        {
            $url = "/people/search.xml";

            $sep = "?";
            foreach($search_criteria as $criteria=>$value)
            {
                $url .= $sep . "criteria[" . urlencode($criteria) . "]=" . urlencode($value);
                $sep = "&";
            }

            $people = $this->parsePeopleListing($url, 25);
            return $people;
        }

        public function findPeopleSinceTime($time)
        {
            $url = "/people/search.xml?since=" . urlencode($time);
            $people = $this->parsePeopleListing($url);
            return $people;
        }
        public function parsePeopleListing($url, $paging_results = 500)
        {
            if (strstr($url, "?"))
                $sep = "&";
            else
                $sep = "?";

            $offset = 0;
            $return = array();
            while(true) // pagination
            {
                $xml_url = $url . $sep . "n=$offset";
                // print $xml_url;
                $xml = $this->getUrl($xml_url);
                $this->checkForErrors("People");
                $xml_object = simplexml_load_string($xml);

                foreach($xml_object->person as $xml_person)
                {
                    // print_r($xml_person);
                    $person = new HighrisePerson($this);
                    $person->loadFromXMLObject($xml_person);
                    $return[] = $person;
                }

                if (count($xml_object) != $paging_results)
                    break;

                $offset += $paging_results;
            }

            return $return;
        }

    }

Извините, это такой длинный файл, но если это поможет, то пусть будет так.

РЕДАКТИРОВАТЬ: Так что я думаю, что я получил его на работу.Я должен был сказать, что я пытался протестировать эту библиотеку на моем локальном сервере, и по какой-то причине она продолжала давать сбой, но когда я переместил скрипт на свой сервер разработки в облаке Rackspace, он заработал.Это просто озадачивает меня.Оба сервера поддерживают PHP curl, поэтому я не могу понять, в чем проблема.

РЕДАКТИРОВАТЬ: Я не уверен, что разница между двумя конфигурациями сервера может быть, но в любом случае вот несколько скриншотов извывод моей функции phpinfo с обоих серверов моей конфигурации curl:

Сервер локального хоста:

enter image description here

и сервер облачных стоек:

enter image description here

Ответы [ 3 ]

2 голосов
/ 09 марта 2012

Форк API на ... https://github.com/AppSaloon/Highrise-PHP-Api ... кажется более развитым и лучше поддерживаемым.

Не столько, чтобы дать ответ, но, скорее, лучшую отправную точку.

1 голос
/ 25 мая 2011

Ах, так как на самом деле нет HTTP-кода ошибки 0, я ожидаю, что ваш запрос не отправлен на сайт Highrise, или вы неправильно передаете имя учетной записи и токен классу.Можете ли вы указать источник вашего users.test.php класса?

РЕДАКТИРОВАТЬ: протестировал класс и ваш код, и он работает для меня.Возможно, вы либо неправильно скопировали файл библиотеки, либо неправильно скопировали свой токен.

0 голосов
/ 19 апреля 2014

У меня была такая же проблема. Я определенно имел неправильный аккаунт. У меня было https://foo.highrisehq.com вместо просто foo.

...