LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

はてなキーワード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使いにくい… 

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0