source: spip-zone/_plugins_/twitter/trunk/inc/twitter.php @ 107413

Last change on this file since 107413 was 107413, checked in by cedric@…, 3 years ago

structure html des formulaires (class manquantes), respecter les sauts de lignes des tweets maintenant qu'on a la place

File size: 7.7 KB
Line 
1<?php
2/*
3 * Plugin spip|twitter
4 * (c) 2009-2013
5 *
6 * envoyer et lire des messages de Twitter
7 * distribue sous licence GNU/LGPL
8 *
9 */
10
11if (!defined("_ECRIRE_INC_VERSION")) return;
12
13if (!defined("_TWITTER_API_CALL_MICROCACHE_DELAY")) define("_TWITTER_API_CALL_MICROCACHE_DELAY",180);
14
15/**
16 * Envoyer un message sur Twitter
17 * @param $status
18 * @param null $tokens
19 *   permet d'utiliser des tokens specifiques et pas ceux pre-configures
20 *   (voir twitter_connect)
21 * @return bool|string
22 */
23function tweet($status, $tokens = null){
24        // Certains define prennent le pas sur le reste (mode TEST)
25        if (defined('_TEST_MICROBLOG_SERVICE')) {
26                if (_TEST_MICROBLOG_SERVICE == '') {
27                        spip_log('microblog desactive par _TEST_MICROBLOG_SERVICE',"twitter"._LOG_INFO_IMPORTANTE);
28                        return false;
29                }
30        }
31
32        /**
33         * Si l'API utilisée est twitter, on force le passage en oAuth
34         */
35        $oAuthConnection = twitter_connect($tokens);
36
37        // si pas d'api utilisable on sort
38        if (!$oAuthConnection)
39                return false;
40       
41        // Preparer le message (utf8 < 280 caracteres)
42        //$status = trim(preg_replace(',\s+,', ' ', $status));
43        $status = trim($status);
44        include_spip('inc/charsets');
45        $status = unicode2charset(charset2unicode($status), 'utf-8');
46        $status = substr($status, 0, 280);
47
48        if (!strlen($status)) {
49                spip_log('Rien a bloguer','twitter');
50                return false;
51        }
52
53        $datas = array('status' => $status);
54
55        // anti-begaiment
56        $begaie = md5(serialize(array($tokens,$status)));
57        if ($begaie == $GLOBALS['meta']['twitter_begaie']) {
58                spip_log("begaie $status", 'twitter'._LOG_INFO_IMPORTANTE);
59                return false;
60        }
61
62        // ping et renvoyer la reponse xml
63        $ret = 'ok';
64        $api = 'statuses/update';
65        $oAuthConnection->post($api,$datas);
66        if (200 != $oAuthConnection->http_code){
67                spip_log('Erreur '.$oAuthConnection->http_code,'twitter');
68                $ret = false;
69        }
70
71        // noter l'envoi pour ne pas twitter 2 fois de suite la meme chose
72        if ($ret)
73                ecrire_meta('twitter_begaie', $begaie);
74
75        return $ret;
76}
77
78/**
79 * @param null|array $tokens
80 *   twitter_consumer_key : key de l'application a utiliser
81 *   twitter_consumer_secret : secret de l'application a utiliser
82 *
83 *   twitter_account : pour utiliser un compte twitter pre-configure plutot que celui par defaut
84 * ou
85 *   twitter_token : token du compte a utiliser
86 *   twitter_token_secret : token secret du compte a utiliser
87 *
88 *
89 * @return bool|TwitterOAuthSPIP
90 */
91function twitter_connect($tokens=null){
92        static $connection = null;
93
94        $t = md5(serialize($tokens));
95        if (!isset($connection[$t])){
96
97                if($tokens = twitter_tokens($tokens)){
98                        // Cas de twitter et oAuth
99                        $t2 = md5(serialize($tokens));
100                        include_spip('inc/twitteroauthspip');
101                        $connection[$t] = $connection[$t2] = new TwitterOAuthSPIP(
102                                $tokens['twitter_consumer_key'],
103                                $tokens['twitter_consumer_secret'],
104                                $tokens['twitter_token'],
105                                $tokens['twitter_token_secret']);
106
107                        if(!$connection[$t2]) {
108                                spip_log('Erreur de connexion à twitter, verifier la configuration','twitter'._LOG_ERREUR);
109                                return false;
110                        }
111                }
112                else{
113                        spip_log('Erreur de connexion à twitter, verifier la configuration','twitter'._LOG_ERREUR);
114                        return false;
115                }
116        }
117        return $connection[$t];
118}
119
120/**
121 * Determiner les tokens de connexion en fonction de ceux passes
122 * et de la configuration par defaut
123 *
124 * @param array $tokens
125 * @return array
126 */
127function twitter_tokens($tokens=null){
128        $cfg = @unserialize($GLOBALS['meta']['microblog']);
129        if (!$cfg AND !$tokens) return false;
130        if (!$cfg) $cfg = array();
131
132        if(!is_array($tokens))
133                $tokens = array();
134
135        $t = array_intersect_key($tokens,
136                array(
137                        'twitter_consumer_key'=>'',
138                        'twitter_consumer_secret'=>'',
139                        'twitter_account'=>'',
140                        'twitter_token'=>'',
141                        'twitter_token_secret'=>'',
142                ));
143
144        if (!isset($t['twitter_consumer_key']) OR !isset($t['twitter_consumer_secret'])){
145                $t['twitter_consumer_key'] = $cfg['twitter_consumer_key'];
146                $t['twitter_consumer_secret'] = $cfg['twitter_consumer_secret'];
147        }
148
149        if (!isset($t['twitter_token']) OR !isset($t['twitter_token_secret'])){
150                $account = $cfg['default_account'];
151                if (isset($t['twitter_account']) AND isset($cfg['twitter_accounts'][$t['twitter_account']]))
152                        $account = $t['twitter_account'];
153
154                if (!isset($cfg['twitter_accounts'][$account]) AND isset($cfg['twitter_accounts'])){
155                        $accounts = array_keys($cfg['twitter_accounts']);
156                        $account = reset($accounts);
157                }
158
159                if (isset($cfg['twitter_accounts'][$account])){
160                        $t['twitter_token'] = $cfg['twitter_accounts'][$account]['token'];
161                        $t['twitter_token_secret'] = $cfg['twitter_accounts'][$account]['token_secret'];
162                }
163        }
164        if(
165                isset($t['twitter_consumer_key'])
166                  AND isset($t['twitter_consumer_secret'])
167                  AND isset($t['twitter_token'])
168                  AND isset($t['twitter_token_secret'])){
169                return $t;
170        }
171
172        return false;
173}
174
175/**
176 * Fonction d'utilisation simple de l'API twitter oAuth
177 *
178 * @param $command string : la commande à passer
179 * @param $type string : le type de commande (get/post/delete)
180 * @param $params array : les paramètres dans un array de la commande
181 * @param array $options
182 *   bool force : true pour forcer la requete hors cache
183 *   string return_type : le retour souhaité par défaut cela renverra la chaine ou l'array retourné par la commande.
184 *                        Sinon on peut utiliser les valeurs http_code,http_info,url
185 *
186 *   twitter_consumer_key : key de l'application a utiliser
187 *   twitter_consumer_secret : secret de l'application a utiliser
188 *
189 *   twitter_account : pour utiliser un compte twitter pre-configure plutot que celui par defaut
190 * ou
191 *   twitter_token : token du compte a utiliser
192 *   twitter_token_secret : token secret du compte a utiliser
193 * @return bool|string|array
194 */
195function twitter_api_call($command,$type='get',$params=array(),$options=null){
196        include_spip('inc/microblog');
197
198        // api_call en cache ?
199        $cache_key = null;
200        if ($type !== 'get'
201                OR (isset($options['force']) AND $options['force'])
202                OR !include_spip("inc/memoization")
203          OR !function_exists("cache_get")
204          OR !$t = twitter_tokens($options)
205          OR !$cache_key = "twitter_api_call-".md5(serialize(array($command,$params,$t)))
206          OR !$res = cache_get($cache_key)
207          OR $res['time']+_TWITTER_API_CALL_MICROCACHE_DELAY<$_SERVER['REQUEST_TIME']){
208
209                if ($connection = twitter_connect($options)){
210
211                        $res = array();
212                        switch($type){
213                                case 'post':
214                                        $res['content'] = $connection->post($command,$params);
215                                        break;
216                                case 'delete':
217                                        $res['content'] = $connection->delete($command,$params);
218                                        break;
219                                case 'get':
220                                default:
221                                        $res['content'] = $connection->get($command,$params);
222                                        break;
223                        }
224                        $res['http_code'] = $connection->http_code;
225                        $res['http_info'] = $connection->http_info;
226                        $res['url'] = $connection->url;
227                        $res['time'] = $_SERVER['REQUEST_TIME'];
228
229                        if ($cache_key)
230                                cache_set($cache_key,$res,_TWITTER_API_CALL_MICROCACHE_DELAY*2);
231                }
232                else {
233                        if (!$res)
234                                return false;
235                        spip_log("twitter_api_call:$command echec connexion, on utilise le cache perime","twitter".LOG_INFO_IMPORTANTE);
236                }
237        }
238
239        $retour = isset($options['return_type'])?$options['return_type']:'content';
240        if (!isset($res[$retour]))
241                $retour = 'content';
242
243        switch($retour){
244                default:
245                        return $res[$retour];
246                case 'content':
247                        if (!is_string($res['content']) AND is_array($res['content'])) {
248                                // recopie ?
249                                $copy = array();
250                                foreach($res['content'] as $key => $val){
251                                        $copy[$key] = $val;
252                                }
253                                return $copy;
254                        }
255                        return $res['content'];
256                        break;
257        }
258}
259
260/**
261 * Verifier que la config twitter est OK
262 * @param bool $complete
263 *   verification complete de la connexion, avec requete chez Twitter (plus lent)
264 * @return bool
265 */
266function twitter_verifier_config($complete = false){
267        if (!$tokens = twitter_tokens())
268                return false;
269        if ($complete){
270                if (!twitter_connect())
271                        return false;
272                if (!$infos = twitter_api_call("account/verify_credentials"))
273                        return false;
274        }
275
276        return true;
277}
Note: See TracBrowser for help on using the repository browser.