Страница 5 из 8

Re: Поддержка сервиса PushBullet

Добавлено: Ср фев 08, 2017 9:47 pm
Sat
В приложении от Wanderer была возможность задавать несколько APIKey и слать одновременно всем.
В варианте от Сергея, то есть в официальном варианте MD только 1 APIKey можно задать, и, соответственно, слать на устройства только из одной учетки.
У меня и у жены разные гугл-учтки на устройствах, соответственно, PushBullet-учетки тоже разные и у каждой свой APIKey.
Как быть теперь?

Re: Поддержка сервиса PushBullet

Добавлено: Вт фев 14, 2017 9:20 pm
Bagir
Долгое время я пользовался этим сервисом, но 20.05.2016 сообщения перестали приходить на телефон, и в аккаунт вообще. С веб странички отправить можно, аккаунт живой. В то время я подумал, что может быть сменили api или вообще прикрыли лавочку. Сейчас решил найти причину. Сам сервис жив, api по прежнему предоставляет. Обновления МД были, но софт на сервере не изменялся. Сейчас начал искать последние следы в коде.
Файл .\lib\pushbullet\pushbullet.inc.php function postToPushbullet($ph). Добавил в начало debmes('postToPushbullet'); но в Debug тишина. Похоже где то порвалась цепочка, которая приводит к запуску функции. minimum level выставлен ниже уровня сообщений. Мне нужно сейчас найти это место в коде. Если кто знает, подскажите. И вообще, у кого нибудь работает этот сервис сейчас?

вызов функции

Код: Выделить всё

include_once('./lib/pushbullet/pushbullet.inc.php'); postToPushbullet('Привет'); 
приводит к регистрации ошибки:
PushBulletException, cURL Error: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Похоже придется копать api

Re: Поддержка сервиса PushBullet

Добавлено: Ср фев 15, 2017 12:35 pm
Bagir
Наверное я напрасно панику поднял. Вероятно проблема на моей стороне. curl не хочет работать с https. Никакие танцы с сертификатами и отключением проверки не помогают. Интересно, что такого моглопроизойти на сервере. раньше curl работал при указании curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);

Re: Поддержка сервиса PushBullet

Добавлено: Ср фев 15, 2017 1:26 pm
Bagir
Если пытаюсь ломиться по http, то получаю This server is only accessible over HTTPS и вот такого замечательного кота "cat":"(=^‥^=)" из их зверинца разных котиков.
А есть у кого рабочий простой скрипт чтобы постучаться на какой нибудь сайт по https? Только проверенно рабочий, чтобы мне с ветряными мельницами не сражаться.

Re: Поддержка сервиса PushBullet

Добавлено: Пт фев 17, 2017 1:41 pm
Victor_S
Bagir, у себя на рабочей системе активно пользую данный сервис по настоящее время. Все нормально работает. Но, я ничего на рабочей системе не обновлял уже около года. Система там крутится под Win7 64bit и старом server2go. Сейчас потихоньку готовлю переезд на новый сервер под линукс с современным окружением. Потихоньку, потому, что хочу не просто перенести, а несколько переосмыслить и переписать все. Поэтому заморочка с которой Вы столкнулись меня очень волнует. Пожалуйста, информируйте о "ходе расследования"...:)

Re: Поддержка сервиса PushBullet

Добавлено: Пт фев 17, 2017 2:02 pm
Bagir
Уже несколько раз пытался расковырять эту тему. К сожалению я пока не знаю причину. Вытащил php код и пробую отправить Pushbullet сообщение из сценария. В ответ получаю cURL Error: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
До сих пор не понимаю почему. Ради интереса попробовал отправить Pushover сообщение так же использую cUrl. И всё сразу получилось. Вероятно с моей библиотекой curl всё в порядке. Да и не обновлял я её уже много лет.
в МД для отправки сообщений на Pushbullet и Pushover используется cUrl. код весьма схожий. Примеры api есть у обоих. Оба работают по https. Пока у меня нет решения.

Re: Поддержка сервиса PushBullet

Добавлено: Пт фев 17, 2017 3:52 pm
Victor_S
Bagir писал(а): Пришлите мне пожалуйста ваш файл ./lib/pusbullet/pusbullet.inc.php' или просто его содержимое прямо тут в спойлере.
СпойлерПоказать

Код: Выделить всё

<?php
class PushBullet {
        private $_apiKey;

        const URL_PUSHES         = 'https://api.pushbullet.com/v2/pushes';
        const URL_DEVICES        = 'https://api.pushbullet.com/v2/devices';
        const URL_CONTACTS       = 'https://api.pushbullet.com/v2/contacts';
        const URL_UPLOAD_REQUEST = 'https://api.pushbullet.com/v2/upload-request';
        const URL_USERS          = 'https://api.pushbullet.com/v2/users';

