Posted at

PHPではてなキーワード自動リンクAPIを使ってみた(使用例?)

More than 3 years have passed since last update.


はてなキーワードAPI

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

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

APIドキュメントを見ると


任意のテキストを送信すると、はてなキーワードを抽出し、キーワード部分を自動的にリンクして返信するAPIです

APIはXML-RPC APIを用いて実装を行っており…- はてなキーワード自動リンクAPI


XML-RPCがよくわからなかった :cold_sweat: ので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 :thumbsup:


感想?

SimpleXMLElementの部分もっとスマートに書けるような気が…

XML-RPC使いにくい… 


参考リンク