source: spip-zone/_plugins_/facebook/trunk/inc/facebook.php @ 100280

Last change on this file since 100280 was 100280, checked in by p@…, 4 years ago

Ce filtre à plus sa place dans le fichier de fonctions du plugins

File size: 8.0 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6
7include_spip('lib/facebook-php-sdk/src/Facebook/autoload');
8include_spip('inc/facebook_poster');
9
10// Le SDK de facebook à besoin d'une session php mais n'est pas foutu de faire lui même ce test.
11if (!session_id()) {
12        session_start();
13}
14
15/**
16 * Initialiser Facebook avec la configuration stockée dans SPIP
17 *
18 * @access public
19 * @return object L'objet Facebook crée
20 */
21function facebook() {
22
23        include_spip('inc/config');
24        $config = lire_config('facebook');
25
26        $fb = new Facebook\Facebook([
27                'app_id' => $config['cle'],
28                'app_secret' => $config['secret'],
29                'default_graph_version' => 'v2.2'
30        ]);
31
32        return $fb;
33}
34
35/**
36 * Obtenir un lien de connection Facebook
37 *
38 * @access public
39 * @param string $action Action sur lequel sera envoyer le tocken
40 * @return string Lien vers Facebook
41 */
42function facebook_lien_connection($action) {
43
44        include_spip('inc/config');
45        $config = lire_config('facebook');
46
47        // Si facebook n'est pas configurer, on n'affiche pas de lien
48        if (empty($config['cle']) or empty($config['secret'])) {
49                return false;
50        }
51
52        // Raccourcis pour les auteurs
53        if ($action == 'auteur') {
54                $action = 'facebook_access_token_auteur';
55        }
56
57        $fb = facebook();
58
59        $helper = $fb->getRedirectLoginHelper();
60
61        $permission = explode(',', _FACEBOOK_PERMISSION);
62
63        $loginUrl = $helper->getLoginUrl($action, $permission);
64
65        return htmlspecialchars($loginUrl);
66}
67
68/**
69 * On récupère le token d'accès
70 *
71 * @access public
72 * @return string Un message d'erreur au besoin
73 */
74function facebook_access_token() {
75
76        // S'il n'y a pas de code, pas besoin de chercher un token
77        if (!_request('code')) {
78                return false;
79        }
80
81        $fb = facebook();
82
83        include_spip('inc/config');
84        $config = lire_config('facebook');
85
86        $helper = $fb->getRedirectLoginHelper();
87
88        try {
89                $accessToken = $helper->getAccessToken();
90        } catch (Facebook\Exceptions\FacebookResponseException $e) {
91                // When Graph returns an error
92                return 'Graph returned an error: ' . $e->getMessage();
93        } catch (Facebook\Exceptions\FacebookSDKException $e) {
94                // When validation fails or other local issues
95                return 'Facebook SDK returned an error: ' . $e->getMessage();
96        }
97
98        if (! isset($accessToken)) {
99                if ($helper->getError()) {
100                        header('HTTP/1.0 401 Unauthorized');
101                        echo 'Error: '.$helper->getError()."\n";
102                        echo 'Error Code: '.$helper->getErrorCode()."\n";
103                        echo 'Error Reason: '.$helper->getErrorReason()."\n";
104                        echo 'Error Description: '.$helper->getErrorDescription()."\n";
105                } else {
106                        header('HTTP/1.0 400 Bad Request');
107                        echo 'Bad request';
108                }
109                exit;
110        }
111
112        // The OAuth 2.0 client handler helps us manage access tokens
113        $oAuth2Client = $fb->getOAuth2Client();
114
115        // Get the access token metadata from /debug_token
116        $tokenMetadata = $oAuth2Client->debugToken($accessToken);
117
118        // Validation (these will throw FacebookSDKException's when they fail)
119        $tokenMetadata->validateAppId($config['cle']);
120        // If you know the user ID this access token belongs to, you can validate it here
121        //$tokenMetadata->validateUserId('123');
122        $tokenMetadata->validateExpiration();
123
124        if (! $accessToken->isLongLived()) {
125                // Exchanges a short-lived access token for a long-lived one
126                try {
127                        $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
128                } catch (Facebook\Exceptions\FacebookSDKException $e) {
129                        return '<p>Error getting long-lived access token: '.$helper->getMessage()."</p>\n\n";
130                }
131        }
132
133        return $accessToken;
134}
135
136/**
137 * Lister les page accessible par l'utilisateur
138 *
139 * @access public
140 * @return mixed
141 */
142function facebook_liste_pages() {
143
144        $fb = facebook();
145
146        include_spip('inc/token');
147        $token = connecteur_get_token(0, 'facebook');
148
149        try {
150                // Returns a `Facebook\FacebookResponse` object
151                $response = $fb->get('/me/accounts', $token);
152        } catch (Facebook\Exceptions\FacebookResponseException $e) {
153                return 'Graph returned an error: ' . $e->getMessage();
154                exit;
155        } catch (Facebook\Exceptions\FacebookSDKException $e) {
156                return 'Facebook SDK returned an error: ' . $e->getMessage();
157                exit;
158        }
159
160        // On récupère les éléments pages
161        $graphEdges = $response->getGraphEdge();
162
163        return $graphEdges;
164}
165
166
167/**
168 * Récupérer le token d'une page
169 *
170 * @param int $id_page
171 * @access public
172 * @return mixed
173 */
174function facebook_page_token($id_page) {
175
176        $graphEdges = facebook_liste_pages();
177        foreach ($graphEdges as $graphEdge) {
178                if ($graphEdge['id'] == $id_page) {
179                        return $graphEdge['access_token'];
180                }
181        }
182
183        return _T('facebook:erreur_page_access_token');
184}
185
186/**
187 * Créer une datas saisies à partir des pages de la personne
188 *
189 * @access public
190 * @return array Datas pour saisies
191 */
192function facebook_saisie_pages() {
193
194        $graphEdges = facebook_liste_pages();
195        if (!is_string($graphEdges)) {
196                // Replir un tableau utilisable avec saisies
197                $datas = array();
198                // par defaut, on place id du "me"
199                $T_user = facebook_profil();
200                $datas[$T_user['id']] = $T_user['nom'];
201                foreach ($graphEdges as $graphEdge) {
202                        $datas[$graphEdge['id']] = 'Page : '.$graphEdge['name'];
203                }
204        } else {
205                // C'est une erreur, on la renvoie
206                return $graphEdges;
207        }
208
209        return $datas;
210}
211
212/**
213 * Récupérer le profil facebook de la personne
214 * Si aucun token n'est passé, ce sera la configuration du site qui sera utilisée
215 *
216 * @param mixed $token
217 * @access public
218 * @return array
219 */
220function facebook_profil($token = null) {
221
222        $fb = facebook();
223
224        if (empty($token)) {
225                include_spip('inc/token');
226                $token = connecteur_get_token(0, 'facebook');
227        }
228
229        try {
230                // Returns a `Facebook\FacebookResponse` object
231                $response = $fb->get('/me?fields='._FACEBOOK_CHAMP_PROFIL, $token);
232        } catch (Facebook\Exceptions\FacebookResponseException $e) {
233                return 'Graph returned an error: ' . $e->getMessage();
234                exit;
235        } catch (Facebook\Exceptions\FacebookSDKException $e) {
236                return 'Facebook SDK returned an error: ' . $e->getMessage();
237                exit;
238        }
239
240        $user = $response->getGraphUser();
241        spip_log($user, 'facebook', _LOG_DEBUG);
242
243        return array(
244                'nom' => $user['name'],
245                'id' => $user['id'],
246                'email' => $user['email'],
247                'facebook' => $user
248        );
249}
250
251/**
252 * Récupérer l'image de profil
253 * Attention ! Il faut ajouter la permission Facebook `user_about_me`
254 *
255 * @param mixed $token
256 * @param int $width
257 * @param int $height
258 * @access public
259 * @return mixed
260 */
261function facebook_profil_picture($token = null, $width = 0, $height = 0) {
262
263        $fb = facebook();
264
265        if (empty($token)) {
266                include_spip('inc/token');
267                $token = connecteur_get_token(0, 'facebook');
268        }
269
270        try {
271                $size = '';
272                if ($width > 0) {
273                        $size .= '&width='.$width;
274                }
275                if ($height > 0) {
276                        $size .= '&height='.$height;
277                }
278
279                // Returns a `Facebook\FacebookResponse` object
280                $response = $fb->get('/me/picture?redirect=false'.$size, $token);
281        } catch (Facebook\Exceptions\FacebookResponseException $e) {
282                return 'Graph returned an error: ' . $e->getMessage();
283                exit;
284        } catch (Facebook\Exceptions\FacebookSDKException $e) {
285                return 'Facebook SDK returned an error: ' . $e->getMessage();
286                exit;
287        }
288
289        $picture = $response->getGraphUser();
290
291        return $picture;
292}
293
294
295/**
296 * Recuperation de la liste des posts
297 * Si aucun token n'est passé, ce sera la configuration du site qui sera utilisée
298 *
299 * @param mixed $token
300 * @access public
301 * @return array
302 **/
303function facebook_recup_posts($token = null) {
304
305        $fb = facebook();
306        if (empty($token)) {
307                include_spip('inc/token');
308                $token = connecteur_get_token(0, 'facebook');
309        }
310        $id_page = lire_config('facebook_compte_post');
311        try {
312                $response = $fb->get('/'.$id_page.'/posts?fields=message,picture,created_time', $token);
313        } catch (Facebook\Exceptions\FacebookResponseException $e) {
314                return 'Graph returned an error: ' . $e->getMessage();
315                exit;
316        } catch (Facebook\Exceptions\FacebookSDKException $e) {
317                return 'Facebook SDK returned an error: ' . $e->getMessage();
318                exit;
319        }
320
321        $graphObject = $response->getGraphEdge()->asArray();
322        $T_result = array();
323        foreach ($graphObject as $message) {
324                foreach ($message['created_time'] as $k => $val) {
325                        if ($k == 'date') {
326                                $date_creation = $val;
327                        }
328                }
329                $T_result[] = array(
330                        'message' => $message['message'],
331                        'url_picture' => $message['picture'],
332                        'date_creation' => $date_creation
333                );
334        }
335
336        return $T_result;
337}
Note: See TracBrowser for help on using the repository browser.