2015-08-16 5 views
2

Я пытаюсь отобразить последние твиты учетной записи Twitter на своем веб-сайте, и я пытаюсь извлечь данные, используя cURL и PHP. Когда я использую инструмент OAuth (генератор сигнатур) на веб-сайте Twitter Developers. Существует команда cURL, которая сгенерирована, и она отлично работает на моем терминале. Однако, когда я пытаюсь использовать CURL с теми же параметрами в моем PHP коде, я получаю следующее сообщение об ошибке:Проблемы с аутентификацией с помощью API Twitter

{ 
    "errors": [ 
     { 
      "code": 215, 
      "message": "Bad Authentication data." 
     } 
    ] 
} 

Вот локонов команда:

curl --get 'https://api.twitter.com/1.1/statuses/user_timeline.json' --data 'count=2&screen_name=[my user name]' --header 'Authorization: OAuth oauth_consumer_key="[my key]", oauth_nonce="[my key]", oauth_signature="[the signature]", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1439736924", oauth_version="1.0"' --verbose 

А вот мой PHP код:

$ch = curl_init("https://api.twitter.com/1.1/statuses/user_timeline.json?count=2&screen_name=XXXXX"); 

curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization' => 'OAuth', 
    'oauth_consumer_key' => '[my key]', 
    'oauth_nonce' => '[my key]', 
    'oauth_signature' => '[the signature]', 
    'oauth_signature_method' => 'HMAC-SHA1', 
    'oauth_timestamp' => '1439736924', 
    'oauth_version' => '1.0') 
); 

curl_setopt($ch, CURLOPT_POSTFIELDS, array(
    'count' => 2, 
    'screen_name' => '[my username]') 
); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

echo curl_exec($ch); 

значения точно так же и я не понимаю, почему он работает с командой локон но не в коде PHP. Вот два бревна:

команда Curl (работает отлично):

