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

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

Le plugin utilise désormais l'API interne recuperer_page plutot que cURL, ce qui permet de passer par le proxy configuré dans SPIP

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