Exemplo de PHP mais simples para obter a linha temporal do utilizador com a versão 1.1 da API do Twitter
// Create curl resource
$ch = curl_init();
// Set url
curl_setopt($ch, CURLOPT_URL, "http://twitter.com/statuses/user_timeline/myscreenname.json?count=10");
// Return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
// Close curl resource to free up system resources
curl_close($ch);
if ($output)
{
$tweets = json_decode($output,true);
foreach ($tweets as $tweet)
{
print_r($tweet);
}
}
Como posso obter a linha de utilizador (Estados recentes) com o menor Código possível?
encontrei isto: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline mas eu tenho o seguinte erro:
"{"errors":[{"message":"Could not authenticate you","code":32}]}"
Há muitas aulas por aí, mas depois de tentar várias, nenhuma delas parece funcionar devido a estas actualizações no ... Twitter, além disso, alguns deles são classes bastante avançadas com um monte de funcionalidade que eu realmente não preciso.
Qual é o caminho mais simples/mais curto para obter os estados de usuário recentes com PHP?
14 answers
Nota importante: a partir de meados de 2018, o processo para obter tokens API do twitter tornou-se muito mais burocrático. Levou-me a uma semana de trabalho para receber um conjunto de fichas de API, e isto é para um projeto de código aberto para vocês e meninas com mais de 1,2 milhões de instalações em Packagist e 1,6 k estrelas em Github, o que teoricamente deveria ser uma prioridade maior.
Se você está encarregado de trabalhar com a API do twitter para o seu trabalho, deve ter em conta este tempo de espera potencialmente extremamente longo. Facebook ou Instagram e fornecer essas opções, já que o processo para recuperar seus tokens é instantâneo.
Então, queres usar a API v1.1 do Twitter?
Nota: os arquivos para estes estão no GitHub.
Versão 1.0 em breve será desacreditado. e pedidos não autorizados não serão permitidos. Então, aqui está um post para ajudá-lo a fazer isso, juntamente com uma aula de PHP para tornar a sua vida mais fácil.
Tem de visitar o site oficial de desenvolvimento do Twitter e registar-se numa conta de desenvolvimento. Este é um Livre e passo necessário para fazer pedidos para a API v1.1.1. Crie uma conta de desenvolvimento: crie uma conta de desenvolvimento no Twitter
O quê? Pensaste que podias fazer pedidos não autenticados? Não com a API v1.1 do Twitter. Você precisa visitar http://dev.twitter.com/apps e carregue no botão "Criar Aplicação". Nesta página, preencha os detalhes que quiser. Para mim, não importava, porque eu só queria fazer um monte de pedidos de bloco para se livrar de seguidores de spam. O ponto é que você vai conseguir um conjunto de chaves únicas para usar para o seu aplicacao. Então, o objetivo de criar uma aplicação é dar a si mesmo (e ao Twitter) um conjunto de chaves. Estes são:2. Crie uma aplicação: crie uma aplicação no programador do Twitter local
- a chave do consumidor
- O segredo do consumidor
- a ficha de acesso O segredo da ficha de acesso
3. Crie fichas de acesso: você precisará delas para fazer pedidos bem sucedidos
OAuth pede algumas fichas. Por isso, tens de os Criar para ti.
Clique em "criar o meu token de acesso" no fundo. Então, uma vez que você rolar para o fundo novamente, você terá algumas chaves recém-geradas. Você precisa pegar as quatro chaves previamente rotuladas desta página para suas chamadas API, então faça uma nota deles em algum lugar.
4. Mude o nível de acesso: Você não quer apenas leitura, pois não?
Se quiseres fazer algum uso decente disto API, terá de alterar a sua configuração para ler e escrever se estiver a fazer alguma coisa que não seja a recuperação de dados padrão usando os pedidos de GET.
Escolha a página "Configuração" perto do topo da página.
Dê ao seu aplicativo acesso de leitura / escrita, e carregue em "Update" no fundo.
Você podeler mais sobre o modelo de permissão de aplicações que o Twitter usa aqui.
5. Escrever o código para acesse a API : eu fiz a maior parte por você
Combinei o código acima, com algumas modificações e mudanças, em uma classe PHP então é muito simples fazer os pedidos que você precisa.
Isto usa OAuth e o Twitter v1.1 API, e a classe que criei que poderá encontrar em baixo.
require_once('TwitterAPIExchange.php');
/** Set access tokens here - see: https://dev.twitter.com/apps/ **/
$settings = array(
'oauth_access_token' => "YOUR_OAUTH_ACCESS_TOKEN",
'oauth_access_token_secret' => "YOUR_OAUTH_ACCESS_TOKEN_SECRET",
'consumer_key' => "YOUR_CONSUMER_KEY",
'consumer_secret' => "YOUR_CONSUMER_SECRET"
);
Certifique-se que coloca as chaves que obteve da sua aplicação acima nos respectivos espaços.
Em seguida, você precisa escolher um URL que deseja para fazer um pedido. O Twitter tem documentação da API para ajudá-lo a escolher qual URL e também o tipo de pedido (POST ou GET).
/** URL for REST request, see: https://dev.twitter.com/docs/api/1.1/ **/
$url = 'https://api.twitter.com/1.1/blocks/create.json';
$requestMethod = 'POST';
Na documentação, cada URL indica o que você pode passar para ela. Se estamos usando o URL" blocos " como o acima, eu posso passar os seguintes parâmetros de POST:
/** POST fields required by the URL above. See relevant docs as above **/
$postfields = array(
'screen_name' => 'usernameToBlock',
'skip_status' => '1'
);
Agora que preparaste o que queres fazer com a API, está na hora de fazer o pedido.
/** Perform the request and echo the response **/
$twitter = new TwitterAPIExchange($settings);
echo $twitter->buildOauth($url, $requestMethod)
->setPostfields($postfields)
->performRequest();
E para um publicação pedido, é isso!
Para um pedido de obter, é um pouco diferente. Aqui está um exemplo:/** Note: Set the GET field BEFORE calling buildOauth(); **/
$url = 'https://api.twitter.com/1.1/followers/ids.json';
$getfield = '?username=J7mbo';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
echo $twitter->setGetfield($getfield)
->buildOauth($url, $requestMethod)
->performRequest();
Exemplo final de código: para um simples pedido de obter uma lista dos meus seguidores.
$url = 'https://api.twitter.com/1.1/followers/list.json';
$getfield = '?username=J7mbo&skip_status=1';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
echo $twitter->setGetfield($getfield)
->buildOauth($url, $requestMethod)
->performRequest();
Eu coloquei estes arquivos no GitHub com crédito a @lackovic10 e @rivers! Eu espero que alguém ache útil ;eu sei que eu fiz (eu usei-o para bloqueio em massa em um loop).
Também para os que estão nas janelas problemas com os certificados SSL, veja este post . Esta biblioteca usa cURL sob o capô, então você precisa ter certeza de que você tem seus certs cURL configurados provavelmente. O Google também é seu amigo.
Ir para dev.twitter.com e criar uma aplicação . Isto dar-lhe-á as credenciais de que precisa. Aqui está uma implementação que escrevi recentemente com PHP e cURL .
<?php
function buildBaseString($baseURI, $method, $params) {
$r = array();
ksort($params);
foreach($params as $key=>$value){
$r[] = "$key=" . rawurlencode($value);
}
return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}
function buildAuthorizationHeader($oauth) {
$r = 'Authorization: OAuth ';
$values = array();
foreach($oauth as $key=>$value)
$values[] = "$key=\"" . rawurlencode($value) . "\"";
$r .= implode(', ', $values);
return $r;
}
$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
$oauth_access_token = "YOURVALUE";
$oauth_access_token_secret = "YOURVALUE";
$consumer_key = "YOURVALUE";
$consumer_secret = "YOURVALUE";
$oauth = array( 'oauth_consumer_key' => $consumer_key,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $oauth_access_token,
'oauth_timestamp' => time(),
'oauth_version' => '1.0');
$base_info = buildBaseString($url, 'GET', $oauth);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;
// Make requests
$header = array(buildAuthorizationHeader($oauth), 'Expect:');
$options = array( CURLOPT_HTTPHEADER => $header,
//CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HEADER => false,
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false);
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);
$twitter_data = json_decode($json);
//print it out
print_r ($twitter_data);
?>
Isto pode ser executado a partir da linha de comandos:
$ php <name of PHP script>.php
É necessário adicionar os parâmetros tanto ao URL} como ao processo de criação de assinaturas. criar uma assinatura é o artigo que me ajudou. Aqui está o meu código:
$oauth = array(
'screen_name' => 'DwightHoward',
'count' => 2,
'oauth_consumer_key' => $consumer_key,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $oauth_access_token,
'oauth_timestamp' => time(),
'oauth_version' => '1.0'
);
$options = array(
CURLOPT_HTTPHEADER => $header,
//CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HEADER => false,
CURLOPT_URL => $url . '?screen_name=DwightHoward&count=2',
CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false
);
$request
na função returnTweet()
).
function buildBaseString($baseURI, $method, $params) {
$r = array();
ksort($params);
foreach($params as $key=>$value){
$r[] = "$key=" . rawurlencode($value);
}
return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}
function buildAuthorizationHeader($oauth) {
$r = 'Authorization: OAuth ';
$values = array();
foreach($oauth as $key=>$value)
$values[] = "$key=\"" . rawurlencode($value) . "\"";
$r .= implode(', ', $values);
return $r;
}
function returnTweet(){
$oauth_access_token = "x";
$oauth_access_token_secret = "x";
$consumer_key = "x";
$consumer_secret = "x";
$twitter_timeline = "user_timeline"; // mentions_timeline / user_timeline / home_timeline / retweets_of_me
// create request
$request = array(
'screen_name' => 'budidino',
'count' => '3'
);
$oauth = array(
'oauth_consumer_key' => $consumer_key,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $oauth_access_token,
'oauth_timestamp' => time(),
'oauth_version' => '1.0'
);
// merge request and oauth to one array
$oauth = array_merge($oauth, $request);
// do some magic
$base_info = buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", 'GET', $oauth);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;
// make request
$header = array(buildAuthorizationHeader($oauth), 'Expect:');
$options = array( CURLOPT_HTTPHEADER => $header,
CURLOPT_HEADER => false,
CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false);
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);
return json_decode($json, true);
}
E depois liga-me.returnTweet()
Funcionou para mim sem usar parâmetros para a consulta, sempre que eu usei mais de um parâmetro mostrou-me o erro: 32 não poderia autenticá-lo.
O problema para mim, estava no amplificador e na codificação. Então no seu código onde está a seguinte linha
$url .= "?".http_build_query($query);
Adicionei a seguinte linha:
$url=str_replace("&","&",$url);
E funcionou usando dois ou mais parâmetros como o nome do ecrã e a contagem.
Todo o código parece isto:
$token = 'YOUR TOKEN';
$token_secret = 'TOKEN SECRET';
$consumer_key = 'YOUR KEY';
$consumer_secret = 'KEY SECRET';
$host = 'api.twitter.com';
$method = 'GET';
$path = '/1.1/statuses/user_timeline.json'; // api call path
$query = array( // query parameters
'screen_name' => 'twitterapi',
'count' => '2'
);
$oauth = array(
'oauth_consumer_key' => $consumer_key,
'oauth_token' => $token,
'oauth_nonce' => (string)mt_rand(), // a stronger nonce is recommended
'oauth_timestamp' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_version' => '1.0'
);
$oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting
$query = array_map("rawurlencode", $query);
$arr = array_merge($oauth, $query); // combine the values THEN sort
asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)
// http_build_query automatically encodes, but our parameters
// are already encoded, and must be by this point, so we undo
// the encoding step
$querystring = urldecode(http_build_query($arr, '', '&'));
$url = "https://$host$path";
// mash everything together for the text to hash
$base_string = $method."&".rawurlencode($url)."&".rawurlencode($querystring);
// same with the key
$key = rawurlencode($consumer_secret)."&".rawurlencode($token_secret);
// generate the hash
$signature = rawurlencode(base64_encode(hash_hmac('sha1', $base_string, $key, true)));
// this time we're using a normal GET query, and we're only encoding the query params
// (without the oauth params)
$url .= "?".http_build_query($query);
$url=str_replace("&","&",$url); //Patch by @Frewuill
$oauth['oauth_signature'] = $signature; // don't want to abandon all that work!
ksort($oauth); // probably not necessary, but twitter's demo does it
// also not necessary, but twitter's demo does this too
function add_quotes($str) { return '"'.$str.'"'; }
$oauth = array_map("add_quotes", $oauth);
// this is the full value of the Authorization line
$auth = "OAuth " . urldecode(http_build_query($oauth, '', ', '));
// if you're doing post, you need to skip the GET building above
// and instead supply query parameters to CURLOPT_POSTFIELDS
$options = array( CURLOPT_HTTPHEADER => array("Authorization: $auth"),
//CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HEADER => false,
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false);
// do our business
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);
$twitter_data = json_decode($json);
Espero que ajude alguém com o mesmo problema que eu.
Aqui estão os bits importantes todos num só lugar:
- como já foi referido, tem de assinar os seus pedidos de 1, 1 API. Se você está fazendo algo como obter estatutos públicos, você vai querer uma chave de aplicação em vez de uma chave de usuário. O link completo para a página que você deseja é: https://dev.twitter.com/apps
- Você deve ajustar todos os parâmetros, tanto os do oauth e os parâmetros get (ou parâmetros POST) juntos.
- Você deve ordenar os parâmetros antes de reduzi-los para a forma codificada url que é hashed.
- Você deve codificar algumas coisas várias vezes-por exemplo, você cria um texto de consulta a partir dos valores codificados url dos parâmetros, e então você codificar isso e concatenar com o tipo de método e o url.
Simpatize com todas as dores de cabeça, então aqui está um código para terminar tudo:
$token = 'YOUR TOKEN';
$token_secret = 'TOKEN SECRET';
$consumer_key = 'YOUR KEY';
$consumer_secret = 'KEY SECRET';
$host = 'api.twitter.com';
$method = 'GET';
$path = '/1.1/statuses/user_timeline.json'; // api call path
$query = array( // query parameters
'screen_name' => 'twitterapi',
'count' => '2'
);
$oauth = array(
'oauth_consumer_key' => $consumer_key,
'oauth_token' => $token,
'oauth_nonce' => (string)mt_rand(), // a stronger nonce is recommended
'oauth_timestamp' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_version' => '1.0'
);
$oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting
$query = array_map("rawurlencode", $query);
$arr = array_merge($oauth, $query); // combine the values THEN sort
asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)
// http_build_query automatically encodes, but our parameters
// are already encoded, and must be by this point, so we undo
// the encoding step
$querystring = urldecode(http_build_query($arr, '', '&'));
$url = "https://$host$path";
// mash everything together for the text to hash
$base_string = $method."&".rawurlencode($url)."&".rawurlencode($querystring);
// same with the key
$key = rawurlencode($consumer_secret)."&".rawurlencode($token_secret);
// generate the hash
$signature = rawurlencode(base64_encode(hash_hmac('sha1', $base_string, $key, true)));
// this time we're using a normal GET query, and we're only encoding the query params
// (without the oauth params)
$url .= "?".http_build_query($query);
$oauth['oauth_signature'] = $signature; // don't want to abandon all that work!
ksort($oauth); // probably not necessary, but twitter's demo does it
// also not necessary, but twitter's demo does this too
function add_quotes($str) { return '"'.$str.'"'; }
$oauth = array_map("add_quotes", $oauth);
// this is the full value of the Authorization line
$auth = "OAuth " . urldecode(http_build_query($oauth, '', ', '));
// if you're doing post, you need to skip the GET building above
// and instead supply query parameters to CURLOPT_POSTFIELDS
$options = array( CURLOPT_HTTPHEADER => array("Authorization: $auth"),
//CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HEADER => false,
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false);
// do our business
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);
$twitter_data = json_decode($json);
Se você tem a biblioteca PHP de OAuth instalada, você não tem que se preocupar em formar o pedido você mesmo.
$oauth = new OAuth($consumer_key, $consumer_secret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($access_token, $access_secret);
$oauth->fetch("https://api.twitter.com/1.1/statuses/user_timeline.json");
$twitter_data = json_decode($oauth->getLastResponse());
print_r($twitter_data);
Para mais informações, consulte o documento ou o seu exemplo. Você pode usar pecl install oauth
para obter a biblioteca.
Se vai usar a procure/tweets API com a biblioteca PHP" twitter-api-php " (TwitterAPIExchange.php):
Primeiro, você tem que apenas comentar "executar um pedido POST e ecoar a resposta" área de código.
Basta usar" executar um pedido GET e ecoar o código de resposta " e ecoar a resposta e alterar estes dois linhas:$url = 'https://api.twitter.com/1.1/followers/ids.json';
$getfield = '?screen_name=J7mbo';
A
$url = 'https://api.twitter.com/1.1/search/tweets.json';
$getfield = '?q=J7mbo';
(mudança screen_name
para q
, é isso:)
Você vai precisar de A para criar um "app" no Twitter (e você precisa de uma conta no Twitter para fazer isso).
Então, você precisa usar OAuth para fazer um pedido autorizado ao Twitter.
Pode usar o recurso obter os Estados/user_ timeline para obter uma lista de tweets recentes.
Basta preencher as chaves e ajustar $count
a seu gosto:
$url = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
$count = '10';
$oauth = array('count' => $count,
'oauth_consumer_key' => '[CONSUMER KEY]',
'oauth_nonce' => md5(mt_rand()),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => time(),
'oauth_token' => '[ACCESS TOKEN]',
'oauth_version' => '1.0');
$oauth['oauth_signature'] = base64_encode(hash_hmac('sha1', 'GET&' . rawurlencode($url) . '&' . rawurlencode(implode('&', array_map(function ($v, $k) { return $k . '=' . $v; }, $oauth, array_keys($oauth)))), '[CONSUMER SECRET]&[ACCESS TOKEN SECRET]', true));
$twitterData = json_decode(file_get_contents($url . '?count=' . $count, false, stream_context_create(array('http' => array('method' => 'GET',
'header' => 'Authorization: OAuth '
. implode(', ', array_map(function ($v, $k) { return $k . '="' . rawurlencode($v) . '"'; }, $oauth, array_keys($oauth))))))));
Este usa funções anónimas e file_get_contents
em vez da biblioteca de curvas. Note o uso de um NONCÉ MD5 hashed. Todos parecem estar indo junto com o time()
nonce, no entanto, a maioria dos exemplos na web sobre o OAuth usar algum tipo de criptografado string (como este: http://www.sitepoint.com/understanding-oauth-1 isto também faz mais sentido para mim.
Nota adicional: você precisa de PHP 5.3+ para as funções anônimas (no caso do seu servidor/computador estar em alguma caverna da Guerra Fria e você não pode atualizá-lo).
A partir do seu Gerador de assinaturas , você pode gerar curl
comandos do formulário:
curl --get 'https://api.twitter.com/1.1/statuses/user_timeline.json' --data 'count=2&screen_name=twitterapi' --header 'Authorization: OAuth oauth_consumer_key="YOUR_KEY", oauth_nonce="YOUR_NONCE", oauth_signature="YOUR-SIG", oauth_signature_method="HMAC-SHA1", oauth_timestamp="TIMESTAMP", oauth_token="YOUR-TOKEN", oauth_version="1.0"' --verbose
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET);
$timelines = $connection->get('statuses/user_timeline', array('screen_name' => 'NSE_NIFTY', 'count' => 100, 'include_rts' => 1));
<?php
function buildBaseString($baseURI, $method, $params) {
$r = array();
ksort($params);
foreach($params as $key=>$value){
$r[] = "$key=" . rawurlencode($value);
}
return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}
function buildAuthorizationHeader($oauth) {
$r = 'Authorization: OAuth ';
$values = array();
foreach($oauth as $key=>$value)
$values[] = "$key=\"" . rawurlencode($value) . "\"";
$r .= implode(', ', $values);
return $r;
}
function returnTweet(){
$oauth_access_token = "2602299919-lP6mgkqAMVwvHM1L0Cplw8idxJzvuZoQRzyMkOx";
$oauth_access_token_secret = "wGWny2kz67hGdnLe3Uuy63YZs4nIGs8wQtCU7KnOT5brS";
$consumer_key = "zAzJRrPOj5BvOsK5QhscKogVQ";
$consumer_secret = "Uag0ujVJomqPbfdoR2UAWbRYhjzgoU9jeo7qfZHCxR6a6ozcu1";
$twitter_timeline = "user_timeline"; // mentions_timeline / user_timeline / home_timeline / retweets_of_me
// create request
$request = array(
'screen_name' => 'burownrice',
'count' => '3'
);
$oauth = array(
'oauth_consumer_key' => $consumer_key,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $oauth_access_token,
'oauth_timestamp' => time(),
'oauth_version' => '1.0'
);
// merge request and oauth to one array
$oauth = array_merge($oauth, $request);
// do some magic
$base_info = buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", 'GET', $oauth);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;
// make request
$header = array(buildAuthorizationHeader($oauth), 'Expect:');
$options = array( CURLOPT_HTTPHEADER => $header,
CURLOPT_HEADER => false,
CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false);
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);
return $json;
}
$tweet = returnTweet();
echo $tweet;
?>
Se for útil para alguém... Em meu blog eu implementei o seguinte código PHP, a fim de recuperar os últimos tweets, extrair seus dados mais relevantes e, em seguida, salvá-los em um banco de dados MySQL. Funciona porque o tenho no meu blog.
A mesa "tweets" onde os guardam:
CREATE TABLE IF NOT EXISTS `tweets` (
`tweet_id` int(11) NOT NULL auto_increment,
`id_tweet` bigint(20) NOT NULL,
`text_tweet` char(144) NOT NULL,
`datetime_tweet` datetime NOT NULL,
`dayofweek_tweet` char(3) NOT NULL,
`GMT_tweet` char(5) NOT NULL,
`shorturl_tweet` char(23) NOT NULL,
PRIMARY KEY (`tweet_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=83 ;
[4] Get_tweets.php:
<?php
function buildBaseString($baseURI, $method, $params) {
$r= array();
ksort($params);
foreach($params as $key=>$value){
$r[]= "$key=".rawurlencode($value);
}
return $method."&".rawurlencode($baseURI).'&'.rawurlencode(implode('&', $r));
}
function buildAuthorizationHeader($oauth) {
$r= 'Authorization: OAuth ';
$values= array();
foreach($oauth as $key=>$value) {
$values[]= "$key=\"".rawurlencode($value)."\"";
}
$r.= implode(', ', $values);
return $r;
}
function returnTweets($last_id) {
$oauth_access_token = "2687912757-vbyfJA483SEyj2HJ2K346aVMxtOIgVbsY4Edrsw";
$oauth_access_token_secret = "nIruzmR0bXqC3has4fTf8KAq4pgOceiuKqjklhroENU4W";
$api_key = "ieDSTFH8QHHPafg7H0whQB9GaY";
$api_secret = "mgm8wVS9YP93IJmTQtsmR8ZJADDNdlTca5kCizMkC7O7gFDS1j";
$twitter_timeline = "user_timeline"; //[mentions_timeline/user_timeline/home_timeline/retweets_of_me]
//create request
$request= array(
'screen_name' => 'runs_ES',
'count' => '3',
'exclude_replies' => 'true'
);
if (!is_null($last_id)) { //Add to the request if it exits a last_id
$request['since_id']= $max_id;
}
$oauth = array(
'oauth_consumer_key' => $api_key,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $oauth_access_token,
'oauth_timestamp' => time(),
'oauth_version' => '1.0'
);
//merge request and oauth to one array
$oauth= array_merge($oauth, $request);
//do some magic
$base_info= buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", 'GET', $oauth);
$composite_key= rawurlencode($api_secret).'&'.rawurlencode($oauth_access_token_secret);
$oauth_signature= base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature']= $oauth_signature;
//make request
$header= array(buildAuthorizationHeader($oauth), 'Expect:');
$options= array(CURLOPT_HTTPHEADER => $header,
CURLOPT_HEADER => false,
CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false);
$feed= curl_init();
curl_setopt_array($feed, $options);
$json= curl_exec($feed);
curl_close($feed);
return $json;
}
function parse_tweettext($tweet_text) {
$text= substr($tweet_text, 0, -23);
$short_url= substr($tweet_text, -23, 23);
return array ('text'=>$text, 'short_url'=> $short_url);
}
function parse_tweetdatetime($tweetdatetime) {
//Thu Aug 21 21:57:26 +0000 2014 Sun Mon Tue Wed Thu Fri Sat
$months= array('Jan'=>'01', 'Feb'=>'02', 'Mar'=>'03', 'Apr'=>'04', 'May'=>'05', 'Jun'=>'06',
'Jul'=>'07', 'Aug'=>'08', 'Sep'=>'09', 'Oct'=>'10', 'Nov'=>'11', 'Dec'=>'12');
$GMT= substr($tweetdatetime, -10, 5);
$year= substr($tweetdatetime, -4, 4);
$month_str= substr($tweetdatetime, 4, 3);
$month= $months[$month_str];
$day= substr($tweetdatetime, 8, 2);
$dayofweek= substr($tweetdatetime, 0, 3);
$time= substr($tweetdatetime, 11, 8);
$date= $year.'-'.$month.'-'.$day;
$datetime= $date.' '.$time;
return array('datetime'=>$datetime, 'dayofweek'=>$dayofweek, 'GMT'=>$GMT);
//datetime: "YYYY-MM-DD HH:MM:SS", dayofweek: Mon, Tue..., GMT: +####
}
//First check in the database the last id tweet:
$query= "SELECT MAX(tweets.id_tweet) AS id_last FROM tweets;";
$result= exec_query($query);
$row= mysql_fetch_object($result);
if ($result!= 0 && mysql_num_rows($result)) { //if error in query or not results
$last_id= $row->id_last;
}
else {
$last_id= null;
}
$json= returnTweets($last_id);
$tweets= json_decode($json, TRUE);
foreach ($tweets as $tweet) {
$tweet_id= $tweet['id'];
if (!empty($tweet_id)) { //if array is not empty
$tweet_parsetext= parse_tweettext($tweet['text']);
$tweet_text= utf8_encode($tweet_parsetext['text']);
$tweet_shorturl= $tweet_parsetext['short_url'];
$tweet_parsedt= parse_tweetdatetime($tweet['created_at']);
$tweet_datetime= $tweet_parsedt['datetime'];
$tweet_dayofweek= $tweet_parsedt['dayofweek'];
$tweet_GMT= $tweet_parsedt['GMT'];
//Insert the tweet into the database:
$fields = array(
'id_tweet' => $tweet_id,
'text_tweet' => $tweet_text,
'datetime_tweet' => $tweet_datetime,
'dayofweek_tweet' => $tweet_dayofweek,
'GMT_tweet' => $tweet_GMT,
'shorturl_tweet' => $tweet_shorturl
);
$new_id= mysql_insert('tweets', $fields);
}
} //end of foreach
?>
A função para salvar os tweets:
function mysql_insert($table, $inserts) {
$keys = array_keys($inserts);
exec_query("START TRANSACTION;");
$query= 'INSERT INTO `'.$table.'` (`'.implode('`,`', $keys).'`) VALUES (\''.implode('\',\'', $inserts).'\')';
exec_query($query);
$id= mysql_insert_id();
if (mysql_error()) {
exec_query("ROLLBACK;");
die("Error: $query");
}
else {
exec_query("COMMIT;");
}
return $id;
}