はてなキーワードAPI
「はてなキーワード自動リンクAPI」を使い自動リンクに使われるキーワード一覧を取得します。
目標:はてなキーワード自動リンクAPIを使いキーワードリストを配列に入れる
APIドキュメントを見ると
任意のテキストを送信すると、はてなキーワードを抽出し、キーワード部分を自動的にリンクして返信するAPIです
APIはXML-RPC APIを用いて実装を行っており…- はてなキーワード自動リンクAPI
XML-RPCがよくわからなかった のでGoogle先生に聞いたらXMLでやりとりするプロトコル? みたいなことが書いてあったので
SimpleXMLElementでリクエスト用のXMLを作成しPOSTすることにしました。
流れとしては
1. SimpleXMLElementでリクエストに使うXMLを作成
2. curlで作成したXMLをPOST
3. SimpleXMLElementで配列に入れるためにパース。
実行
SimpleXMLElementで生成した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
/**
* はてなキーワード自動リンク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);
結果
結果
Array
(
[0] => Markdown記法
[1] => チートシート
[2] => シンタックス
[3] => ハイライト
[4] => ハイライト
[5] => ハイライト
[6] => Markdown
[7] => FIREBALL
[8] => GitHub
[9] => コード
[10] => Qiita
[11] => 掲載
[12] => 準拠
[13] => 言語
[14] => 記法
[15] => ます
[16] => 言語
)
Good
感想?
SimpleXMLElementの部分もっとスマートに書けるような気が…
XML-RPC使いにくい…