MIGITOのコードメモ

浮かんだいろんなことをメモしたり、考えたことを綴ったり

PHPでスクリーンショットをとる(Windows限定)

PHPスクリーンショットを撮る方法を探しているのだけれども。目的はURLを入れるだけで自動的にサイトのスクリーンショットを撮ってきて保存するっていうものなんだけど。

あまり役に立たなそうだけど、Windowsの場合はPHPで簡単にスクリーンショットを取れる、だがこれは役に立つのだろうか?

<?php
$im = imagegrabscreen();
imagepng($im, "myscreenshot.png");
imagedestroy($im);
?>

なので、ブラウザをPHPから操作してキャプチャするとかじゃないと使えないかな

一応ChromeとかをWindowsコマンドラインからURL引数付きで起動する事が出来るみたいだが、ちゃんと表示しきった後にキャプチャできているのかとか色々難しそう。完成したらなかなか使えるツールにはなると思う

 

参考ページ http://php.net/manual/ja/function.imagegrabscreen.php

MySQL で重複関係の処理

特定のカラムで重複なしでリストアップ

SELECT MIN(他のカラム),対象のカラム
FROM テーブル名
GROUP BY 対象のカラム
ORDER BY 1,2

 

必要なカラムだけ取り出す仕組み

 

 

特定のカラムで重複なしでリストアップ 絞り込み無し

SELECT * FROM 対象のテーブル
GROUP BY 対象のカラム

 

上のコードの余分な部分を取り除いたもの

 

 

特定のカラムで重複があれば、一つだけ残して他を消す

CREATE TABLE テーブル2 as SELECT * FROM テーブル GROUP BY カラム;
DROP TABLE テーブル;
ALTER TABLE テーブル2 RENAME TO テーブル;

 

 

特定のカラムで重複なしで抽出して、その抽出したものを別名のテーブルにコピーして。元のテーブルを消し、コピーを元のテーブルの名前にする。

DBとの重複チェック用のメモ

//スクリーンネームからDBでフィルタリングして最近のを取得
$sql = $pdo ->prepare("SELECT * FROM ".$db_table." WHERE user = '".$name."' ORDER BY id DESC LIMIT 0, 100");
$sql->execute();
$result = $sql->fetchAll(PDO::FETCH_ASSOC);

foreach ($result as $value) {
  $img_db[$value["img"]] = "";
}

$new_lists = array_diff_key( $new_lists , $img_db );

 

 

DBの内容と新たに取得した情報を配列のキーで比較して、重複部分を取り除く

[PHP]アメブロのRSSをつかって、記事内の画像を自動で収集するプログラムを作る ロジック編

今、あるプログラムを作成中。

PHPで作成中なんですが、アメブロRSSを指定するだけでRSSから最新記事を取得して、記事から画像のURLを取得して保存するっていうプログラムを作ってる

 

いまは、ダウンロードして保存まで完了

さらに、重複防止のシステムも作った。データベースは使わずに テキストファイルに配列を保存する形で。データベース代わりに使って行ってい。

 

 

とりあえず作るにあたって考えたロジックを紹介

 

記事のURLを取得する処理

取得済みのURLリストを読込 これを【A】とする

RSSのリストから、記事リストを取得し これを【B】とする

【A】と【B】を比較して、重複を取り除く それを【C】とする

【C】が空ならば処理を終了し exitする

【A】と【C】を結合して 【A】とする

【A】を配列のままテキストにシリアライズして保存する

 

 

画像のURLを取得する処理

保存済みの画像URLリストを読み込む これを【D】とする

【C】のリストを使ってHTMLにアクセスして画像のタグを抽出して画像のURLを取得しリストにする これを 【E】とする

【E】からアイコン等の不要な画像URLを取り除いたリストにする これを【F】とする

【D】と【F】を比較して重複を取り除く それを【G】とする

【G】がからなら、処理を終了する exitする

【D】と【G】を結合して【D】とする

【D】を配列のままテキストにしてシリアライズして保存する

 

 

 

画像のダウンロードの処理

ダウンロード先のディレクトリのファイルの一覧を取得するして それをキーに入れて配列を作る これを 【H】とする

【G】の画像のURLからファイル名取得しキーにファイル名、値にURLとした配列にする これを【I】とする

【I】と【H】のキーを比較して重複を取り除く それを【J】とする

【J】を元にfoeachを回して、ファイル名にキー、開くファイルにURLをして画像をダウンロードする

完了。

 

 

こんな感じです。

まだまだ、途中で、小さい画像を排除するシステムの導入もしたいし

画像を解析して、重複画像を取り除く機能も追加したい。

他には、縦長の画像、横長の画像でフォルダを振り分け。

 

 

今のところ、Windowsのローカルで作っているので

CRONが無いので、代わりに タスクスケジューラを使って1日一回実行するようにしている

 

 

 

PHPの本とか読まずに、ネットにある情報とPHPの時点みたいなサイトを使って調べて作れた。

まだまだしょぼいものだけど、作れたことにかなり自信がついてきた!

 

作った自作システムはこれで3目、今回が最も複雑

次はもっと複雑なのプロジェクトを作りたいなっと。

windows7で定期的にPHPをCRONの代わりにタスクスケジューラで実行する

タスクスケジューラ使うとPHPを定期的に実行できる

LinuxならCRONなんだけど、windowsだとタスクスケジューラ MACはしらない

 

必要な設定項目は

PHPプログラムへのパス Windows版を指定すればコマンドプロンプトが非表示で動くらしい

あとは、ファイル名とファイルのパスを設定すれば良い

 

一応試しに動かしてみたけど、ちゃんと動いた

あと正常に終了したら、そういうのもステータスでチェックできる

取得しようとしたHTMLが404だった時の処理

<?php
    $html = @file_get_contents('http://t-szk.com/hoge.html');
    
    if($http_response_header[0] == 'HTTP/1.1 404 Not Found'){
        print '404 Not Foundです。';
    }
?>

file_get_content をすると。ヘッダーがその後に帰ってくるみたいで、それで条件分岐すれば404なのかどうかをチェックすることが出来る。

あと file_get_contet の頭に@マークをつけると。 取得できなかった時のエラーを非表示にすることが出来る。

URLからファイル名を取得する

画像のダウンロードを行うときに、ファイルを保存するときに名前は元の名前を付けたいので、URLから名前を取得する

$name = basename($value);
$data = file_get_contents($value);
file_put_contents('./download/'.$name,$data);

$valueには画像のURLを

 

画像のURLを配列にいれて、foreeachで回せば。次々に画像がダウンロードして保存できる。

画像のURLリストは、RSSから記事URLを取得して、パーサーで記事から画像のURLを抽出すれば自動化出来る。