Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 58

Проблема соединения в gmail api

02.06.2020, 14:41. Показов 3408. Ответов 41
Метки api, js, php (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Уже более 2 суток мучаюсь с gmail api. Вроде все ключи подходят, файл credentials.json новый поставил. Но все равно идет ошибка. Почему-то функция createAuthURL выдает null. Нижу скину полную ошибку:

An uncaught Exception was encountered
Type: Error

Message: Call to a member function createAuthUrl() on null

Filename: /var/www/cheltemov/data/www/k-crm.ru/application/libraries/Attach_lib.php

Line Number: 50

Backtrace:

File: /var/www/cheltemov/data/www/k-crm.ru/application/controllers/api/Orders.php
Line: 5105
Function: get_attachments

File: /var/www/cheltemov/data/www/k-crm.ru/index.php
Line: 323
Function: require_once
/var/www/cheltemov/data/www/k-crm.ru/application/libraries/Attach_lib.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public function get_attachments($search) { 
if (!preg_match('/[0-9+]{3,18}/', $search)) { 
return 'Поиск только по номеру телефона в формате +71234567890'; 
die(); 
} 
if($this->is_connected()) { //Если соединение с сервисами есть, тогда выполняем запрос 
$files_list=$this->get_mail($search); 
return $files_list; 
} else { //Если нет соединения, нужно запросить данные пользователя 
if(!isset($_GET['code'])) { 
$authUrl = $this->client->createAuthUrl(); 
return "<a href='$authUrl'>Click here to link your account</a>"; 
} 
} 
}
Я не понимаю что я сделал не так( Можете на ставить на правильный путь !
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.06.2020, 14:41
Ответы с готовыми решениями:

Не работает отправка письма с вложением через gmail api
Здравствуйте! Я использую следующий код для формирования тела письма по протоколу smtp (простой текст и текст с вложениями). Он...

Проблема с получением писем с pop.gmail.com (ssl)
Взял за основу пример в этом посте https://www.cyberforum.ru/windows-forms/thread171086.html#post999538 попытался доавить подключение...

Вирус шифратор files1147@gmail.com post100023@gmail.com
Здравствуйте! Итак, есть ПК (не мой) заражённый вирусом шифровальщиком. Здесь инфа автора вируса: Ваши файлы были зашифрованы. ...

41
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
03.06.2020, 11:59
Студворк — интернет-сервис помощи студентам
Тогда попробуйте удалить return false - совсем строку удалите. а return true в самом конце метода:
PHP
1
2
3
4
else {
   $this->is_connected = TRUE;
}
return true;
Добавлено через 1 минуту
если не получится - будем делать через лог файл с исходным вашим кодом
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 58
03.06.2020, 12:05  [ТС]
Цитата Сообщение от vinikon Посмотреть сообщение
да и затем, если настроим, то можно все так и оставить, только добавить в начале create_client() проверку на наличие установленного соединения
если ставить проверку, все равно бесконечная авторизация получается (

Добавлено через 3 минуты
Вроде так ?
PHP
1
2
3
4
5
6
            file_put_contents($tokenPath, json_encode($this->client->getAccessToken()));
//            return false;
        } else {
            $this->is_connected = TRUE;
        }
        return true;
Однако теперь ошибка есть:
An error occurred: { "error": "invalid_grant", "error_description": "Bad Request" }{"success":false,"audio":[]}
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
03.06.2020, 12:07
тогда вернемся к вашему коду.
ваш код с записью результатов в файл. потом откройте и посмотрите файл $_SERVER['DOCUMENT_ROOT'].'/debug.txt'.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
 
/**
 * Class Attach_lib класс библиотеки скачивания приложений письма из gmail.com с помощью gmail-api
 */
 
class Attach_lib
{
    /**
     * Экземпляр приложения
     *
     * @var
     */
    protected $CI;
    private $client;        //Объект Google Client
    private $credentials;   //Данные пользователя
    private $userId;        //ID пользователя (зачение 'me' значит, что используется пользователь с данными в credentials)
    private $temp_folder;   //Папка для хранения attachments
    private $is_connected;  //Переключатель соединения (true - соединен с gmail, false - нет)
 
    /**
     * Auth_lib constructor.
     */
    public function __construct()
    {
        $this->CI =& get_instance();
        $this->credentials=APPPATH.'credentials.json';  //Путь к файлу credentials, получаемого с сервиса Google API
        $this->client = $this->create_client();
        $this->userId='me';
        $this->temp_folder=FCPATH.'files/audio/';       //Путь ко временной папке хранения приложений
    }
 
    /**
     * Функция получения списка приложений к письмам по поиску
     * @param string $search    слово для фильтрации в subject
     * @return string           Строка об ошибке
     * @return array            Массив [partId, filename, attachmentId]
     */
    public function get_attachments($search) {
        $fid = fopen($_SERVER['DOCUMENT_ROOT'].'/debug.txt', 'a+');
        fwrite($fid, "----attachment is start----\n");
        if (!preg_match('/[0-9+]{3,18}/', $search)) {
            return 'Поиск только по номеру телефона в формате +71234567890';
            die();
        }
        if($this->is_connected()) { 
            //Если соединение с сервисами есть, тогда выполняем запрос
            fwrite($fid, "attachment is connected\n");
            $files_list=$this->get_mail($search);
            fwrite($fid, "attachment get_mail is finised:\n".print_r($files_list, true)."\n");
            return $files_list;
        } else {   //Если нет соединения, нужно запросить данные пользователя
            fwrite($fid, "attachment is not connected\n");
            if(!isset($_GET['code'])) {
                $authUrl = $this->client->createAuthUrl();
                return "<a href='$authUrl'>Click here to link your account</a>";
            }
        }
        fclose($fid);
    }
 
    /**
     * Функция проверки соединения к сервисам Google
     */
    public function is_connected() {
        return $this->is_connected;
    }
 
    /**
     * Функция создания объекта Google Client под пользователя
     */
    public function create_client() {
         $fid = fopen($_SERVER['DOCUMENT_ROOT'].'/debug.txt', 'a+');
         fwrite($fid, "----create_client is start----\n");
        $client = new Google_Client();
        $client->setApplicationName('Attachments getter');
        $client->setScopes(Google_Service_Gmail::GMAIL_READONLY);
        $client->setAuthConfig($this->credentials);
        //Если песочница то редирект на песочницу если продакшен то на продакшен
        if (ENVIRONMENT == 'development') {
            $client->setRedirectUri('https://cheltemov.k-crm.ru');  //редирект после авторизации(Должен совпадать с настройками учетных данных в google APIs)
        } else {
            $client->setRedirectUri('https://k-crm.ru');  //редирект после авторизации(Должен совпадать с настройками учетных данных в google APIs)
        }
        $client->setLoginHint('itsoperator2@gmail.com');
        $client->setPrompt('select_account consent');
        $client->setAccessType('offline');        // offline access
        $client->setIncludeGrantedScopes(true);   // incremental auth
         fwrite($fid, "create_client set is finsed\n");
        // Load previously authorized token from a file, if it exists.
        // The file token.json stores the user's access and refresh tokens, and is
        // created automatically when the authorization flow completes for the first
        // time.
        $tokenPath = APPPATH.'token.json';
        if (file_exists($tokenPath)) {
            fwrite($fid, "create_client: tokenPath exists\n");
            $accessToken = json_decode(file_get_contents($tokenPath), true);
            $client->setAccessToken($accessToken);
        }
 
        // If there is no previous token or it's expired.
        if ($client->isAccessTokenExpired()) {
            fwrite($fid, "create_client: AccessTokenExpired \n");
            // Refresh the token if possible, else fetch a new one.
            if ($client->getRefreshToken()) {
                fwrite($fid, "create_client: getRefreshToken\n");
                AccessTokenExpired
                $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
            } elseif(isset($_GET['code'])) {
                fwrite($fid, "create_client: isset _GET code\n");
                $authCode = $_GET['code'];
                // Exchange authorization code for an access token.
                $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
                $client->setAccessToken($accessToken);
 
                // Check to see if there was an error.
                if (array_key_exists('error', $accessToken)) {
                    throw new Exception(join(', ', $accessToken));
                }
            } else {
                fwrite($fid, "create_client: connected is FALSE \n");
                $this->is_connected = FALSE;
                $authUrl = $client->createAuthUrl();
                header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
                exit;
            }
            // Save the token to a file.
            if (!file_exists(dirname($tokenPath))) {
                fwrite($fid, "create_client: make token`s dir\n");
                connected = FALSE
                mkdir(dirname($tokenPath), 0700, true);
            }
            file_put_contents($tokenPath, json_encode($client->getAccessToken()));
            fclose($fid);
            return $client;
        } else {
            fwrite($fid, "create_client: connected is true\n");
            $this->is_connected = TRUE;
            fclose($fid);
            return $client;
        }
    }
 
    //Метод поиска писем по заданной фразе с приложениями
    public function get_mail($search) {
        $fid = fopen($_SERVER['DOCUMENT_ROOT'].'/debug.txt', 'a+');
         fwrite($fid, "----get_mail is start----\n");
        $service = new Google_Service_Gmail($this->client);
        fwrite($fid, "get_mail is created_result\n".print_r($service, true)."\n");
        $pageToken = NULL;
        $messages = array();
        $opt_param = array('q'=>"subject:{$search} has:attachment");
        $files = array();
        do {
            try {
                if ($pageToken) {
                    $opt_param['pageToken'] = $pageToken;
                }
                $messagesResponse = $service->users_messages->listUsersMessages($this->userId, $opt_param);
                if ($messagesResponse->getMessages()) {
                    $messages = array_merge($messages, $messagesResponse->getMessages());
                    $pageToken = $messagesResponse->getNextPageToken();
                }
            } catch (Exception $e) {
                print 'An error occurred: ' . $e->getMessage();
            }
        } while ($pageToken);
         fwrite($fid, "get_mail messages_result\n".print_r($messages, true)."\n");
        foreach ($messages as $message) {
            $messageId = $message->getId();
            $message = $service->users_messages->get($this->userId, $messageId);
            $messageDetails=$message->getPayload();
 
            foreach ($messageDetails['parts'] as $key => $value) {
                if (!isset($value['body']['data'])) {
                    if($value['mimeType']=='application/octet-stream' OR $value['mimeType']=='audio/mpeg') {
                        $exploded_array = explode('__', $value['filename']);
                        $result_name = $exploded_array[0] . $exploded_array[1] . '.mp3';
                        if (!file_exists($this->temp_folder . $result_name)) {
                            //Скачиваем аттачмент
                            $attachment = $service->users_messages_attachments->get($this->userId, $messageId, $value['body']['attachmentId']);
                            $data=strtr($attachment->data, array('-' => '+', '_' => '/'));
                            file_put_contents($this->temp_folder . $result_name, base64_decode($data));
                        }
                        //Формируем массив на выдачу данных
                        $files[]=['filename'=>$result_name, 'link'=> $this->temp_folder . $result_name];
 
                    }
                }
            }
        }
        fwrite($fid, "get_mail result\n".print_r($files, true)."\n");
        fclose($fid);
        return $files;
    }
}
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 58
03.06.2020, 12:16  [ТС]
Так странно, что-то с форумом. Я сделал что вы говорили.
PHP
1
2
3
4
5
6
            file_put_contents($tokenPath, json_encode($this->client->getAccessToken()));
//            return false;
        } else {
            $this->is_connected = TRUE;
        }
        return true;
Но тогда выдается ошибка:
An error occurred: { "error": "invalid_grant", "error_description": "Bad Request" }{"success":false,"audio":[]}

Добавлено через 3 минуты
Так новые ошибки. Просто хочу сказать что сайт активен и находиться в сети
An uncaught Exception was encountered
Type: ParseError

Message: syntax error, unexpected '$client' (T_VARIABLE)

Filename: /var/www/cheltemov/data/www/k-crm.ru/application/libraries/Attach_lib.php

Line Number: 109

Backtrace:

File: /var/www/cheltemov/data/www/k-crm.ru/application/controllers/api/Orders.php
Line: 5101
Function: library

File: /var/www/cheltemov/data/www/k-crm.ru/index.php
Line: 323
Function: require_once

Добавлено через 31 секунду
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
 
/**
 * Class Attach_lib класс библиотеки скачивания приложений письма из gmail.com с помощью gmail-api
 */
 
class Attach_lib
{
    /**
     * Экземпляр приложения
     *
     * @var
     */
    protected $CI;
    private $client;        //Объект Google Client
    private $credentials;   //Данные пользователя
    private $userId;        //ID пользователя (зачение 'me' значит, что используется пользователь с данными в credentials)
    private $temp_folder;   //Папка для хранения attachments
    private $is_connected;  //Переключатель соединения (true - соединен с gmail, false - нет)
 
    /**
     * Auth_lib constructor.
     */
    public function __construct()
    {
        $this->CI =& get_instance();
        $this->credentials=APPPATH.'credentials.json';  //Путь к файлу credentials, получаемого с сервиса Google API
        $this->client = $this->create_client();
        $this->userId='me';
        $this->temp_folder=FCPATH.'files/audio/';       //Путь ко временной папке хранения приложений
    }
 
    /**
     * Функция получения списка приложений к письмам по поиску
     * @param string $search    слово для фильтрации в subject
     * @return string           Строка об ошибке
     * @return array            Массив [partId, filename, attachmentId]
     */
    public function get_attachments($search) {
        $fid = fopen($_SERVER['DOCUMENT_ROOT'].'/debug.txt', 'a+');
        fwrite($fid, "----attachment is start----\n");
        if (!preg_match('/[0-9+]{3,18}/', $search)) {
            return 'Поиск только по номеру телефона в формате +71234567890';
            die();
        }
        if($this->is_connected()) {
            //Если соединение с сервисами есть, тогда выполняем запрос
            fwrite($fid, "attachment is connected\n");
            $files_list=$this->get_mail($search);
            fwrite($fid, "attachment get_mail is finised:\n".print_r($files_list, true."\n"));
            return $files_list;
        } else {   //Если нет соединения, нужно запросить данные пользователя
            fwrite($fid, "attachment is not connected\n");
            if(!isset($_GET['code'])) {
                $authUrl = $this->client->createAuthUrl();
                return "<a href='$authUrl'>Click here to link your account</a>";
            }
        }
        fclose($fid);
    }
 
    /**
     * Функция проверки соединения к сервисам Google
     */
    public function is_connected() {
        return $this->is_connected;
    }
 
    /**
     * Функция создания объекта Google Client под пользователя
     */
    public function create_client() {
        $fid = fopen($_SERVER['DOCUMENT_ROOT'].'/debug.txt', 'a+');
        fwrite($fid, "----create_client is start----\n");
        $client = new Google_Client();
        $client->setApplicationName('Attachments getter');
        $client->setScopes(Google_Service_Gmail::GMAIL_READONLY);
        $client->setAuthConfig($this->credentials);
        //Если песочница то редирект на песочницу если продакшен то на продакшен
        if (ENVIRONMENT == 'development') {
            $client->setRedirectUri('https://cheltemov.k-crm.ru');  //редирект после авторизации(Должен совпадать с настройками учетных данных в google APIs)
        } else {
            $client->setRedirectUri('https://k-crm.ru');  //редирект после авторизации(Должен совпадать с настройками учетных данных в google APIs)
        }
        $client->setLoginHint('itsoperator2@gmail.com');
        $client->setPrompt('select_account consent');
        $client->setAccessType('offline');        // offline access
        $client->setIncludeGrantedScopes(true);   // incremental auth
        fwrite($fid, "create_client set is finsed\n");
        // Load previously authorized token from a file, if it exists.
        // The file token.json stores the user's access and refresh tokens, and is
        // created automatically when the authorization flow completes for the first
        // time.
        $tokenPath = APPPATH.'token.json';
        if (file_exists($tokenPath)) {
            fwrite($fid, "create_client: tokenPath exists\n");
            $accessToken = json_decode(file_get_contents($tokenPath), true);
            $client->setAccessToken($accessToken);
        }
 
        // If there is no previous token or it's expired.
        if ($client->isAccessTokenExpired()) {
            fwrite($fid, "create_client: AccessTokenExpired \n");
            // Refresh the token if possible, else fetch a new one.
            if ($client->getRefreshToken()) {
                fwrite($fid, "create_client: getRefreshToken\n");
                AccessTokenExpired
                $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
            } elseif(isset($_GET['code'])) {
                fwrite($fid, "create_client: isset _GET code\n");
                $authCode = $_GET['code'];
                // Exchange authorization code for an access token.
                $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
                $client->setAccessToken($accessToken);
 
                // Check to see if there was an error.
                if (array_key_exists('error', $accessToken)) {
                    throw new Exception(join(', ', $accessToken));
                }
            } else {
                fwrite($fid, "create_client: connected is FALSE \n");
                $this->is_connected = FALSE;
                $authUrl = $client->createAuthUrl();
                header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
                exit;
            }
            // Save the token to a file.
            if (!file_exists(dirname($tokenPath))) {
                fwrite($fid, "create_client: make token`s dir\n");
                connected = FALSE
                mkdir(dirname($tokenPath), 0700, true);
            }
            file_put_contents($tokenPath, json_encode($client->getAccessToken()));
            fclose($fid);
            return $client;
        } else {
            fwrite($fid, "create_client: connected is true\n");
            $this->is_connected = TRUE;
            fclose($fid);
            return $client;
        }
    }
 
    //Метод поиска писем по заданной фразе с приложениями
    public function get_mail($search) {
        $fid = fopen($_SERVER['DOCUMENT_ROOT'].'/debug.txt', 'a+');
        fwrite($fid, "----get_mail is start----\n");
        $service = new Google_Service_Gmail($this->client);
        fwrite($fid, "get_mail is created_result\n".print_r($service)."\n");
        $pageToken = NULL;
        $messages = array();
        $opt_param = array('q'=>"subject:{$search} has:attachment");
        $files = array();
        do {
            try {
                if ($pageToken) {
                    $opt_param['pageToken'] = $pageToken;
                }
                $messagesResponse = $service->users_messages->listUsersMessages($this->userId, $opt_param);
                if ($messagesResponse->getMessages()) {
                    $messages = array_merge($messages, $messagesResponse->getMessages());
                    $pageToken = $messagesResponse->getNextPageToken();
                }
            } catch (Exception $e) {
                print 'An error occurred: ' . $e->getMessage();
            }
        } while ($pageToken);
        fwrite($fid, "get_mail messages_result\n".print_r($messages)."\n");
        foreach ($messages as $message) {
            $messageId = $message->getId();
            $message = $service->users_messages->get($this->userId, $messageId);
            $messageDetails=$message->getPayload();
 
            foreach ($messageDetails['parts'] as $key => $value) {
                if (!isset($value['body']['data'])) {
                    if($value['mimeType']=='application/octet-stream' OR $value['mimeType']=='audio/mpeg') {
                        $exploded_array = explode('__', $value['filename']);
                        $result_name = $exploded_array[0] . $exploded_array[1] . '.mp3';
                        if (!file_exists($this->temp_folder . $result_name)) {
                            //Скачиваем аттачмент
                            $attachment = $service->users_messages_attachments->get($this->userId, $messageId, $value['body']['attachmentId']);
                            $data=strtr($attachment->data, array('-' => '+', '_' => '/'));
                            file_put_contents($this->temp_folder . $result_name, base64_decode($data));
                        }
                        //Формируем массив на выдачу данных
                        $files[]=['filename'=>$result_name, 'link'=> $this->temp_folder . $result_name];
 
                    }
                }
            }
        }
        fwrite($fid, "get_mail result\n".print_r($files)."\n");
        fclose($fid);
        return $files;
    }
}
Добавлено через 3 минуты
ide в которой я работаю показывает еще ошибки.
108 строка AccessTokenExpired
131 строка connected = FALSE
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
03.06.2020, 12:20
это не с форумом - я ошибся print_r без true использовал. попробуйте еще раз код из моего предыдущего поста запустить - я его исправил
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 58
03.06.2020, 12:30  [ТС]
Все равно ошибка
An uncaught Exception was encountered
Type: ParseError

Message: syntax error, unexpected '$client' (T_VARIABLE)

Filename: /var/www/cheltemov/data/www/k-crm.ru/application/libraries/Attach_lib.php

Line Number: 109

Backtrace:

File: /var/www/cheltemov/data/www/k-crm.ru/application/controllers/api/Orders.php
Line: 5101
Function: library

File: /var/www/cheltemov/data/www/k-crm.ru/index.php
Line: 323
Function: require_once
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
03.06.2020, 12:32
что-то туплю. удалите строку 108.
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 58
03.06.2020, 12:42  [ТС]
Ошибка(
An uncaught Exception was encountered
Type: ParseError

Message: syntax error, unexpected '='

Filename: /var/www/cheltemov/data/www/k-crm.ru/application/libraries/Attach_lib.php

Line Number: 131

Backtrace:

File: /var/www/cheltemov/data/www/k-crm.ru/application/controllers/api/Orders.php
Line: 5101
Function: library

File: /var/www/cheltemov/data/www/k-crm.ru/index.php
Line: 323
Function: require_once

Добавлено через 37 секунд
Может так connected == FALSE;

Добавлено через 2 минуты
Так поменял на Может так connected == FALSE;
и пошла авторизация. Но никакого файла не могу найти (

Добавлено через 3 минуты
А все слепой. Не прочитал куда сохраняете, простите.
вот что в нем:
----create_client is start----
create_client set is finsed
create_client: tokenPath exists
create_client: AccessTokenExpired
create_client: getRefreshToken
----attachment is start----
attachment is not connected
----create_client is start----
create_client set is finsed
create_client: tokenPath exists
create_client: AccessTokenExpired
create_client: getRefreshToken
----attachment is start----
attachment is not connected
----create_client is start----
create_client set is finsed
create_client: tokenPath exists
create_client: AccessTokenExpired
create_client: getRefreshToken
----create_client is start----
create_client set is finsed
create_client: tokenPath exists
create_client: AccessTokenExpired
create_client: getRefreshToken
----create_client is start----
create_client set is finsed
create_client: tokenPath exists
create_client: AccessTokenExpired
create_client: getRefreshToken
----attachment is start----
attachment is not connected
----create_client is start----
create_client set is finsed
create_client: tokenPath exists
create_client: AccessTokenExpired
create_client: getRefreshToken
----create_client is start----
create_client set is finsed
create_client: tokenPath exists
create_client: AccessTokenExpired
create_client: getRefreshToken
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
03.06.2020, 12:55
вот код перепроверил - попробуйте еще раз, что-то не пойму, откуда такие ошибки появляются.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
 
/**
 * Class Attach_lib класс библиотеки скачивания приложений письма из gmail.com с помощью gmail-api
 */
 
class Attach_lib
{
    /**
     * Экземпляр приложения
     *
     * @var
     */
    protected $CI;
    private $client;        //Объект Google Client
    private $credentials;   //Данные пользователя
    private $userId;        //ID пользователя (зачение 'me' значит, что используется пользователь с данными в credentials)
    private $temp_folder;   //Папка для хранения attachments
    private $is_connected;  //Переключатель соединения (true - соединен с gmail, false - нет)
 
    /**
     * Auth_lib constructor.
     */
    public function __construct()
    {
        $this->CI =& get_instance();
        $this->credentials=APPPATH.'credentials.json';  //Путь к файлу credentials, получаемого с сервиса Google API
        $this->client = $this->create_client();
        $this->userId='me';
        $this->temp_folder=FCPATH.'files/audio/';       //Путь ко временной папке хранения приложений
    }
 
    /**
     * Функция получения списка приложений к письмам по поиску
     * @param string $search    слово для фильтрации в subject
     * @return string           Строка об ошибке
     * @return array            Массив [partId, filename, attachmentId]
     */
    public function get_attachments($search) {
        $fid = fopen($_SERVER['DOCUMENT_ROOT'].'/debug.txt', 'a+');
        fwrite($fid, "----attachment is start----\n");
        if (!preg_match('/[0-9+]{3,18}/', $search)) {
            return 'Поиск только по номеру телефона в формате +71234567890';
            die();
        }
        if($this->is_connected()) { //Если соединение с сервисами есть, тогда выполняем запрос
            fwrite($fid, "attachment is connected\n");
            $files_list=$this->get_mail($search);
            fwrite($fid, "attachment get_mail is finised:\n".print_r($files_list, true)."\n");
            return $files_list;
        } else {   //Если нет соединения, нужно запросить данные пользователя
            fwrite($fid, "attachment is not connected\n");
            if(!isset($_GET['code'])) {
                $authUrl = $this->client->createAuthUrl();
                return "<a href='$authUrl'>Click here to link your account</a>";
            }
        }
    }
 
    /**
     * Функция проверки соединения к сервисам Google
     */
    public function is_connected() {
        return $this->is_connected;
    }
 
    /**
     * Функция создания объекта Google Client под пользователя
     */
    public function create_client() {
 $fid = fopen($_SERVER['DOCUMENT_ROOT'].'/debug.txt', 'a+');
         fwrite($fid, "----create_client is start----\n");
        $client = new Google_Client();
        $client->setApplicationName('Attachments getter');
        $client->setScopes(Google_Service_Gmail::GMAIL_READONLY);
        $client->setAuthConfig($this->credentials);
        //Если песочница то редирект на песочницу если продакшен то на продакшен
        if (ENVIRONMENT == 'development') {
            $client->setRedirectUri('https://cheltemov.k-crm.ru');  //редирект после авторизации(Должен совпадать с настройками учетных данных в google APIs)
        } else {
            $client->setRedirectUri('https://k-crm.ru');  //редирект после авторизации(Должен совпадать с настройками учетных данных в google APIs)
        }
        $client->setLoginHint('itsoperator2@gmail.com');
        $client->setPrompt('select_account consent');
        $client->setAccessType('offline');        // offline access
        $client->setIncludeGrantedScopes(true);   // incremental auth
 fwrite($fid, "create_client set is finsed\n");
        // Load previously authorized token from a file, if it exists.
        // The file token.json stores the user's access and refresh tokens, and is
        // created automatically when the authorization flow completes for the first
        // time.
        $tokenPath = APPPATH.'token.json';
        if (file_exists($tokenPath)) {
            fwrite($fid, "create_client: tokenPath exists\n");
            $accessToken = json_decode(file_get_contents($tokenPath), true);
            $client->setAccessToken($accessToken);
        }
 
        // If there is no previous token or it's expired.
        if ($client->isAccessTokenExpired()) {
            fwrite($fid, "create_client: AccessTokenExpired \n");
            // Refresh the token if possible, else fetch a new one.
            if ($client->getRefreshToken()) {
                fwrite($fid, "create_client: getRefreshToken\n");
                $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
            } elseif(isset($_GET['code'])) {
                fwrite($fid, "create_client: isset _GET code\n");
                $authCode = $_GET['code'];
                // Exchange authorization code for an access token.
                $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
                $client->setAccessToken($accessToken);
 
                // Check to see if there was an error.
                if (array_key_exists('error', $accessToken)) {
                    throw new Exception(join(', ', $accessToken));
                }
            } else {
                fwrite($fid, "create_client: connected is FALSE \n");
                $this->is_connected = FALSE;
                $authUrl = $client->createAuthUrl();
                header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
                exit;
            }
            // Save the token to a file.
            if (!file_exists(dirname($tokenPath))) {
                fwrite($fid, "create_client: make token`s dir\n");
                mkdir(dirname($tokenPath), 0700, true);
            }
            file_put_contents($tokenPath, json_encode($client->getAccessToken()));
            fclose($fid);
            return $client;
        } else {
            $this->is_connected = TRUE;
            fwrite($fid, "create_client: connected is true\n");
            fclose($fid);
            return $client;
        }
    }
 
    //Метод поиска писем по заданной фразе с приложениями
    public function get_mail($search) {
        $fid = fopen($_SERVER['DOCUMENT_ROOT'].'/debug.txt', 'a+');
         fwrite($fid, "----get_mail is start----\n");
        $service = new Google_Service_Gmail($this->client);
        fwrite($fid, "get_mail is created_result\n".print_r($service, true)."\n");
        $pageToken = NULL;
        $messages = array();
        $opt_param = array('q'=>"subject:{$search} has:attachment");
        $files = array();
        do {
            try {
                if ($pageToken) {
                    $opt_param['pageToken'] = $pageToken;
                }
                $messagesResponse = $service->users_messages->listUsersMessages($this->userId, $opt_param);
                if ($messagesResponse->getMessages()) {
                    $messages = array_merge($messages, $messagesResponse->getMessages());
                    $pageToken = $messagesResponse->getNextPageToken();
                }
            } catch (Exception $e) {
                print 'An error occurred: ' . $e->getMessage();
            }
        } while ($pageToken);
 fwrite($fid, "get_mail messages_result\n".print_r($messages, true)."\n");
        foreach ($messages as $message) {
            $messageId = $message->getId();
            $message = $service->users_messages->get($this->userId, $messageId);
            $messageDetails=$message->getPayload();
 
            foreach ($messageDetails['parts'] as $key => $value) {
                if (!isset($value['body']['data'])) {
                    if($value['mimeType']=='application/octet-stream' OR $value['mimeType']=='audio/mpeg') {
                        $exploded_array = explode('__', $value['filename']);
                        $result_name = $exploded_array[0] . $exploded_array[1] . '.mp3';
                        if (!file_exists($this->temp_folder . $result_name)) {
                            //Скачиваем аттачмент
                            $attachment = $service->users_messages_attachments->get($this->userId, $messageId, $value['body']['attachmentId']);
                            $data=strtr($attachment->data, array('-' => '+', '_' => '/'));
                            file_put_contents($this->temp_folder . $result_name, base64_decode($data));
                        }
                        //Формируем массив на выдачу данных
                        $files[]=['filename'=>$result_name, 'link'=> $this->temp_folder . $result_name];
 
                    }
                }
            }
        }
        fwrite($fid, "get_mail result\n".print_r($files, true)."\n");
        fclose($fid);
        return $files;
    }
}
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 58
03.06.2020, 13:07  [ТС]
Использовал ваш последний код, вот что выдало в файле:
----create_client is start----
create_client set is finsed
create_client: tokenPath exists
create_client: AccessTokenExpired
create_client: getRefreshToken
----attachment is start----
attachment is not connected
----create_client is start----
create_client set is finsed
create_client: tokenPath exists
create_client: AccessTokenExpired
create_client: getRefreshToken
----create_client is start----
create_client set is finsed
create_client: tokenPath exists
create_client: AccessTokenExpired
create_client: getRefreshToken

Добавлено через 6 минут
Можете объяснить что происходит в файле debug
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
03.06.2020, 13:12
до get_mail дело не доходит. все время попадает в getRefreshToken стр. 104. оттуда переходит на строку 125. в итоге возвращает $client. Может, дело в том, что не устанавливает $this->is_connected = TRUE; перед return $client в строке 131?
Сообщения об ошибках есть какие-нибудь?
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 58
03.06.2020, 13:15  [ТС]
В этом то и проблема, что ошибок нету. Просто постоянно приходиться авторизацию проводить, после чего меня перекидывает на главную страницу, а не на той которой я был
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
03.06.2020, 13:18
Цитата Сообщение от MoralThug Посмотреть сообщение
происходит в файле debug
в файл debug.txt происходит запись текущих действий в методах класса Attach_lib
----create_client is start---- - начало выполнения метода create_client
далее - в какие ветви условий попадает выполнение кода в результате работы программы.
этот файл ничего не делает, только регистрирует выполняемые действия программы

Добавлено через 2 минуты
Цитата Сообщение от MoralThug Посмотреть сообщение
приходиться авторизацию проводить
попробуйте добавить
PHP
1
$this->is_connected = TRUE;
перед 132 строчкой
PHP
1
2
3
$this->is_connected = TRUE;
return $client;
} else {
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 58
03.06.2020, 13:23  [ТС]
Так?
PHP
1
2
3
4
5
6
7
8
9
10
11
  file_put_contents($tokenPath, json_encode($client->getAccessToken()));
            fclose($fid);
            $this->is_connected = TRUE;
            return $client;
        } else {
            $this->is_connected = TRUE;
            fwrite($fid, "create_client: connected is true\n");
            fclose($fid);
            return $client;
        }
    }
Добавлено через 3 минуты
Если так то ошибка
An error occurred: { "error": "invalid_grant", "error_description": "Bad Request" }{"success":false,"audio":[]}
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
03.06.2020, 13:24
а что в debug.txt?
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 58
03.06.2020, 13:28  [ТС]
Загрузил на гугл диск https://drive.google.com/file/... sp=sharing
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
03.06.2020, 15:10
так, заработало get_mail. сейчас поищем, что в нем не срабатывает. немного подождите

Добавлено через 1 час 27 минут
не работает $service->users_messages->listUsersMessages($this->userId, $opt_param); в 156 стр.
1. удалите debug.txt
2. перепишите public function get_mail($search)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public function get_mail($search) {
        $fid = fopen($_SERVER['DOCUMENT_ROOT'].'/debug.txt', 'a+');
         fwrite($fid, "----get_mail is start----\n");
        $service = new Google_Service_Gmail($this->client);
        fwrite($fid, "get_mail is created_result\n");
        $pageToken = NULL;
        $messages = array();
        $opt_param = array('q'=>"subject:{$search} has:attachment");
        $files = array();
        do {
            try {
                if ($pageToken) {
                    $opt_param['pageToken'] = $pageToken;
                }
                $messagesResponse = $service->users_messages->listUsersMessages($this->userId, $opt_param);
                fwrite($fid, 'user_id='.$this->userId."\n");
                fwrite($fid, 'messageResponse:'.print_r($messagesResponse, true));
                if ($messagesResponse->getMessages()) {
                    $messages = array_merge($messages, $messagesResponse->getMessages());
                    $pageToken = $messagesResponse->getNextPageToken();
                }
            } catch (Exception $e) {
                print 'An error occurred: ' . $e->getMessage();
            }
        } while ($pageToken);
 fwrite($fid, "get_mail messages_result: found ".count($messages)." items\n");
        foreach ($messages as $message) {
            $messageId = $message->getId();
            $message = $service->users_messages->get($this->userId, $messageId);
            $messageDetails=$message->getPayload();
 
            foreach ($messageDetails['parts'] as $key => $value) {
                if (!isset($value['body']['data'])) {
                    if($value['mimeType']=='application/octet-stream' OR $value['mimeType']=='audio/mpeg') {
                        $exploded_array = explode('__', $value['filename']);
                        $result_name = $exploded_array[0] . $exploded_array[1] . '.mp3';
                        if (!file_exists($this->temp_folder . $result_name)) {
                            //Скачиваем аттачмент
                            $attachment = $service->users_messages_attachments->get($this->userId, $messageId, $value['body']['attachmentId']);
                            $data=strtr($attachment->data, array('-' => '+', '_' => '/'));
                            file_put_contents($this->temp_folder . $result_name, base64_decode($data));
                        }
                        //Формируем массив на выдачу данных
                        $files[]=['filename'=>$result_name, 'link'=> $this->temp_folder . $result_name];
 
                    }
                }
            }
        }
        fwrite($fid, "get_mail result\n".print_r($files, true)."\n");
        fclose($fid);
        return $files;
    }
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 58
03.06.2020, 15:17  [ТС]
Так сделал. Скопировал ваш код. Но все равно ошибка. В debug пишет
----create_client is start----
create_client set is finsed
create_client: tokenPath exists
create_client: AccessTokenExpired
create_client: getRefreshToken
----attachment is start----
attachment is connected
----get_mail is start----
get_mail is created_result
get_mail messages_result: found 0 items
get_mail result
Array
(
)

attachment get_mail is finised:
Array
(
)

А на странице: An error occurred: { "error": "invalid_grant", "error_description": "Bad Request" }{"success":false,"audio":[]}
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
03.06.2020, 15:54
это значит, что в строке $messagesResponse = $service->users_messages->listUsersMessages($this->userId, $opt_param); в get_mail возникает исключение типа invalid_grant с текстом Bad Request.
других ошибок в коде не видно
проверьте свой аккаунт в google и настройки подключений
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 58
03.06.2020, 17:11  [ТС]
Я так понимаю мне нужно проверить credentials.json? Все ли ключи соответствуют и все ?

Добавлено через 1 час 12 минут
Так в итоге это проблема с доступами в google api ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.06.2020, 17:11

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

Проблема соединения между серверами
2 сервера соеденены по оптике Почти каждая БД храниться на каждом из сервером. Реплицируются ночью. Но Есть одна БД общая, кот...

Проблема с поддержанием соединения с сервером
Здравствуйте, Уважаемые участники форума. Пишу клиент-серверное приложение. Возникает проблема при поддержке соединения между клиентом и...

Проблема соединения DBI c DB2
установил db2 ентерпрайс и перл 5,8,7 скачал dbd::db2 с ibm сервера но немогу соединится или кроме сервера надо еще чтото устанавливать

Проблема соединения строк и цикл
Делаю так: for %%A in (*.VOB) do (set g=%%~nxA|%g%) echo %g% Ожидаю что в переменную g запишет список фаилов, а выдает только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru