Nano Hash - криптовалюты, майнинг, программирование

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

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

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

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

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

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

Хорошо, тогда решил получить свои учетные данные. Я так понимаю, поправьте, если не прав:

имя учетной записи — это та часть, которая входит в URL-адрес вашей учетной записи highrise. Итак, если ваш 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.class):

<?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:

Локальный сервер:

введите здесь описание изображения

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

введите здесь описание изображения


  • Пробовали через http? какой ресурс вы пытаетесь получить (люди, категории ....) 25.05.2011
  • Эм, люди, я думаю. Я просто пытаюсь проверить, работают ли мои учетные данные. Что вы подразумеваете под попыткой с http? 25.05.2011

Ответы:


1

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

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

24.05.2011
  • Не могли бы вы сказать мне, тестировали ли вы код в своем браузере или терминале, и если вы тестировали его на своем терминале, как вы вызывали команду (конечно, с поддельными значениями токена и именем учетной записи)? Я все еще не могу заставить его работать, и мне нужно, чтобы это работало на меня. Любая помощь будет оценена по достоинству. 25.05.2011
  • Я заставил его работать, но на моем сервере онлайн-разработки в облаке Rackspace. Видите ли, я пытался проверить это на своем локальном сервере, и это не сработало, что бы я ни делал. 25.05.2011
  • Протестировал в терминале: мой файл назывался p1.php и я вызывал его с помощью php p1.php {username} {token}. Он выводит объект HighriseUser и массив с одним объектом HighriseUser (поскольку в моей учетной записи highrise есть только один пользователь). Я использую ваш код полностью без изменений, за исключением расположения библиотеки (у меня есть PHP-файл Highrise в той же папке), но в остальном вы не допустили ошибок в своем коде. 25.05.2011
  • АХ. Вероятно, вам не хватает зависимости или ваш локальный php каким-то образом неправильно настроен. Если вы создаете файл php с <?php phpinfo(); , показывает ли он, что у вас установлены curl и simplexml? 25.05.2011
  • Я только что проверил, и у меня включены curl и simplexml на обоих серверах. Однако конфигурация в облаке Rackspace говорит OpenSSL. У меня есть пара скриншотов выше. Я не знаю, имеет ли это значение. Это может быть. 25.05.2011
  • Ах, да: если вам не хватает OpenSSL, это не сработает. Они не позволяют вам войти в систему без использования SSL. 25.05.2011
  • Ну, это, наверное, объясняет. Большое спасибо за вашу помощь Ферми. Ваша помощь и самоотверженность были высоко оценены, и я многому научился. 25.05.2011

  • 2

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

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

    09.03.2012
  • Я использовал эту версию, так как мне нужна была поддержка компании. Он кажется более зрелым и немного переработанным по сравнению с оригиналом с точки зрения структуры кода, хотя мне не удалось заставить работать поддержку настраиваемых полей. 11.09.2012

  • 3

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

    18.04.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..