22780


下記 Twitter API ドキュメントに従って、  
OAuth 認証時にユーザーのメールアドレスを取得しようと試みています。

[GET account/verify_credentials | Twitter
Developers](https://dev.twitter.com/rest/reference/get/account/verify_credentials)

上記ドキュメントによると、

> ### Request a User's Email Address
>
> Requesting a user's email address requires your application to be
> whitelisted by Twitter.  
>  To request access, _please use this form_.
>
> Once whitelisted,  
>  the _“Request email addresses from users” checkbox_ will be available under
> your app permissions on apps.twitter.com.  
>  _Privacy Policy_ URL and _Terms of Service_ URL fields will also be
> available  
>  under settings which are required for email access.
>
> If enabled,  
>  users will be informed via the oauth/authorize dialog  
>  that your app can access their email address.

ということなので、  
whitelist の申請とアプリケーションの設定を済ませました。

> Twitter Application Management  
>  ttps://apps.twitter.com  
>  Settings  
>  1\. Callback URL  
>  2\. Privacy Policy URL  
>  3\. Terms of Service URL  
>  Permissions  
>  Additional Permissions  
>  These additional permissions require that you provide URLs  
>  to your application or service's privacy policy and terms of service.  
>  You can configure these fields in your Application Settings.  
>  [x] Request email addresses from users

![2016-03-02_023924](https://cloud.githubusercontent.com/assets/1160386/13439857/b087ab54-e032-11e5-9f3f-44f3b816c2f7.png)

* * *

その後、前述のドキュメント内の「OAuth Signature Generator」を使って "cURL command" を生成。

> cURL command  
>  OAuth Tool  
>  $ curl  
>  \--get 'ttps://api.twitter.com/1.1/account/verify_credentials.json'  
>  \--data 'include_email=true'  
>  \--header 'Authorization: OAuth  
>  oauth_consumer_key="...",  
>  oauth_signature="...",  
>  oauth_nonce="...",  
>  oauth_token="...",  
>  oauth_signature_method="HMAC-SHA1",  
>  oauth_timestamp="1456854748",  
>  oauth_version="1.0"'

返ってくる JSON に email が含まれていることを確認しました。

[code]

    {
      "id":...,
      "name":"...",
      ...
      "email":"..."
    }
    
[/code]

* * *

一方、下記 ZendService\Twitter component を使って同じように  
Twitter ユーザーのメールアドレスを取得しようと試みました。

  * [zendframework/ZendService_Twitter - Github](https://github.com/zendframework/ZendService_Twitter)
  * [ZendService\Twitter — Zend Framework 2 2.4.8 documentation - Zend Framework](http://framework.zend.com/manual/2.4/en/modules/zendservice.twitter.html)

### index.php

[code]

    $config = array(
      'access_token' => array(
        'token'  => '...',
        'secret' => '...'
      ),
      'oauth_options' => array(
        'consumerKey' => '...',
        'consumerSecret' => '...',
      ),
      'http_client_options' => array(
        'adapter' => 'Zend\Http\Client\Adapter\Curl',
        'curloptions' => array(
          CURLOPT_SSL_VERIFYHOST => false,
          CURLOPT_SSL_VERIFYPEER => false,
        ),
      ),
    );
    
    $twitter = new ZendService\Twitter\Twitter($config);
    
    $params = ['include_email' => true];
    $response = $twitter->account->verifyCredentials($params);
    if (!$response->isSuccess()) {
        die('Something is wrong with my credentials!');
    }
    
[/code]

### library\ZendService\Twitter\Twitter.php

`include_email=true` が付くように、コードの一部を改変しています。

[code]

    /**
     * Verify Account Credentials
     *
     * @throws Http\Client\Exception\ExceptionInterface if HTTP request fails or times out
     * @throws Exception\DomainException if unable to decode JSON payload
     * @return Response
     */
    public function accountVerifyCredentials($params = array())
    {
      $this->init();
      $response = $this->get('account/verify_credentials', $params);
      return new Response($response);
    }
    
[/code]

curl では取得できていた email が、php では取れていません。

email 以外のユーザー情報は取れています。

何が間違っているのでしょう？


CC BY-SA 3.0
2016-03-01T20:09:58.447
22715
2016-03-04T01:50:08.360
2016-03-02T11:38:31.620
8000
13813
question
php twitter
ZendService\Twitterを使って、ユーザーのメールアドレスを取得したい


パラメータの引き渡し方は特に問題なさそうですし、実際他の情報は取得できているのですよね。Responseクラスも汎用的なものなのでemailだけパースに失敗しているとも考えにくいです。

となると、各トークンにメールアドレス参照の権限が付与されていないことが考えられます。例えば申請を行っていないトークンで試したところ、include_emailを指定しても特にエラーにはならず、emailを含まないレスポンスが返ってきました。

  * ConsumerKey/ConsumerSecretがホワイトリスト申請を行ったものと一致しているかどうか
  * AccessToken/AccessSecretが **ホワイトリスト申請の後に発行されたものかどうか**

を確認してみてください。


CC BY-SA 3.0
2016-03-02T10:29:14.253
22733
2016-03-02T10:29:14.253
8000
22715
answer


trueを文字列に変えて試してみればいかがでしょうか？

[code]

    $params = ['include_email' => 'true'];
    
[/code]


CC BY-SA 3.0
2016-03-04T01:50:08.360
22780
2016-03-04T01:50:08.360
10378
22715
answer