月別アーカイブ: 2024年9月

Google Spread Sheetでデータベスを作る

GoogleSpreadSheetを元に、Mysqlのデータベースを作るプログラムを作ってみる

対応は

タイトル名 ー> データベース名

シート名 ー> テーブル名

シートの中は、

フィールド名

フィールドの型

コメント

データ

として、1列目に、上記内容を指定できる書式とする

フィールド名 ー> fieldname

フィールドの型 ー> fieldtype

テーブルのコメント ー> table comment

フィールドのコメント ー> fieldcomment

SQLのテンプレート -> template

データ ー> >

コメント ー> #

言語はPHP

データはGoogleSpreadSheet

取得方法はGoogleAPI

作成はMysql

とする

データの元となるGggleSpreadSheetを使って、閲覧許可にして置く

ID を、取得しておく

以下を参考にして

https://www.otsuka-bs.co.jp/web-creation/blog/archive/20230904-03.html

接続とタイトルの取得確認をする

シートの内容は、以下のような感じ

実データを書き込むと以下になる

fieldtypeを2行にしてみました

作成した、シートは閲覧許可にしておく

データを参照するプログラムは以下となる

では、

テーブル名と

フィールドの行を見つける

フィールドのタイプを見つける

Create文を作ってみる

フィールド名の位置はどは、ハードコーディングですが

これで、デーブルの作成と、データのインポートができました

一応数値が空の時の処理も、無事対応できているようです

あとは、一度にテーブルを読む込できるようにします

2回目で、不要なテーブルは先頭に-(マイナス)を付けておいて、スルーするようにしよう

また、テーブルをDropして、強制書き換えもできるが、必要なときには、機能を追加してみます

PHPでCSVファイルによりMysqlを更新

前回の続きで、PHPを使ってメールでアップロードしたCSVファイルでデータベースを更新する処理を作ってみます

行う内容としては

1,CSVファイルの解析

2,対象となるデータベース、テーブルの特定

3,データベースの更新(追加)

4,結果のレポート

となります

まず、CSVファイルの解析は

ファイルを開いて、データーの取得です

ファイルの大きさにもよるのですが

PHPには、CSVを読み込む関数があるので、それを使ってみる

また、1行目がフィールド名になっている事が多いので、

1行目は特別とします

データは、以下のような形式になります

ファイルを扱う場合、文字コードも意識しないと行けないのですが

文字化けに注意しながら進めてみる

ファイル名を

inp_file.csv

とすると

まずは、データベースを固定して

追加の文章を作ってみよう

insertとupdateがあるが全てinsertとしよう

ただし、以前にアップロードしたデータについては

除外することにする

1行目のヘッダーとカラムの対応表が必要になる

INSERT INTO テーブル名 (列名1, 列名2,…) VALUES (値1, 値2,…);

となるので、列名と値の対応が必要になる

列名を、ヘッダーに合わせて、順番を変更するか

あるいは、確定して、行く方法もあるが、順番は確定として

進めることにする

次に、重複を避ける方法として、レコードを特定するユニークなコードがあればいいが、必ずしもあるとは、限らないため

データの一致にて行うことにする

つまり、フィールドが全て、同じ場合は、見送りとし

カラムがわずかでも変わっていた場合には、新規に追加するものとする

INSERT INTO テーブル名 (列名1, 列名2,…) VALUES

まで、固定で、

(値1, 値2,…);

を、入力したデータにて変更するよになる

SQL文を、文字列で作成する方法もあるが、エラーチェックは、インジェクション処理などの処理を含まれた、処理を行う

データベース名
openbook

テーブル名
tp_gmo_corp

“日付”,”摘要”,”入金金額”,”出金金額”,”残高”,”メモ”

データベースへの書き込み(insert)はで行う

文字化けしたので

mb_convert_encoding($line,”utf-8″,”auto”)

を、追加した所、エラーとなった

sudo apt-get install php-mbstring

で、行ったが、やはりダメ

sudo apt install php7.4-mbstring

で、上手く行った

次は

could not find driver

のエラーになった

sudo apt-get install php7-mysql

では、読み込めなかったので

sudo apt-get install php7.4-mysql

で、解消した

これで、CSVに従って書き込んでいたら

数値カラムのInsertでエラーになった

$culum=””;

で、数値のカラムに入れるとエラーになる

””のときは、0に書き換える必要があるとると