        public function __construct($apiKey)
        {
                $this->_apiKey = $apiKey;

                if (!function_exists('curl_init')) {
                        throw new PushBulletException('cURL library is not loaded.');
                }
        }

        // Pushes

        public function pushNote($recipient, $title, $body = NULL)
        {
                return $this->_push($recipient, 'note', $title, $body);
        }

        public function pushLink($recipient, $title, $url, $body = NULL)
        {
                return $this->_push($recipient, 'link', $title, $url, $body);
        }

        public function pushAddress($recipient, $name, $address)
        {
                return $this->_push($recipient, 'address', $name, $address);
        }

        public function pushList($recipient, $title, $items)
        {
                return $this->_push($recipient, 'list', $title, $items);
        }

        public function pushFile($recipient, $filePath, $mimeType = NULL)
        {
                return $this->_push($recipient, 'file', $filePath, $mimeType);
        }

        public function getPushHistory($modifiedAfter = 0, $cursor = NULL)
        {
                $data = array();
                $data['modified_after'] = $modifiedAfter;

                if ($cursor !== NULL) {
                        $data['cursor'] = $cursor;
                }

                return $this->_curlRequest(self::URL_PUSHES, 'GET', $data);
        }
        
        public function dismissPush($pushIden) {
                return $this->_curlRequest(self::URL_PUSHES . '/' . $pushIden, 'POST', array('dismissed' => TRUE));
        }

        public function deletePush($pushIden)
        {
                return $this->_curlRequest(self::URL_PUSHES . '/' . $pushIden, 'DELETE');
        }

        // Devices

        public function getDevices()
        {
                return $this->_curlRequest(self::URL_DEVICES, 'GET');
        }

        public function deleteDevice($deviceIden)
        {
                return $this->_curlRequest(self::URL_DEVICES . '/' . $deviceIden, 'DELETE');
        }

        // Contacts
        
        public function createContact($name, $email)
        {
                if (filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
                        throw new PushBulletException('Create contact: Invalid email address.');
                }

                $queryData = array(
                        'name' => $name,
                        'email' => $email
                );

                return $this->_curlRequest(self::URL_CONTACTS, 'POST', $queryData);
        }

        public function getContacts()
        {
                return $this->_curlRequest(self::URL_CONTACTS, 'GET');
        }
        
        public function updateContact($contactIden, $name)
        {
                return $this->_curlRequest(self::URL_CONTACTS . '/' . $contactIden, 'POST', array('name' => $name));
        }

        public function deleteContact($contactIden)
        {
                return $this->_curlRequest(self::URL_CONTACTS . '/' . $contactIden, 'DELETE');
        }

        // Users

        public function getUserInformation()
        {
                return $this->_curlRequest(self::URL_USERS . '/me', 'GET');
        }

        public function updateUserPreferences($preferences)
        {
                return $this->_curlRequest(self::URL_USERS . '/me', 'POST', array('preferences' => $preferences));
        }


        private function _push($recipient, $type, $arg1, $arg2 = NULL, $arg3 = NULL)
        {
                $queryData = array();

                if (!empty($recipient)) {
                        if (filter_var($recipient, FILTER_VALIDATE_EMAIL) !== FALSE) {
                                $queryData['email'] = $recipient;
                        } else {
                                $queryData['device_iden'] = $recipient;
                        }
                }

                $queryData['type'] = $type;

                switch($type) {
                        case 'note':
                                $queryData['title'] = $arg1;
                                $queryData['body']  = $arg2;
                        break;


                        case 'link':
                                $queryData['title'] = $arg1;
                                $queryData['url']   = $arg2;

                                if ($arg3 !== NULL) {
                                        $queryData['body'] = $arg3;
                                }
                        break;


                        case 'address':
                                $queryData['name']    = $arg1;
                                $queryData['address'] = $arg2;
                        break;


                        case 'list':
                                $queryData['title'] = $arg1;
                                $queryData['items'] = $arg2;
                        break;


                        case 'file':
                                $fullFilePath = realpath($arg1);

                                if (!is_readable($fullFilePath)) {
                                        throw new PushBulletException('File: File does not exist or is unreadable.');
                                }

                                if (filesize($fullFilePath) > 25*1024*1024) {
                                        throw new PushBulletException('File: File size exceeds 25 MB.');
                                }

                                $queryData['file_name'] = basename($fullFilePath);

                                // Try to guess the MIME type if the argument is NULL
                                if ($arg2 === NULL) {
                                        $queryData['file_type'] = mime_content_type($fullFilePath);
                                } else {
                                        $queryData['file_type'] = $arg2;
                                }

                                // Request authorization to upload a file
                                $response = $this->_curlRequest(self::URL_UPLOAD_REQUEST, 'GET', $queryData);
                                $queryData['file_url'] = $response->file_url;
                                
                                // Upload the file
                                $response->data->file = '@' . $fullFilePath;
                                $this->_curlRequest($response->upload_url, 'POST', $response->data, FALSE, FALSE);
                        break;

                        default:
                                throw new PushBulletException('Unknown push type.');
                }

                return $this->_curlRequest(self::URL_PUSHES, 'POST', $queryData);
        }


