目次
サンプル・プログラムの実行例
サンプル・プログラム
| summaryGemini.php | サンプル・プログラム本体 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 1.2.0 | 2025/12/20 | PHP8.5対応:curl_closeを実行しないようにした |
| 1.1.0 | 2025/09/19 | .pahooEnv導入 |
| 1.0.0 | 2025/01/02 | 初版 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 2.0.1 | 2025/08/11 | getParam() bug-fix |
| 2.0.0 | 2025/08/11 | pahooLoadEnv() 追加 |
| 1.9.0 | 2025/07/26 | getParam() 引数に$trim追加 |
| 1.8.1 | 2025/03/15 | validRegexPattern() debug |
| 1.8.0 | 2024/11/12 | validRegexPattern() 追加 |
準備:PHP の https対応
Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dllLinuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順
これで準備は完了だ。
準備:pahooInputData 関数群
また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。
準備:初期値など
getHolidayGoogle.php
58: // 初期値(START) =============================================================
59:
60: // 表示幅(ピクセル)
61: define('WIDTH', 600);
62:
63: // 指定できる西暦年の範囲;現在年±10
64: define('MIN_YEAR', date('Y') - 10);
65: define('MAX_YEAR', date('Y') + 10);
66:
67: // -- 以下のデータは .env ファイルに記述可能
68: // Google Cloud Platform APIキー
69: // https://cloud.google.com/maps-platform/
70: if (isset($_ENV['PAHOO_GOOGLE_API_KEY_1'])) {
71: define('GOOGLE_API_KEY', $_ENV['PAHOO_GOOGLE_API_KEY_1']);
72: } else {
73: define('GOOGLE_API_KEY', '');
74: }
75:
76: // 初期値(END) ===============================================================
その他の初期値については、「変更不可」の記載がないかぎり、自由に変更してかまわない。
Gemini API
| URL |
|---|
| https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=(APIキー) |
解説:Gemini APIにリクエストする
summaryGemini.php
221: /**
222: * Gemini APIにリクエストする
223: * @param string $text プロンプト(テキスト;UTF-8)
224: * @return string 応答テキスト/FALSE:失敗
225: */
226: function geminiRequest($text) {
227: $this->webapi = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=' . $this->GEMINI_API_KEY;
228: $headers = array(
229: 'Content-Type: application/json',
230: );
231: $payload = array(
232: 'contents' => array(
233: 'parts' => array(
234: 'text' => $text
235: )
236: )
237: );
238: $ret = FALSE;
239:
240: $ch = curl_init();
241: curl_setopt($ch, CURLOPT_URL, $this->webapi);
242: curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
243: curl_setopt($ch, CURLOPT_POST, TRUE);
244: curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
245: curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
246: curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
247: curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
248: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
249: curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
250:
251: $data = curl_exec($ch);
252: if (PHP_VERSION_ID < 80500) {
253: curl_close($ch);
254: }
255:
256: // エラー処理
257: if ($data == FALSE) {
258: $this->errmsg = 'Gemini APIにアクセスできません';
259: $ret = FALSE;
260: } else {
261: $arr = json_decode($data, TRUE);
262: if ($arr == FALSE) {
263: $this->errmsg = 'Gemini APIの応答が不正です';
264: $ret = FALSE;
265: } else if (isset($arr['error'])) {
266: $this->errmsg = $arr['error']['message'];
267: // 正常応答
268: } else if (isset($arr['candidates'][0]['content']['parts'][0]['text'])) {
269: $ret = (string)$arr['candidates'][0]['content']['parts'][0]['text'];
270: } else {
271: $this->errmsg = 'Gemini APIの応答が不正です';
272: $ret = FALSE;
273: }
274: }
275:
276: return $ret;
277: }
なお、Gemini API を利用する処理は、ユーザー定義クラス pahooGoogleGeminiAPI として分離してある。
解説:テキスト要約
summaryGemini.php
394: // メイン・プログラム =======================================================
395:
396: // Gemini API インスタンスを用意する.
397: $pgg = new pahooGoogleGeminiAPI();
398:
399: // パラメータを取得する.
400: $summary = $errmsg = '';
401: $maxSize = MAX_SIZE;
402: $sour = getValidString('sour', $errmsg, $def=DEF_SOUR, 1, 199);
403: if ($errmsg == '') {
404: $maxSize = mb_strlen($sour);
405: }
406: $size = getValidNumber('size', $errmsg, DEF_SIZE, TRUE, (int)($maxSize / 10) + 1, $maxSize);
407: $opt = getValidNumber('opt', $errmsg, 0, TRUE, 0, 1);
408:
409: // リセット
410: if (isButton('reset')) {
411: $sour = DEF_SOUR;
412: $summary = $errmsg = '';
413: }
414:
415: // Gemini API を利用してテキストを要約する.
416: if (($errmsg == '') && isButton('exec') && ($sour != '')) {
417: foreach ($Options as $val=>$label) {
418: if ($val == $opt) break;
419: }
420: $sentence = '次の文書を、' . $label . 'で、' . $size . '文字以内で要約してください。' . "\n\n" . $sour;
421: $summary = $pgg->geminiRequest($sentence);
422: $summary = trim($summary);
423: }
424:
425: // 表示HTMLを作成する.
426: $HtmlBody = makeCommonBody($sour, $summary, $size, $opt, $errmsg, $pgg);
427:
428: // 画面に表示する.
429: echo $HtmlHeader;
430: echo $HtmlBody;
431: echo $HtmlFooter;
432:
433: // インスタンスを解放する.
434: $pgg = NULL;
元のテキスト(要約したいテキスト)を Gemini APIに渡す直前に、「次の文書を、[である調 or ですます調] で、$size 文字以内で要約してください。」という1文を冒頭に付け加えることで、Gemini に要約することを指示する。[である調 or ですます調] と文字数 $size は、テキスト入力時に選択できるようにしてる。文字数指定に利用している jQuery UI の Spinner については、「解説:Spinner - jQuery UI - PHPで素数かどうか判定」をご覧いただきたい。
参考サイト
- Gemini API:Google
- PHPで日本文の“要約もどき”を行う:ぱふぅ家のホームページ
- PHPでテキストの要約を行う:ぱふぅ家のホームページ

(2025年12月20日)PHP8.5対応:curl_closeを実行しないようにした
(2025年9月19日).pahooEnv導入