Brave Search APIでニュース検索（ドシロウト）

## 0.初めに

Braveは、有名なブラウザーで[Brave Search](https://search.brave.com/)という独自の検索エンジンを持っています。
Brave Searchは、APIを提供しており、WEB検索やニュース検索に利用できるようなので試してみました。

私は、貧乏な非エンジニアなので、[ロリポップ！](https://lolipop.jp/)のエコノミープランでも試せるPHPのコードで試しました。

なお、コードについては、ほぼ、生成AIの[perplexity](https://www.perplexity.ai/)の無料版に書いていただきました。[perplexity](https://www.perplexity.ai/)すごい！！

## 1.Brave Search APIについて

Brave Search APIは、一応無料で利用できるようです。ただ、APIの利用登録時にクレジットカード等の登録が無料プランを選択しても求められます。

API利用登録についてざっくり説明すると

利用登録は[こちら](https://brave.com/search/api/)から行います。
![コメント 2024-04-12 105243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35574/82ee5f4d-da43-4feb-8982-47a2a5d246e0.png)

利用登録画面はこんな感じ
![コメント 2024-04-12 110814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35574/8037bf9d-e4f5-2528-16c5-0dc27c329ffe.png)

利用できるプラン。無料は１リクエスト/秒、２０００リクエスト/月みたいです。
![コメント 2024-04-12 112223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35574/27f30032-e1d4-dcfc-e242-24a7fba0261c.png)

APIキーを発行する画面ですが、先にサブスクリプションしてねとかいてあり、サブスクリプションの画面でクレジットカード情報を入力しろと言われます。
![コメント 2024-04-12 112424.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35574/7e538ee1-20e9-087a-63a7-b31389413577.png)

ニュース検索のAPIのクイックスタートはCurlでの使い方が書かれているだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35574/b84bc2b2-f1cd-7a87-f5cf-5accb7f173d8.png)


## 2.コード（ニュース検索）

私はCurlをコマンドラインから[ロリポップ！](https://lolipop.jp/)のWEB画面でPHPが動くようにコードを作るにはスキル不足でした。

とりあえず、コード作成は、[perplexity](https://www.perplexity.ai/)の助けを借りました。APIキーは画面で入力するように[perplexity](https://www.perplexity.ai/)に依頼しました。
![コメント 2024-04-12 135517.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35574/6eb46bf6-a09a-6d29-0e2a-581de92c9c36.jpeg)

[perplexity](https://www.perplexity.ai/)の結果を少しだけ修正したコードが以下です。

```php:index.php
<style>
#fresh {
    margin-top: 5px;
    margin-bottom: 5px;
}    
</style>
<form method="post" autocomplete="off">
    <label for="query">検索クエリ:</label>
    <input type="text" id="query" name="query" required>
    <br>
    <label for="api_key">API Key:</label>
    <input type="text" id="api_key" name="api_key" required>
    <div>
      <select name="fresh" id="fresh">
        <option value="pd">対象期間：１日</option>
        <option value="pw" selected>対象期間：１週</option>
        <option value="pm">対象期間：１月</option>
        <option value="py">対象期間：１年</option>
      </select>
    </div>

    <button type="submit">検索</button>
</form>

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $query = $_POST['query'];
    $apiKey = $_POST['api_key'];
    $fresh = $_POST['fresh'];

    $url = "https://api.search.brave.com/res/v1/news/search?country=jp&search_lang=jp&freshness=" . $fresh . "&q=" . urlencode($query);
    $headers = array(
        "Accept: application/json",
        "Accept-Encoding: gzip",
        "X-Subscription-Token: " . $apiKey
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_ENCODING, "gzip");
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $response = curl_exec($ch);

    if ($response === false) {
        echo "cURL error: " . curl_error($ch);
    } else {
        $data = json_decode($response, true);
        // 検索結果を表示する
        foreach ($data['results'] as $result) {
            echo "<h3><a href='" . $result['url'] . "' target='_blank'>" . $result['title'] . "</a></h3>";
            echo "<p>" . $result['description'] . "</p>";
        }
    }

    curl_close($ch);
}
?>
```

検索した結果はこんな感じでやりたいことはできました。
![1コメント 2024-04-12 131404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35574/9bc3ddec-a6cb-2d32-73d4-5c8f79c23b1b.png)

あと、入力項目のサニタイズはした方がいいんでしょうね。この記事書いてるときにそう思いました。

## 3.終わりに

Brave Search APIの記事がなかったので書いてみました。

[perplexity](https://www.perplexity.ai/)めっちゃ便利ですね。