        private function _curlRequest($url, $method, $data = NULL, $sendAsJSON = TRUE, $auth = TRUE)
        {
                $curl = curl_init();

                if ($method == 'GET' && $data !== NULL) {
                        $url .= '?' . http_build_query($data);
                }

                curl_setopt($curl, CURLOPT_URL, $url);

                if ($auth) {
                        curl_setopt($curl, CURLOPT_USERPWD, $this->_apiKey);
                }

                curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);

                if ($method == 'POST' && $data !== NULL) {
                        if ($sendAsJSON) {
                                $data = json_encode($data);
                                curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                                        'Content-Type: application/json',
                                        'Content-Length: ' . strlen($data)
                                ));
                        }

                        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                }

                curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);     // bad style, I know...
                curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); 

                curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
                curl_setopt($curl, CURLOPT_HEADER, FALSE);

                $response = curl_exec($curl);

                if ($response === FALSE) {
                        $curlError = curl_error($curl);
                        curl_close($curl);
                        throw new PushBulletException('cURL Error: ' . $curlError);
                }

                $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

                if ($httpCode >= 400) {
                        curl_close($curl);
                        throw new PushBulletException('HTTP Error ' . $httpCode);
                }

                curl_close($curl);

                return json_decode($response);
        }
}

class PushBulletException extends Exception
{
        // Exception thrown by PushBullet
}

/**
* Title
*
* Description
*
* @access public
*/
 function postToPushbullet($ph) {

  $push_bullet_apikey=trim(SETTINGS_PUSHBULLET_KEY);
  $p = new PushBullet($push_bullet_apikey);
  if (mb_strlen($title, 'UTF-8')>100) {
   $title=mb_substr($title, 0, 100, 'UTF-8').'...';
   $data=$ph;
  } else {
   $title=$ph;
   $data='';
  }


  if (defined('SETTINGS_PUSHBULLET_DEVICE_ID')) {
   $devices=explode(',', SETTINGS_PUSHBULLET_DEVICE_ID);
   $total=count($devices);
   for($i=0;$i<$total;$i++) {
    $push_bullet_device_id=trim($devices[$i]);
    if ($push_bullet_device_id) {

                  try {
                   $res=$p->pushNote($push_bullet_device_id, $title, $data);
                  } catch(Exception $e){
                   registerError('pushbullet', get_class($e).', '.$e->getMessage());
                  }

    }
   }
  } else {
   $res=$p->getDevices();
   $devices=$res->devices;
   $total=count($devices);
   for($i=0;$i<$total;$i++) {
    if ($devices[$i]->iden) {

                  try {
                   $res=$p->pushNote($devices[$i]->iden, $title, $data);
                  } catch(Exception $e){
                   registerError('pushbullet', get_class($e).', '.$e->getMessage());
                  }

    }
   }
  }
 }


?>

Re: Поддержка сервиса PushBullet

Добавлено: Пт фев 17, 2017 4:08 pm
Bagir
Спасибо! сейчас посмотрим есть ли отличия.

Re: Поддержка сервиса PushBullet

Добавлено: Пт фев 17, 2017 4:27 pm
Bagir
К великому моему сожалению файлы одинаковые. Впрочем я это и ожидал. Как итог:
Отправка через pushover работает

Код: Выделить всё

include_once('./lib/pushover/pushover.inc.php');
postToPushover('Тест отправки'); 
Отправка через pushbullet не работает

Код: Выделить всё

include_once('./lib/pushbullet/pushbullet.inc.php');
postToPushbullet('Тест отправки'); 
Регистрируется ошибка:
PushBulletException, cURL Error: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Оба используют cUrl и https. API у этих сервисов практически одинаковые.

Ради интереса, давайте сравним версии cUrl.
В консоли наберите

Код: Выделить всё

phpinfo();
и поиском найдите "curl"
СпойлерПоказать
cURL support enabled
cURL Information 7.36.0
Age 3
Features
AsynchDNS Yes
Debug No
GSS-Negotiate Yes
IDN No
IPv6 Yes
Largefile Yes
NTLM Yes
SPNEGO Yes
SSL Yes
SSPI Yes
krb4 No
libz Yes
CharConv No
Protocols dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp
Host i386-pc-win32
SSL Version OpenSSL/0.9.8g
ZLib Version 1.2.7
libSSH Version libssh2/1.4.2

Re: Поддержка сервиса PushBullet

Добавлено: Пт фев 17, 2017 4:48 pm
Victor_S
SSL Version OpenSSL/0.9.8g отличаются одной последней буквой. У меня l.