カラムの属性情報も管理しないといけない

手抜きは、できないようである

まずは、ハードコーディングで、サンプルを書き込む所まで

行ってみる

ファイルを開けて、追加してみる

2つの処理を合体してみよう

これで、複数行の挿入ができた

次に、重複チェックを行う

既に登録済の行は登録しないようにする

行を特定する、カラムがないので、全てのカラムの一致で、除外するようにしてみる

一応できたが、データ依存性が大きいので、これをいかに、汎用化するか

まずは、ヘッダーにより、フィールドの定義を行う

これをもとに、前回のプログラムを書き換えてみます

重複検索のカラムの範囲と、挿入するカラムの範囲の処理はこれから

Stripのときには、不要なカラムが多いのと、ユニークカラムがあるので、この時に活用していく予定です

データディクショナリーは、Jsonに落として、外部にする事もできそうです

既存のデータを調べて、重複部分から、テーブルを特定する方法もあるが

当面は、この方法で

また、データディクションリーから、新規テーブルも作れるが

はじめの1回なので、後でいいかな

x-serverメールをトリガーにして、プログラムを起動

メールの活用して、情報の管理をすると、入力の場所が明確になって

わかりやすい

メールの内容を、プログラムで確認する方法として

メールの受信をトリガーにして、プログラムを起動する方法がある

以下のページを参考にして、作ってみた

・XSERVER : メール受信をトリガーにして処理を起動
https://raspi.ryo.sc/xserver-mail-trigger/

・メール受信をトリガーにして任意のプログラムを実行する
https://revolutionary.hatenablog.jp/entry/20090226/p1

・XSERVERのメールフィルタでメール転送してみよう
https://seous.info/jobs/internet/1553#google_vignette

・メール受信をトリガーにPHP発動(ネットオウル・ファイアバード)
https://ameblo.jp/tencommon/entry-11493595921.html

・メールの振り分け
https://www.xserver.ne.jp/manual/man_mail_sorting.php

まずは、簡単なプログラムとして

メール受信だけを、確認するために

PHPのプログラムで

ログファイルを書き出してみる

PHPのプログラムは

test.phpとして、logのフォルダーを作っておく

受取用のメールアカウントも作っておく

メールアカウントは

auto@xxxxxxxx.xsrv.jp

としておく

メールアカウントができたので、左のサイドメニューの「メールの振り分け」を選択

メールを送信して見るが、ログが吐き出さない

直接ブラウザから起動するとログを吐き出す

ログのパスをルートからのパスにしたら上手く行った

次は、せっかくメールで送られて来るので

メールの情報を取得してみよう

ページ
「メール本文を取得して本文を変更する」
https://revolutionary.hatenablog.jp/entry/20090312/p1

https://www.webdata.jp/tech/php02.php
【PHP】メールの受信

https://shiranuik.hatenablog.jp/entry/20100624/1277391796
メールを分解する。の解説。

http://www.aiwake.co.jp/modules/bulletin/index.php?page=article&storyid=4
PHP : 受信メールの添付ファイルを保存する

https://qiita.com/ga_ku/items/2f2640905f91aeb82d6c
受信したメールをPHPで解析してDBに格納する

などを参考に
PEARを使って、メールの内容を取得してみる

これで、メールの内容が取得できた

添付ファイルを、取得して、格納したいが、ファイル名の取得が必要

これで、取得できた

行いたいのは、csvのファイルを、複数添付したものを、取得し処理したい

(dbへの追加アップロード)

どんなないよか調べてみる

内容を確認すると

ファイル名は

でいけるはずだが、取り込めない

四苦八苦したあと

で、取り込めた

複数の添付ファイルを付けても、処理をしてくれた

後は、一連の操作の中で、DBへ書き込む処理を追加していく

ネット銀行(GMOあおぞら銀行)や、Stripeなどから、CSVをダウンロードして、メールで添付すると、自動的に、月次決算を集計するものにしていきたい

当面、自分だけで使うので、セキュリティ要件は緩めになっています

chatworkの投稿データをAPIで取得

Chatworkでのやり取りを使って

モチベーション(やる気)を出すために

案件の簡単な進捗管理を作ってみたく思った

ChatWorkのデータを取得してみよう

チャットワークでAPIで投稿内容を取得する

ttps://developer.chatwork.com/docs/getting-started