* Connected to api.twitter.com (199.16.156.199) port 443 (#0) 
* successfully set certificate verify locations: 
* CAfile: none 
    CApath: /etc/ssl/certs/ 
* TLSv1.2, TLS handshake, Client hello (1): 
* TLSv1.2, TLS handshake, Server hello (2): 
* TLSv1.2, TLS handshake, CERT (11): 
* TLSv1.2, TLS handshake, Server key exchange (12): 
* TLSv1.2, TLS handshake, Server finished (14): 
* TLSv1.2, TLS handshake, Client key exchange (16): 
* TLSv1.2, TLS change cipher, Client hello (1): 
* TLSv1.2, TLS handshake, Finished (20): 
* TLSv1.2, TLS change cipher, Client hello (1): 
* TLSv1.2, TLS handshake, Finished (20): 
* SSL connection using TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256 
* Server certificate: 
* subject: C=US; ST=California; L=San Francisco; O=Twitter, Inc.; OU=Twitter Security; CN=api.twitter.com 
* start date: 2014-08-03 00:00:00 GMT 
* expire date: 2016-12-31 23:59:59 GMT 
* subjectAltName: api.twitter.com matched 
* issuer: C=US; O=VeriSign, Inc.; OU=VeriSign Trust Network; OU=Terms of use at https://www.verisign.com/rpa (c)10; CN=VeriSign Class 3 Secure Server CA - G3 
* SSL certificate verify ok. 
> GET /1.1/statuses/user_timeline.json?count=2&screen_name=XXX HTTP/1.1 
> User-Agent: curl/7.38.0 
> Host: api.twitter.com 
> Accept: */* 
> Authorization: OAuth oauth_consumer_key="BBBBBB",  oauth_nonce="CCCCCCCC", oauth_signature="DDDDDDDD", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1439736924", oauth_version="1.0" 
> 
< HTTP/1.1 200 OK 
< cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0 
< content-disposition: attachment; filename=json.json 
< content-length: 7512 
< content-type: application/json;charset=utf-8 
< date: Sun, 16 Aug 2015 16:09:46 GMT 
< expires: Tue, 31 Mar 1981 05:00:00 GMT 
< last-modified: Sun, 16 Aug 2015 16:09:46 GMT 
< pragma: no-cache 
< server: tsa_b 
< set-cookie: guest_id=v1%3A143974138658672554; Domain=.twitter.com; Path=/; Expires=Tue, 15-Aug-2017 16:09:46 UTC 
< status: 200 OK 
< strict-transport-security: max-age=631138519 
< x-connection-hash: ae1b9fcc59bb90b767b246dfd06f6c94 
< x-content-type-options: nosniff 
< x-frame-options: SAMEORIGIN 
< x-rate-limit-limit: 300 
< x-rate-limit-remaining: 298 
< x-rate-limit-reset: 1439741812 
< x-response-time: 23 
< x-transaction: 8515dfd151751885 
< x-twitter-response-tags: BouncerCompliant 
< x-xss-protection: 1; mode=block 
< 

журнала PHP (возвращает сообщение об ошибке):

* Hostname in DNS cache was stale, zapped 
* Trying 199.16.156.199... 
* Connected to api.twitter.com (199.16.156.199) port 443 (#0) 
* successfully set certificate verify locations: 
* CAfile: none 
    CApath: /etc/ssl/certs/ 
* SSL connection using TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256 
* Server certificate: 
* subject: C=US; ST=California; L=San Francisco; O=Twitter, Inc.; OU=Twitter Security; CN=api.twitter.com 
* start date: 2014-08-03 00:00:00 GMT 
* expire date: 2016-12-31 23:59:59 GMT 
* subjectAltName: api.twitter.com matched 
* issuer: C=US; O=VeriSign, Inc.; OU=VeriSign Trust Network; OU=Terms of use at https://www.verisign.com/rpa (c)10; CN=VeriSign Class 3 Secure Server CA - G3 
* SSL certificate verify ok. 
> GET /1.1/statuses/user_timeline.json?count=2&screen_name=XXXX HTTP/1.1 
Host: api.twitter.com 
Accept: */* 
Authorization: OAuth 
oauth_consumer_key: BBBBBB 
oauth_nonce: CCCCCCC 
oauth_signature: DDDDDDD 
oauth_signature_method: HMAC-SHA1 
oauth_timestamp: 1439740787 
oauth_version: 1.0 

< HTTP/1.1 400 Bad Request 
< content-length: 62 
< content-type: application/json; charset=utf-8 
< date: Sun, 16 Aug 2015 16:26:50 GMT 
< server: tsa_b 
< set-cookie: guest_id=v1%3A143974241022741403; Domain=.twitter.com; Path=/; Expires=Tue, 15-Aug-2017 16:26:50 UTC 
< strict-transport-security: max-age=631138519 
< x-connection-hash: abbabb47dc8a7d355f595f389f868de2 
< x-response-time: 4 
< 
* Connection #0 to host api.twitter.com left intact 

Любая помощь будет оценена. Если возможно, я действительно хотел бы использовать cURL вместо сторонней библиотеки.

Благодаря

EDIT: решение Майкла не работает, но вот обновленный выход PHP:

Authorization: OAuth oauth_consumer_key="...", oauth_nonce="...", oauth_signature="...", oauth_signature_method="HMAC-SHA1" oauth_timestamp= "1439744503", oauth_version= "1.0" 

ответ

1

Главное различие между ними в том, что в команде CLI curl, заголовок Authorization является указанная как одиночная строка с несколькими key=value парами через запятую. Но в вашем PHP-коде вы указали те пары key=value как несколько отдельных заголовков. Вам просто нужно добавить один заголовок Authorization со всеми этими значениями, объединенными в одну строку.

выход заголовка запроса консоли в:

Authorization: OAuth oauth_consumer_key="BBBBBB",  oauth_nonce="CCCCCCCC", oauth_signature="DDDDDDDD", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1439736924", oauth_version="1.0" 

выход заголовка запроса на PHP отличается:

Authorization: OAuth 
oauth_consumer_key: BBBBBB 
oauth_nonce: CCCCCCC 
oauth_signature: DDDDDDD 
oauth_signature_method: HMAC-SHA1 
oauth_timestamp: 1439740787 
oauth_version: 1.0 

Так правильный PHP для получения сопоставимого строки одного заголовка будет:

curl_setopt($ch, CURLOPT_HEADER, 0); 
// All OAuth values in a single Authorization header string. 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization' => 'OAuth oauth_consumer_key="[my key]", oauth_nonce="[my key]", oauth_signature="[the signature]", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1439736924", oauth_version="1.0"' 
) 
); 
// etc... Everything else should be fine as you have it 
+0

Непросто читать, поэтому я обновляю свой пост. – user1319182

+0

@ user1319182 'oauth_timestamp =" 1439744503 ", oauth_version =" 1.0 "' Я вижу дополнительные пробелы после '='. Убедитесь, что у вашего PHP нет таких. –

+0

@ user1319182 Кроме того, я только что отредактировал токены OAuth и т. Д. Из вашего редактирования выше. Однако я не могу удалить их из истории редактирования. Вероятно, вы должны запросить новый токен. –