[PHP]アプリにTwitterの投稿機能を導入

##**概要**
先日のプロジェクトでのウェブアプリに記事を投稿すると、
TwitterとFacebookにも記事が投稿される機能を着手しました。
**※二種類全部 有効期間更新無し(無期限)、SNSログイン無し(非認証)で 記事投稿できる**

最初は意外と簡単だったんですが、いくつか困ったことがあったので、
その手順や注意事項などを振り替えてみます。

Facebookの方も記事を投稿しましたので、こちらをご参考してください。👏
🔗[Javascript]アプリにFacebookの投稿機能を導入(準備中)

また、以下の記事でそれぞれの注意事項と制約事項を話していますので、ぜひご参考してください。👏
[🔗[PHP][Javascript]Twitter APIとFacebook APIのそれぞれ違う注意事項・制約事項](http://qiita.com/leedohyung-dba/items/e8e3e39262c3b1caacc7)

##**始める前**
Twitter APIを扱うオープンソースライブラリは殆どの言語から提供しています。
**`Java`**
**`ASP`**
**`C++`**
**`Clojure`**
**`ColdFusion`**
**`.NET`**
**`Go`**
**`Javascript / node.js`**
**`Lua/Corona SDK`**
**`Objective-C`**
**`Perl`**
**`PHP`**
**`Python`**
**`Ruby`**
**`C`**
**`VBScript`**

また、PHPのAPIライブラリーは色んなことがあります。
・ [🔗tmhOAuth](https://github.com/themattharris/tmhOAuth) (by @themattharris)
・ [🔗twitteroauth](https://github.com/abraham/twitteroauth) (by @abraham)
・ [🔗140dev Twitter Framework](http://140dev.com/free-twitter-api-source-code-library/) (by @140dev)
・ 🔗Twitter API: Engagement Programming (by @140dev)
・ [🔗codebird-php](https://github.com/jublonet/codebird-php) (by @jublonet)
・ 🔗[CodeIgniter-Twitter-Search-Library](https://github.com/ElliottLandsborough/Codeigniter-Twitter-Search-Library) (by @elliottlan)
・ 🔗[Zend Framework 1.12.2maintained](https://framework.zend.com/) (by @zend) 
・ 🔗[freebird-phpmaintained]() (by @corbanb) 
・ 🔗Twitter-API-PHPmaintained (by @j7mbo)
・ 🔗[TwitterOAuthby](https://github.com/ricardoper/TwitterOAuth) (by @Ricard0Per)
詳しくには[🔗こちら](https://dev.twitter.com/overview/api/twitter-libraries)をご参考してください。

今回は**themattharris**さんの**tmhOAuth**を利用しますので、
まず、導入するアプリの**PHPバージョン**が**5.3.0**以上か確認しましょう。
以下のバージョンでしたら、他のAPIライブラリーを探してください。
存在しなくても、全然大丈夫です。
**themattharris/tmhOAuth**は**`tmhOAuth.php`**ファイルだけで動作しているので
このファイルだけを**下位バージョンに合わせる**とオーケーです。

##**手順**
Twitterの方はFacebookよりものすごく**簡単**ですし**制約が少ない**です。
その詳しい内容は以下の記事で話しています。
[🔗[PHP][Javascript]Twitter APIとFacebook APIのそれぞれ違う注意事項・制約事項](http://qiita.com/leedohyung-dba/items/e8e3e39262c3b1caacc7)
言語はもちろんPHP(Vr.5.3)でございます。

それでは、順番は以下の通りです。

#####**① Twitterアップを登録してAccessTokenを取得する**
`dev.Twitter.com`の`Manage Your Apps`でTwitterアップリを生成します。
[🔗Manage Your Apps](https://apps.twitter.com/)
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/1510016e-9a66-c077-7316-fc3a05ce4c6f.png)

入力項目は「アプリの名前」・「説明」・「ウェブサイト」ぐらいで簡単です。
######※「ウェブサイト」項目に以下のようにコメントされていますが、ローカル開発環境のアドレスを入れても問題ありません。
######そして、APIも問題なく上手く動作します。(ちなみにFacebookAPIの方は違います！ ラッキー >ㅁ <# )
>Your application's publicly accessible home page, where users can go to download, make use of, or find out more information about your application.`

同意チェックして`Create your Twitter application`ボタンを押すと完了( w o w ~! )
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/d6c03093-c5ca-43a3-8f5e-5c7cad17dd15.png)

じゃ、**Twitterアプリの生成が終わり**ました。
すぐアプリの情報ページに移動されます。
アプリ情報ページには 
アプリの詳しい情報を確認する[Details]ページ、
設定を切り替えるのが出来る[Settings]ページ、
Token情報などを取得できる[Keys and Access Tokens]ページ、
アプリのアクセス権限を設定できる[Permissions]ページがあります。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/f52ab440-f65e-ae83-9a36-c90cae209cfe.png)

他のページは一応置いておいて、
[Keys and Access Tokens]ページから必要な情報を取得して、PHPのリソースで設定しましょう。

```php:Bootstrap/const.php
//twitterの連携ソースを指定
Configure::write('twitter_conf_source', array(
    'consumer_key'    => '*****************************',
    'consumer_secret' => '************************************',
    'user_token'      => '********************************************',
    'user_secret'     => '***************************',
    'curl_ssl_verifypeer' => false
));
```

以下の記事にも説明しましたが、**TwitterAPIの方は有効期間がありません。**
>Access Tokenの有効期間はサービスプロバイダの政策によって異なる部分があるが、
>[🔗ツイッターOAuth faq](https://dev.twitter.com/oauth/overview/faq)を確認すれば、現在Access Tokenの有効期間はない(!)と明示しています。 
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/28dbb9e7-d444-5ec7-6efc-8eaf1cb07319.png)
>したがって、トークンの保管に注意をする必要があるはずです。 

[🔗[PHP][Javascript]Twitter APIとFacebook APIのそれぞれ違う注意事項・制約事項](http://qiita.com/leedohyung-dba/items/e8e3e39262c3b1caacc7)
なので、ぜひできるだけ`encapsulation`してください。

#####**② tmhOAuth.phpをインストール**
#####・composerで入れ込む

```json:composer.json
"require": {
	"themattharris/tmhoauth": "0.8.*",
}
```
#####・クローンで入れ込む

```shell:git.command
git clone git@github.com:themattharris/tmhOAuth.git
```

#####**③ 利用**
まず、ライブラリーをインポートします。

```php:TwitterUp.php
App::import('Vendor', 'themattharris/tmhoauth/tmhOAuth');
```

画嬢がある場合と無い場合はパラメーターとAPIのurlが違いますので、区別しましょう。
コードは以下の通りです。
#####・画嬢が**ある**記事の投稿方法

```php:TwitterUp.php
//画嬢ある記事投稿
$twitter_conf_source = $this->TwitterUp->conf('twitter_conf_source');

$up_twitter_image = WWW_ROOT . IMAGES_URL . $Model->alias . '/' . $registerdData[$Model->alias]['id'] . '/img1/' . $registerdData[$Model->alias]['img1']['file_name'];
$up_twitter_image_name  = basename($up_twitter_image);
$params = array(
    'media[]'  => "@{$up_twitter_image};type=image/jpeg;filename={$up_twitter_image_name}",
    'status'   => "{$up_twitter_content}"
);
$endpoint = $tmhOAuth->url('1.1/statuses/update_with_media');

```

#####・画嬢が**ない**記事の投稿方法

```php:TwitterUp.php
//画嬢ない記事投稿
$params = array('status'   => $up_twitter_content);
$endpoint = $tmhOAuth->url('1.1/statuses/update');));
```

他の注意点も結構あります。
以下の記事にその詳しい情報がありますので、ぜひご確認してください。👏
[🔗[PHP][Javascript]Twitter APIとFacebook APIのそれぞれ違う注意事項・制約事項](http://qiita.com/leedohyung-dba/items/e8e3e39262c3b1caacc7)

####④ Twitter Card
色んなブログに**"認証"**の手順が必要だと説明が置いていますし、そのリンクもありましたが、
そのリンクは404エラーを表示しています。
また、[🔗ドキュメント](https://dev.twitter.com/ja/cards/overview)の説明と色んなブログの記事に書いている内容がほぼ違っていて、
バージョンが上がりながら、政策が変わったらしいです。
つまり、**認証はいらないです。**

以下は導入方法でございます。
**ものすごく簡単です。**
#####1) [🔗ドキュメント](https://dev.twitter.com/ja/cards/overview)の以下の7つの種類で一つを選んでください。
• [🔗Summaryカード](https://dev.twitter.com/cards/types/summary): デフォルトのカードで、タイトル、説明、サムネイル、Twitterアカウントの属性が含まれ
• [🔗大きな画像付きのSummaryカード](https://dev.twitter.com/cards/types/summary-large-image): Summaryに似ていますが、画像が目立つように使用されています。
• [🔗Photoカード](https://dev.twitter.com/cards/types/photo): 写真のみを含めたカードです。
• [🔗Galleryカード](https://dev.twitter.com/cards/types/gallery): 4つの写真を集めて強調したカードです。
• [🔗Appカード](https://dev.twitter.com/cards/types/app): モバイルアプリの詳細を含めて直接ダウンロードできるようにしたカードです。
• [🔗Playerカード](https://dev.twitter.com/cards/types/player): 動画やオーディオ、スライドショーを視聴できるカードです。
• [🔗Productカード](https://dev.twitter.com/cards/types/product): 製品情報のために最適化したカードです。

#####2) リンクをクリックして例の<meta>タグをご参考してフロジェクトに反映してください。
```html:view_layout.ctp
<meta name="twitter:site" content="@nytimes">
<meta name="twitter:creator" content="@SarahMaslinNir">
<meta name="twitter:title" content="Parade of Fans for Houston’s Funeral">
<meta name="twitter:description" content="NEWARK - The guest list and parade of limousines with celebrities emerging from them seemed more suited to a red carpet event in Hollywood or New York than than a gritty stretch of Sussex Avenue near the former site of the James M. Baxter Terrace public housing project here.">
<meta name="twitter:image" content="http://graphics8.nytimes.com/images/2012/02/19/us/19whitney-span/19whitney-span-articleLarge.jpg">
```
🔻🔻🔻🔻🔻🔻🔻🔻🔻🔻🔻🔻
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/4f920cc2-d2c4-ef5c-3cf0-60b7bf4c86e4.png)

```html:view_layout.ctp
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="@flickr" />
<meta name="twitter:title" content="Small Island Developing States Photo Submission" />
<meta name="twitter:description" content="View the album on Flickr." />
<meta name="twitter:image" content="https://farm6.staticflickr.com/5510/14338202952_93595258ff_z.jpg" />
```
🔻🔻🔻🔻🔻🔻🔻🔻🔻🔻🔻🔻
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/9d71fa2c-0509-97f2-05a8-ae1ef68acb49.png)

#####3) ちゃんと反映されたか確認してください。
[🔗こちら](https://cards-dev.twitter.com/validator)でTwitterCard 設定(<meta>タグ)を反映したurlを入れて、
ちゃんと設定しているかをご確認してください。
エラーのログと結果の姿をすぐ確認できますので、すごく便利です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/e4f23565-6eeb-53d8-74fc-895b37144be6.png)
※導入方法は[🔗ドキュメント](https://dev.twitter.com/ja/cards/overview)にも優しく説明されていますので、ご参考してください。

##**エラー確認**
APIからレスポンスデータをしっかりあうログファイルで記録しましょう。
以下はログの情報でございます。
[🔗Error Codes & Responses HTTP Status Codes](https://dev.twitter.com/overview/api/response-codes)
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/1df9e2f7-b1fa-3a44-4ac1-d24b494836cc.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/aa199c56-f647-aaba-9454-7c7a0572863c.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/6aa7dbb2-7a65-19fc-5265-6a4141126d02.png)

##**注意事項確認必須**
方法はものすごく簡単ですが、ケースによって以下のように色んなバグが発生されるかもしれません。
なので、しっかり確認しましょう。
[🔗[PHP][Javascript]Twitter APIとFacebook APIのそれぞれ違う注意事項・制約事項](http://qiita.com/leedohyung-dba/items/e8e3e39262c3b1caacc7)
・curl timeout error (code: 28)
・内容のサイズチェック制限（画嬢＆本文）
・同じ記事は再び投稿不可能
・など など・・・

以上です！👏