Chatwork画面右上の「利用者名」をクリックして表示されるメニューの「サービス連携」を選択してください。
サービス連携画面が開きますので、左側のメニューから「APIトークン」を選択してください。とのこと

まずは、APIトークンの取得する

APIの動作確認には、まずは、Curlがお勧めなので

ttps://qiita.com/n0bisuke/items/25813fba8120451d40da

を、参考に

curl -X GET -H “X-ChatWorkToken: 自分のAPIトークン” “https://api.chatwork.com/v1/rooms/{room_id}/messages?force=0”

ルームIDがあれば、チャンネルのルームの情報が取得できそう

{room_id}
は、
チャンネルを開いた時の
https://www.chatwork.com/#!rid36010xxxx
idのあとの数字(現在は9桁)

まずは、curlで、投げてみる

curl -X GET -H “X-ChatWorkToken: 自分のAPIトークン” “https://api.chatwork.com/v1/rooms/{room_id}/messages?force=0”

{“errors”:[“Chatwork API v1 is now obsolete. Please use the latest version.”]}

で、怒られた

ttps://developer.chatwork.com/reference/get-rooms-room_id-messages

本家で調べたら

ttps://api.chatwork.com/v2/rooms/{room_id}/messages

との事

v2でないと、行けないよう

curl -X GET -H “X-ChatWorkToken: 自分のAPIトークン” “https://api.chatwork.com/v2/rooms/{room_id}/messages?force=0”

よっしゃ!!つながった。



Jsonは、ブラウザで解析ができるので

curl -X GET -H “X-ChatWorkToken: 自分のAPIトークン” “https://api.chatwork.com/v2/rooms/{room_id}/messages?force=0″ > chatwork.json

と、jsonの拡張子で吐き出して

ChromeでなくFireFoxで表示しましょう。

見れた。


投稿の100件が取り込めている

これで行けそう

タイムスタンプが send_timeが10桁の数字
これを変換ししないと

これが、投稿時刻の年月日時分のはず


Googleで
chatwork api timestamp
で、検索

ttps://freeelover.com/2022/09/gas/gas%E6%B4%BB%E7%94%A8%E6%B3%95/1130/
ttps://www.shanaidx.com/chatwork_task/
// limit = new Date(json[i].limit_time * 1000 );   // UNIXTIMEを変換してdateにセット

こんなのがあったので、UNIXTIMEというものか?

Googleで
UNIXTIME から 日付に PHP
で、検索

ttps://onga-tec.hatenadiary.jp/entry/2016/08/19/PHP_unixtime%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%97%A5%E4%BB%98%E3%81%AE%E5%A4%89%E6%8F%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88

にあったので、
これで、行きそう。

PHPで、直接確認するために

Googleで
コマンドラインで PHP を実行
で、検索

ttps://www.php.net/manual/ja/features.commandline.usage.php

php -r ‘print_r(get_defined_constants());’
こんなことできるんだ

php -r ‘echo time();’
1725521712

php -r ‘echo date(‘Y/m/d H:i:s’, time());’

エラーになった

’が重なったら、ダメですね

php -r “echo date(‘Y/m/d H:i:s’, time());”

表示してくれた

APIで取り込んだデータも

10桁なので、そのままいけそう

取り込んだ、データで、変換してみる

php -r “echo date(‘Y/m/d H:i:s’, 1725106055);”

上手く行った

準備ができたので、まずは

PHPを使って、結果を、GoogleSpreadSheetに貼り付けるものを、作って行こう

それから、データベース(Mysql)へ、吐き出すプログラムをPHPで作って、進捗管理に使って行こうと思う

とりあえず、吐き出したJsonを使って、CSVを書き出してみた。

これで、ExcelやGoogleSpreadSheetには、読み込める

2回目の呼び出しは

forceintegerDefaults to 0

forceはドキュメントより

強制的に最大件数まで取得するかどうか。
0を指定した場合(既定)は前回取得分からの差分のみを返しますが、1を指定した場合は強制的に最新のメッセージを最大100件まで取得します。

の引数は0だと、前回の続きなので、繰り返すと返信がなくなる

返信がない場合、1にするといい

余談ですが

Unixtime
1970年からの経過秒数
なんだ。。

php -r “echo date(‘Y/m/d H:i:s’, 9999999999);”

2286/11/21 02:46:39

260年後には、大騒ぎになるのかな?

残念ながら、そこまでは、生きて、立ち会うことは、少し難しそうですが。