PHPではてなキーワード自動リンクAPIを使ってみた（使用例？）

# はてなキーワードAPI

「はてなキーワード自動リンクAPI」を使い自動リンクに使われるキーワード一覧を取得します。

目標：**はてなキーワード自動リンクAPIを使いキーワードリストを配列に入れる**


APIドキュメントを見ると
>  任意のテキストを送信すると、はてなキーワードを抽出し、キーワード部分を自動的にリンクして返信するAPIです
APIはXML-RPC APIを用いて実装を行っており…- [はてなキーワード自動リンクAPI](http://developer.hatena.ne.jp/ja/documents/keyword/apis/autolink)




XML-RPCがよくわからなかった :cold_sweat: のでGoogle先生に聞いたらXMLでやりとりするプロトコル？　みたいなことが書いてあったので
SimpleXMLElementでリクエスト用のXMLを作成しPOSTすることにしました。

流れとしては
1. SimpleXMLElementでリクエストに使うXMLを作成
2. curlで作成したXMLをPOST
3. SimpleXMLElementで配列に入れるためにパース。


# 実行



##SimpleXMLElementで生成したXML

実行コードの```//XML作成```のところで作っているXML

```xml:xml
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
  <methodName>hatena.setKeywordLink</methodName>
  <params>
    <param>
      <value>
        <struct>
          <member>
            <name>body</name>
            <value><string>Markdown記法のチートシートです。本ページではQiitaで使用可能なMarkdownのみ掲載しているため、一部原文と異なります。Markdownの原文については、Daring Fireball: Markdown Syntax Documentationをご覧下さい。また、コードに関する記法はGitHub Flavored Markdownに準拠しています。Qiitaでシンタックスハイライト可能な言語一覧については、 シンタックスハイライト可能な言語 をご覧下さい</string></value>
          </member>
          <member>
            <name>mode</name>
            <value><string>lite</string></value>
          </member>
          <member>
            <name>score</name>
            <value><int>0</int></value>
          </member>
        </struct>
      </value>
    </param>
  </params>
</methodCall>
```


##実行コード
```PHP:
<?php

/**
 * はてなキーワード自動リンクAPI
 * http://developer.hatena.ne.jp/ja/documents/keyword/apis/autolink
 * 任意のテキストを送信すると、はてなキーワードを抽出し、キーワード部分を自動的にリンクして返信するAPIです。
 */

//送信したいテキスト
$text="Markdown記法のチートシートです。本ページではQiitaで使用可能なMarkdownのみ掲載しているため、一部原文と異なります。Markdownの原文については、Daring Fireball: Markdown Syntax Documentationをご覧下さい。また、コードに関する記法はGitHub Flavored Markdownに準拠しています。Qiitaでシンタックスハイライト可能な言語一覧については、 シンタックスハイライト可能な言語 をご覧下さい";

$endpoint ='http://d.hatena.ne.jp/xmlrpc';

$parameter=array(
    //自動リンクに使われるキーワード一覧
    'mode'=>'lite',
//キーワードスコアのしきい値
    'score'=>'0',
    //解析対象のテキスト
    'body'=>$text
);

//XML作成
$rootNode = new SimpleXMLElement( '<?xml version="1.0" encoding="UTF-8"?><methodCall></methodCall>');
$rootNode->addChild('methodName','hatena.setKeywordLink');
$paraNode1 = $rootNode->addChild('params');
$paraNode2 = $paraNode1->addChild('param');
$paraNode3 = $paraNode2->addChild('value');
$paraNode4 = $paraNode3->addChild('struct');
foreach($parameter as  $key => $value){
    $paraNode5 = $paraNode4->addChild('member');
    $paraNode5->addChild('name', $key);
    $paraNode5->addChild('value', $value);
}
$XML = $rootNode->asXML();

//リクエスト
$ch = curl_init($endpoint);
curl_setopt_array($ch, [
    //HEADER
    CURLOPT_HTTPHEADER => array(
        'Content-Type: text/xml',
    ),
    CURLOPT_POST=>true,
    CURLOPT_POSTFIELDS=>$XML,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FAILONERROR => true,
    CURLOPT_TIMEOUT => 30, //タイムアウト時間
    CURLOPT_SSL_VERIFYPEER => FALSE,//SSL検証しない
]);
$contents  = curl_exec($ch);
curl_close($ch);

//XMLパース
$array = array();
$xml = new SimpleXMLElement($contents);
$items=$xml->params->param->value->struct->member->value->array->data->value;
foreach($items as $item){
    $array[]=(string)$item->struct->member->value->string;
}

print_r($array);
```
##結果
```php:結果
Array
(
    [0] => Markdown記法
    [1] => チートシート
    [2] => シンタックス
    [3] => ハイライト
    [4] => ハイライト
    [5] => ハイライト
    [6] => Markdown
    [7] => FIREBALL
    [8] => GitHub
    [9] => コード
    [10] => Qiita
    [11] => 掲載
    [12] => 準拠
    [13] => 言語
    [14] => 記法
    [15] => ます
    [16] => 言語
)
```
Good :+1: 
# 感想？
SimpleXMLElementの部分もっとスマートに書けるような気が…
XML-RPC使いにくい…　

# 参考リンク
* [XML-RPC って？](http://www.nurs.or.jp/~sug/homep/mt/mt1.htm)