サンプル・プログラムの実行例
目次
サンプル・プログラムのダウンロード
| getNASAimage.php | サンプル・プログラム本体。 |
| .pahooEnv | クラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。 使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。 |
| pahooInputData.php | データ入力に関わる関数群。 使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
| pahooCalendar.php | 暦・潮位計算クラス pahooCalendar。 暦・潮位計算クラスの使い方は「PHPで二十四節気・七十二候一覧を作成」「PHPで月齢を計算」「PHPで日出没・月出没・月齢・潮を計算」「PHPで潮位を計算する」などを参照。include_path が通ったディレクトリに配置すること。 |
| pahooTwitterAPI.php | Twitter APIを利用するクラス pahooTwitterAPI。 使い方は「PHPでTwitterに投稿(ツイート)する」などを参照。include_path が通ったディレクトリに配置すること。 |
| pahooBlueskyAPI.php | Bluesky APIに関わるクラス pahooBlueskyAPI。 使い方は「PHPでPHPでBlueskyに投稿する」などを参照。include_path が通ったディレクトリに配置すること。 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 1.0.0 | 2026/01/18 | 初版 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 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() 追加 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 4.6.1 | 2025/11/23 | next_fullmoon: bug-fix |
| 4.6.0 | 2025/10/08 | getMidAutumnMoon() 追加 |
| 4.5.1 | 2025/05/31 | deg2ddmm(), deg2hhmm() 不具合修正 |
| 4.5.0 | 2024/03/17 | ヒジュラ暦メソッドを追加 |
| 4.4.1 | 2024/03/17 | getCabinetOfficeHolidayTable() -- bug-fix |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 5.6.1 | 2025/11/30 | PHP8.5対応:curl_closeを使わないようにした |
| 5.6.0 | 2025/08/13 | .pahooEnv導入 |
| 5.5.1 | 2024/11/23 | __construct() -- PHP8.4における応急処置 |
| 5.5.0 | 2024/06/21 | TwitterOAuth 7.0.0 対応 |
| 5.4.0 | 2024/05/18 | twitter.com → x.com 変更対応 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 2.7.1 | 2025/11/22 | PHP8.5対応:curl_close,imagedestroyを実行しないようにした |
| 2.7.0 | 2025/08/17 | reductImage,uploadBlob仕様変更←画像に余計な空白が入らないようにするため |
| 2.6.0 | 2025/08/14 | .pahooEnv 導入 |
| 2.5.1 | 2025/08/10 | uploadBlob() -- bug-fix |
| 2.5.0 | 2025/08/02 | getOGPInformation() -- og:imageがないページに対応 |
プログラムの流れ
準備:PHP の https対応
Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dllLinuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順
これで準備は完了だ。
準備:pahooInputData 関数群
また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。
準備:pahooCalendar クラス
pahooCalendar.php
11: class pahooCalendar {
12: var $CONVERGE = 0.00005; // 逐次近似計算収束判定値
13: var $ASTRO_REFRACT = 0.585556; // 大気差
14: var $TDIFF = +9.0; // 世界時との時差
15: var $error, $errmsg; // エラーフラグ,エラーメッセージ
16: var $year, $month, $day; // 西暦年月日
17: var $tblmoon; // グレゴリオ暦=旧暦テーブル
18: var $language; // 表示言語(jp:日本語, en:英語, en3:英語略記)
19: var $resolve2033; // 旧暦2033年問題解決案 0:解決しない,1:案1,2:案2,3:対応案3 → https://www.pahoo.org/e-soul/webtech/php02/php02-45-01.shtm#php_resolveLunarCalendar2033
20: var $pcc; // pahooCacheインスタンス
21: var $CabinetOfficeHolidayTables; // 内閣府が公開している祝日表
22: const CABINETOFFICE_HOLIDAY_FILE = 'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv'; // 内閣府が公開している祝日表URL
23:
24: /**
25: * コンストラクタ
26: * @param string $language 表示言語;省略時 jp
27: * @param float $tdiff 世界時との時差(省略時 +9.0;日本標準時)
28: * @param object $pcc pahooCacheインスタンス;省略時 NULL
29: * インターネット経由で内閣府の国民の祝日を参照するときに指定
30: * @return bool オブジェクト/FALSE:$tdiffが不正
31: */
32: function __construct($language='jp', $tdiff=+9.0, $pcc=NULL) {
33: $this->error = FALSE;
34: $this->errmsg = '';
35: $this->year = date('Y');
36: $this->month = date('n');
37: $this->day = date('j');
38: $this->resolve2033 = 0;
39: $this->pcc = $pcc;
40: $this->CabinetOfficeHolidayTables = array();
41:
42: $this->setLanguage($language);
43: if ($this->setTimeDifference($tdiff) == FALSE) {
44: $this->error = TRUE;
45: $this->errmsg = 'illegal tdiff';
46: }
47: }
準備:pahooTwitterAPI クラス
pahooTwitterAPI.php
11: // TwitterOAuth クラスをロードする.
12: $version = explode('.', phpversion());
13: if ($version[0] >= 8) {
14: require __DIR__ . '/vendor/autoload.php';
15: }
16: use Abraham\TwitterOAuth\TwitterOAuth;
17:
「Twitter API」を利用するために、API key、API key secret、Access Token、Access Token secret が必要で、入手方法は「Twitter API - WebAPIの登録方法」を参照されたい。
PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。
OAuth認証 および Twitter API へのアクセスには、TwitterOAuth を利用する。導入方法は公式サイトにあるように composer を使うことを推奨している。
⚠ TwitterOAuth 8.1.0 は、2025年(令和7年)11月20日にリリースされた PHP 8.5 に対応している。
TwitterOAuth クラスをロードする。composer でインストールされたフォルダ "\vendor" を "pahooTwitterAPI.php" と同じフォルダへコピーすること。
pahooTwitterAPI.php
37: /**
38: * コンストラクタ
39: * @param なし
40: * @return なし
41: */
42: function __construct() {
43: if (isset($_ENV['PAHOO_TWTR_CONSUMER_KEY'])) {
44: $this->TWTR_CONSUMER_KEY = $_ENV['PAHOO_TWTR_CONSUMER_KEY'];
45: }
46: if (isset($_ENV['PAHOO_TWTR_CONSUMER_SECRET'])) {
47: $this->TWTR_CONSUMER_SECRET = $_ENV['PAHOO_TWTR_CONSUMER_SECRET'];
48: }
49: if (isset($_ENV['PAHOO_TWTR_ACCESS_KEY'])) {
50: $this->TWTR_ACCESS_KEY = $_ENV['PAHOO_TWTR_ACCESS_KEY'];
51: }
52: if (isset($_ENV['PAHOO_TWTR_ACCESS_SECRET'])) {
53: $this->TWTR_ACCESS_SECRET = $_ENV['PAHOO_TWTR_ACCESS_SECRET'];
54: }
55:
56: // プロパティを初期化する.
57: $this->responses = array();
58: $this->webapi = '';
59: $this->error = FALSE;
60: $this->errmsg = '';
61: $this->errcode = 0;
62:
63: $this->connection = new TwitterOAuth($this->TWTR_CONSUMER_KEY, $this->TWTR_CONSUMER_SECRET, $this->TWTR_ACCESS_KEY, $this->TWTR_ACCESS_SECRET);
64: // v2使用を宣言
65: $this->connection->setApiVersion('2');
66:
67: // PHP8.4で暗黙的にnullableを指定することが非推奨になったため
68: // TwitterOAuthが対応するまでの応急処置
69: error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED);
70: }
pahooTwitterAPI.php
30: // OAuth用パラメータ
31: // https://apps.twitter.com/
32: public $TWTR_CONSUMER_KEY = ''; // Cunsumer key
33: public $TWTR_CONSUMER_SECRET = ''; // Consumer secret
34: public $TWTR_ACCESS_KEY = ''; // Access Token (oauth_token)
35: public $TWTR_ACCESS_SECRET = ''; // Access Token Secret (oauth_token_secret)
36:
事前にプログラムを登録しておく必要があり、その方法は「Twitter API - WebAPIの登録方法」を参照されたい。入手したパラメータを、上述の変数に代入しておくこと。
準備:pahooBlueskyAPI クラス
pahooBlueskyAPI.php
19: class pahooBlueskyAPI {
20: public $pds; // PDSドメイン
21: public $webapi ; // 直前に呼び出したWebAPI URL
22: public $errmsg; // エラーメッセージ
23: public $accessJwt; // accessJwt
24: public $refreshJwt; // refreshJwt
25:
26: const INTERNAL_ENCODING = 'UTF-8'; // 内部エンコーディング
27: const MAX_MESSAGE_LEN = 300; // 投稿可能なメッセージ文字数
28: const URL_LEN = 23; // メッセージ中のURL文字数(相当)
29: const MAX_IMAGE_WIDTH = 1200; // 投稿可能な最大画像幅(ピクセル)
30: const MAX_IMAGE_HEIGHT = 675; // 投稿可能な最大画像高さ(ピクセル)
31: // これより大きいときは自動縮小する
32: // トークンを保存するファイル名
33: // 秘匿性を保つことができ、かつ、PHPプログラムから読み書き可能であること
34: const FILENAME_TOKEN = './.token';
35:
36: // -- 以下のデータは .env ファイルに記述可能
37: // Bluesky API アプリパスワード
38: // https://bsky.app/
39: public $BLUESKY_HANDLE = ''; // ハンドル名
40: public $BLUESKY_PASSWORD = ''; // アプリケーション・パスワード
「Bluesky API」を利用するために、ハンドル名、アプリケーション・パスワード が必要で、入手方法は「Bluesky API - WebAPIの登録方法」を参照されたい。
PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。
準備:各種定数など
getNASAimage.php
52: // 各種定数(START) ===========================================================
53:
54: // 表示幅(ピクセル)
55: define('WIDTH', 600);
56:
57: // Twitter(現・X)投稿ボタン TRUE:有効,FALSE:無効
58: define('TWITTER', TRUE);
59:
60: // Bluesky投稿ボタン TRUE:有効,FALSE:無効
61: define('BLUESKY', TRUE);
62:
63: // 各種定数(END) =============================================================
出力結果を Twitter(現・X) に投稿することができる。投稿機能を有効化するときは、定数 TWITTER を TRUE にする。
出力結果を Bluesky に投稿することができる。投稿機能を有効化するときは、定数 BLUESKY を TRUE にする。
Twitter(現・X) や Bluesky のボタン・アイコンについては、「HTMLとCSSでさまざまなアイコンを表示する」を参照して欲しい。
NASA APIs:APOD
| リクエストURL |
|---|
| https://api.nasa.gov/planetary/apod |
| フィールド名 | 要否 | 内 容 |
|---|---|---|
| api_key | 必須 | APIキー。Generate API Key から無償入手できる。APODでは "DEMO_KEY" を指定してもよい。 |
| date | 必須 | 取得年月日:yyyy-mm-dd形式。米東部標準時間で本日以降の年月日は指定できない。 |
解説:NASA API クラス
getNASAimage.php
80: class pahooNasaAPI {
81: public $webapi; // 直前に呼び出したWebAPI URL
82: public $errmsg; // エラーメッセージ
83: public $NASA_API_KEY; // NASA API key
84:
$NASA_API_KEY には、APIキーを代入するのだが、事前に Generate API Key から氏名、メールアドレスを入力することで無償で取得できる。得られたAPIキーは、環境ファイル .pahooEnv に代入してほしい。なお、今回利用する APOD については、APIキーを "DEMO_KEY" としても動作する。
解説:指定日のNASA画像を取得する
getNASAimage.php
149: /**
150: * 指定日のNASA画像を取得する
151: * @param string $date 取得したい年月日(yyyy-mm-dd)省略時は本日(日本時間)
152: * @return array 画像データ/FALSE:クラウド連携に失敗
153: */
154: function APOD($date='') {
155: // 現在の年月日(米東部標準時)
156: if ($date === '') {
157: $dt = new DateTime('now', new DateTimeZone('America/New_York'));
158: $date = $dt->format('Y-m-d');
159: // 引数を米東部標準時に返還
160: } else {
161: $nowJST = new DateTime('now', new DateTimeZone('Asia/Tokyo'));
162: $date = $date . ' ' . $nowJST->format('H:i:s');
163: $dt = new DateTime($date, new DateTimeZone('Asia/Tokyo'));
164: $dt->setTimezone(new DateTimeZone('America/New_York'));
165: $date = $dt->format('Y-m-d');
166: }
167:
168: // リクエストURL
169: $this->webapi = "https://api.nasa.gov/planetary/apod?api_key={$this->NASA_API_KEY}&date={$date}";
170:
171: $ch = curl_init($this->webapi);
172: // cURLを使ったリクエスト
173: curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
174: curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
175: curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
176: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // サーバ証明書検証をスキップ
177: curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 〃
178:
179: // レスポンス処理
180: $response = curl_exec($ch);
181: if (PHP_VERSION_ID < 80500) {
182: curl_close($ch);
183: }
184: $items = json_decode($response, TRUE);
185:
186: if ($response === FALSE) {
187: $this->seterror($this->webapi . ' にアクセスできません');
188: return FALSE;
189: } else if (isset($items['code']) && ($items['code'] >= 300)) {
190: $this->seterror($items['msg']);
191: return FALSE;
192: }
193:
194: return $items;
195: }
引数は日本標準時だが、これを NASA APIs に渡す前に DateTimeZone クラスを使って米東部標準時に変換している。
翻訳処理
getNASAimage.php
201: class pahooTranslate {
202: public $webapi = ''; // 直前に呼び出したWebAPI URL
203: public $errmsg = ''; // エラーメッセージ
204:
205: // DeepL APIキー
206: // https://www.deepl.com/ja/docs-api から無料申込み.
207: // 利用しないのなら未定義のままでよい.
208: public $PAHOO_DEEPL_API_KEY = '';
209:
210: /**
211: * コンストラクタ
212: * @param なし
213: * @return なし
214: */
215: function __construct() {
216: $this->webapi = '';
217: $this->errmsg = '';
218:
219: if (isset($_ENV['PAHOO_DEEPL_API_KEY'])) {
220: $this->PAHOO_DEEPL_API_KEY = $_ENV['PAHOO_DEEPL_API_KEY'];
221: }
222: }
解説:Twitter(現・X)にポストする
getNASAimage.php
508: /**
509: * Twitter(現・X)にポストする
510: * @param string $imageTitle 画像タイトル
511: * @param string $explanatio 解説
512: * @param string $imageUrl 画像URL
513: * @param string $date 日付
514: * @param string $errmsg エラーメッセージ格納用
515: * @return string 応答メッセージ
516: */
517: function postTwitter($imageTitle, $explanation, $imageUrl, $date, &$errmsg) {
518: $errmsg = '';
519: $str = mb_substr($explanation, 0, 80) . '...';
520: $message =<<< EOT
521: {$imageTitle} - {$date}(EST)
522:
523: {$str}
524:
525: (ご参考)PHPで今日のNASA画像を求める https://www.pahoo.org/e-soul/webtech/php06/php06-59-01.shtm
526:
527: EOT;
528: $ptw = new pahooTwitterAPI();
529: $res = $ptw->tweet_media($message, array($imageUrl));
530: if ($res === FALSE) {
531: $errmsg = $ptw->geterror();
532: } else {
533: $res =<<< EOT
534: <p style="color:blue;">ツイートしました.</p>
535:
536: EOT;
537: }
538: $ptw = NULL;
539:
540: return $res;
541: }
解説:Blueskyへ投稿する
getNASAimage.php
543: /**
544: * Blueskyへ投稿する
545: * @param string $imageTitle 画像タイトル
546: * @param string $explanatio 解説
547: * @param string $imageUrl 画像URL
548: * @param string $date 日付
549: * @param string $errmsg エラーメッセージ格納用
550: * @return string 応答メッセージ
551: */
552: function postBluesky($imageTitle, $explanation, $imageUrl, $date, &$errmsg) {
553: $errmsg = '';
554: $str = mb_substr($explanation, 0, 150) . '...';
555: $message =<<< EOT
556: {$imageTitle} - {$date}(EST)
557:
558: {$str}
559:
560: (ご参考)PHPで今日のNASA画像を求める https://www.pahoo.org/e-soul/webtech/php06/php06-59-01.shtm
561:
562: EOT;
563: $rawImage = @file_get_contents($imageUrl);
564: $pbs = new pahooBlueskyAPI(BLUESKY_DOMAIN);
565: $res = $pbs->createSession();
566: $res = $pbs->post($message, FALSE, NULL, NULL, array($rawImage));
567: if ($res === FALSE) {
568: $errmsg = $pbs->geterror();
569: } else {
570: $res =<<< EOT
571: <a href="{$res}">{$res}</a> に投稿しました.
572:
573: EOT;
574: }
575: $pbs->deleteSession();
576: $pbs = NULL;
577:
578: return $res;
579: }
解説:Twitter(現・X)にポストする
getNASAimage.php
433: /**
434: * jQuery:Datepicker 用の祝日スクリプトを作成する
435: * @param pahooCalendar $pc 暦計算クラス
436: * @param array $startDate 開始年月日
437: * @param array $finishDate 終了年月日
438: * @param string $ymd 初期値;省略可能
439: * @return string スクリプト
440: */
441: function makeJSDatepicker($pc, $startDate, $finishDate, $ymd='') {
442: $js =<<< EOT
443: $(function() {
444: //カレンダーの範囲
445: const minD = new Date({$startDate[0]}, {$startDate[1]} - 1, {$startDate[2]});
446: const maxD = new Date({$finishDate[0]}, {$finishDate[1]} - 1, {$finishDate[2]});
447:
448: var holidays = {
449:
450: EOT;
451: $cnt = 0;
452: for ($year = $startDate[0]; $year <= $finishDate[0]; $year++) {
453: for ($month = 1; $month <= 12; $month++) {
454: $day_of_month = $pc->getDaysInMonth($year, $month);
455: for ($day = 1; $day <= $day_of_month; $day++) {
456: $name = $pc->getHoliday($year, $month, $day);
457: if ($name != FALSE) {
458: $yyyymmdd = sprintf('%04d%02d%02d', $year, $month, $day);
459: if ($cnt > 0) $js .= ",\n";
460: $js .= <<< EOT
461: "{$yyyymmdd}":{type:0, title:"{$name}"}
462: EOT;
463: $cnt++;
464: }
465: }
466: }
467: }
468:
469: $js .=<<< EOT
470:
471: };
472:
473: //Datepickerの設定
474: $(".datepicker").datepicker({
475: dateFormat: "yy-mm-dd",
476: minDate: minD,
477: maxDate: maxD,
478: beforeShowDay: function(day) {
479: var result;
480: var holiday = holidays[$.datepicker.formatDate('yymmdd', day)]
481: // 祝日・非営業日定義に存在するか?
482: if (holiday) {
483: result = [true, "date-holiday" + holiday.type, holiday.title];
484: } else {
485: switch (day.getDay()) {
486: case 0: // 日曜日か?
487: result = [true, "date-sunday"];
488: break;
489: case 6: // 土曜日か?
490: result = [true, "date-saturday"];
491: break;
492: default:
493: result = [true, ""];
494: break;
495: }
496: }
497: return result;
498: }
499: });
500: $(".datepicker").datepicker("setDate", "{$ymd}");
501: });
502:
503: EOT;
504:
505: return $js;
506: }
なお。本日日付以降は入力できないようグレーアウトする。
参考サイト
- NASA APIs
- PHPで日付入力:カレンダーから選択:ぱふぅ家のホームページ
- PHPでTwitter(現・X)に画像付きメッセージ投稿:ぱふぅ家のホームページ
- PHPでBlueskyに投稿する:ぱふぅ家のホームページ

そこで今回は、指定日の APOD(Astronomy Picture of the Day)画像および解説を取得し、画面に表示する PHPプログラムを作ってみることにする。NASA APIs の応答は英語であるため、翻訳APIを使って訳し、また、Twitter(現・X)や Bluesky に投稿できる機能を加えた。