旅モバ

旅、モバイル、サーバ関連(Linux,FreeBSD)、クラウド・Webサービス、その他PCの話題など。

スポンサードリンク

JP-Secure SiteGuard Lite (SiteGuard Server Edition)の管理コンソールのパスワードをリセットする

JP-Secure SiteGuard Lite(SiteGuard Server Edition)の管理コンソール(WebUI)のユーザー名やパスワードを忘れてログイン出来ない場合は、以下の方法で認証情報をリセットすることができます。

# cd /opt/jp-secure/siteguardlite/conf
# cp siteguardlite.htdigest.org siteguardlite.htdigest
# service siteguardlite_admin restart

上記実行後、 https://<SiteGuardのIPアドレスまたはホスト名>:9443/ へアクセスすると、デフォルトのユーザー名(admin)とパスワード(admin)でログインすることができます。 ログイン後、ユーザー名とパスワードの再設定を求められ、各設定を変更することが出来ます。

ユーザー名やパスワードを設定または変更後に設定したはずの認証情報で認証が行えない、前任者の引き継ぎ漏れや情報の記録漏れにより認証情報が無い場合にお試しください。

Qiitaの記事を順次移行します。

タイトルの通り、徐々にQiitaから本Blogへ記事を移行していきます。

最近Qiitaでは、以下の問題が話題となりました。

www.itmedia.co.jp

最近のQiitaは「俺の作った最強のシステム」的な危うさや、「こんな機能作った俺すごい、どや」的な意識高い系エンジニアや、内輪の自己満足でサービスがリリースされている雰囲気があります。

もちろんその機能がユーザーのメリットに寄与するものであるならそれでも良いでしょう。しかし、逆にユーザーのセキュリティやプライバシーなどを危険に晒したり、ユーザーに不信感を与えるものとなっています。また、このような機能がそのままリリースされたことに不安を感じました(誰も疑問に感じなかったの?チェックしなかったの?という点で)。

これまでも、「いいね」が「LGTM」になった時に若干の違和感を感じていましたが、今回の件により、安心してQiitaを使い続けられないし、これ以上Qiitaを使い続けるのは難しいと感じました。

ということで、ぼちぼち移行を進めていきます。ご不便をお掛けしますが、よろしくお願いいたします。

ようやくAOSSL対応完了

久しぶりのBlog投稿となります。
はてなブログのAOSSL(サイトの常時SSL化)対応がものすごく面倒で放置していました。(あとは公私ともに多忙を極めていたというのも)

APIを利用して、はてなブログのMixed Content対応や文字列置換を簡単に行えるツールがあったので、それを使って対応しました。非常にありがたい。
smdn.jp

ということで、これまで「保護されていないコンテンツ」と表示されていた問題も解消され、本日から本BlogもAOSSL対応です。
あとは、10年くらい前から変わらないこのレイアウトを近々変えたいと思います。

jQuery+Colorboxでaタグ無しで画像のモーダル表示を実現する簡単な方法

※Qiitaからの移行記事となります

画像のモーダル表示のためにLightbox系のライブラリの使い方を検索してみると、モーダル表示したい画像のimgタグをaタグで囲むようなものばかりが検索結果として出てきます。

しかし、CMS等の環境の制約によりaタグでimgタグを囲めない場合や、メンテナンス効率の低下を避けるためにaタグでimgタグを囲みたくない(aタグとimgタグの両方をメンテナンスしたくないし、それ以前に入力が面倒なのでやりたくない)場合があると思います。

そのような場合は、JavaScriptで画像(img)のクリックイベントを取得し、クリックされた画像のsrcを取得し、その値をColorboxのようなモーダル表示時に表示させる画像のリンク先(パス、URL)を指定可能なライブラリへ受け渡すことで、imgタグをaタグで囲むことなく、画像のモーダル表示を行うことができます。

※事前にjQueryとColorboxのファイル一式を用意(アップロード)しておきます。

<script src="/lib/jquery/jquery.min.js"></script>
<script src="/lib/jquery/jquery-migrate.min.js"></script>
<script src="/lib/colorbox/jquery.colorbox-min.js"></script>
<link rel="stylesheet" href="/lib/colorbox/example4/colorbox.css" media="all">
<script type="text/javascript">
$(document).ready(function() {
    $("#content img").css("cursor","pointer");
    $("#content img").click(function() {
        $.colorbox({href:this.src});
        return false;
    });
});
</script>

関連URL

PHPでmkdir時に4桁のパーミッションを文字列型の変数の値より指定するには

※Qiitaからの移行記事となります

PHPのmkdir関数でディレクトリを作成する際に8進数4桁のパーミッションを指定する場合、mkdir関数の第2引数へ

mkdir('/var/dat/hogefuga', 0755, true);

のような形で指定することで、0755(rwxr-xr-x)というパーミッションのディレクトリが作成されます。

変数でセットする場合も、

$perm = 0755;
mkdir('/var/dat/hogefuga', $perm, true);

とすることで、上記と同様のパーミッションでディレクトリを作成することができます。

しかし、変数が文字列型である場合、例えば

$perm = '0755';
mkdir('/var/dat/hogefuga', $perm, true);

である場合、0755(rwxr-xr-x)とならず(例えば、-wxr---tのようになり)、意図したパーミッションとならない場合があります。

変数が文字列型であるケースとしては、Webシステムから送信された値や、DBやAPI、ファイル等から取得した値を使用するケースが挙げられます。

原因

文字列型の値は、10進数の数値として扱われます。つまり、0755(8進数)ではなく、755(10進数)として扱われます(先頭の0は無視されます)。 これにより、意図したパーミッションでディレクトリを作成することが出来ません。

対応

octdec関数で文字列型を8進数の整数へ変換することで、この問題を解消することができます。

<?php
$perm = '0755';
$mydir = '/var/dat/hogefuga';

mkdir($mydir, octdec($perm), true);

参考

ApacheでFilesやFilesMatchが反映されない問題とその原因

※Qiitaからの移行記事となります

Apacheのconfにはデフォルトで次のような記述があり、通常は.htaccessなどが見えてしまうことはありませんが、設定によっては.htaccessファイルが丸見えになってしまう(FilesやFilesMatchの設定が無視される)場合があります。

<Files ".ht*">
    Require all denied
</Files>

例えば、次のような設定が行われていると、FilesやFilesMatchの設定が評価されず、.htaccessが見えてしまう原因となります。

<Location "/">
        <RequireAll>
                Require all granted
                Require not ip 192.168.0.0/24
                Require not ip 192.168.1.0/24
                Require not ip 192.168.2.0/24
        </RequireAll>
<DirectoryMatch>

原因

ディレクティブには優先順があります。

<Directory>  <   <Files>   <   <Location>

上記のように種類の異なるセクションが混在し、かつセクション同士で一部あるいは全部の条件が重複する場合は、優先度の高いセクションの内容が評価されます。つまり、<Files>よりも<Location "/"> の優先度が高いため、<Files>が評価されない問題が発生します。

そして、設定は記述順(上から順)に評価されるとは限らず、<Files><Location>の前に持ってこようが、後ろに持ってこようが結果は変わりません。

対応

Locationを使わず、DirectoryやDirectoryMatchを使います。 Locationはトラブルになりやすいため、なるべくLocationを使用しない運用とすることが望ましいといえます。

<Directory "/var/www/html">
        <RequireAll>
                Require all granted
                Require not ip 192.168.0.0/24
                Require not ip 192.168.1.0/24
                Require not ip 192.168.2.0/24
        </RequireAll>
<Directory>

参考

RHEL7でyum update 時にPHP5.4がアップデート出来ない場合の対応

RedHat Enterprise Linux 7(RHEL7)で、yum updateしようとした際に次のようなメッセージが表示され、php5.4のアップデートに失敗する場合があります。

# yum update
読み込んだプラグイン:langpacks, product-id, search-disabled-repos, subscription-manager
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ php.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-cli.x86_64 0:5.4.16-46.el7 を 更新
--> 依存性の処理をしています: php-cli(x86-64) = 5.4.16-46.el7 のパッケージ: php-devel-5.4.16-46.el7.x86_64
---> パッケージ php-cli.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-common.x86_64 0:5.4.16-46.el7 を 更新
--> 依存性の処理をしています: php-common(x86-64) = 5.4.16-46.el7 のパッケージ: php-mbstring-5.4.16-46.el7.x86_64
---> パッケージ php-common.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-gd.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-gd.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-mysql.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-mysql.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-pdo.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-pdo.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-process.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-process.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-xml.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-xml.x86_64 0:5.4.16-46.1.el7_7 を アップデート
---> パッケージ php-xmlrpc.x86_64 0:5.4.16-46.el7 を 更新
---> パッケージ php-xmlrpc.x86_64 0:5.4.16-46.1.el7_7 を アップデート
--> 依存性解決を終了しました。
エラー: パッケージ: php-devel-5.4.16-46.el7.x86_64 (@rhel-7-server-optional-rpms)
             要求: php-cli(x86-64) = 5.4.16-46.el7
            削除中: php-cli-5.4.16-46.el7.x86_64 (@rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-46.el7
            次のものにより更新された: : php-cli-5.4.16-46.1.el7_7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-46.1.el7_7
            利用可能: php-cli-5.4.16-21.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-21.el7
            利用可能: php-cli-5.4.16-23.el7_0.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0
            利用可能: php-cli-5.4.16-23.el7_0.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0.1
            利用可能: php-cli-5.4.16-23.el7_0.3.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0.3
            利用可能: php-cli-5.4.16-36.el7_1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.el7_1
            利用可能: php-cli-5.4.16-36.1.el7_2.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.1.el7_2.1
            利用可能: php-cli-5.4.16-36.3.el7_2.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.3.el7_2
            利用可能: php-cli-5.4.16-42.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-42.el7
            利用可能: php-cli-5.4.16-43.el7_4.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-43.el7_4
            利用可能: php-cli-5.4.16-43.el7_4.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-43.el7_4.1
            利用可能: php-cli-5.4.16-45.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-45.el7
エラー: パッケージ: php-mbstring-5.4.16-46.el7.x86_64 (@rhel-7-server-optional-rpms)
             要求: php-common(x86-64) = 5.4.16-46.el7
            削除中: php-common-5.4.16-46.el7.x86_64 (@rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-46.el7
            次のものにより更新された: : php-common-5.4.16-46.1.el7_7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-46.1.el7_7
            利用可能: php-common-5.4.16-21.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-21.el7
            利用可能: php-common-5.4.16-23.el7_0.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0
            利用可能: php-common-5.4.16-23.el7_0.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0.1
            利用可能: php-common-5.4.16-23.el7_0.3.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0.3
            利用可能: php-common-5.4.16-36.el7_1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.el7_1
            利用可能: php-common-5.4.16-36.1.el7_2.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.1.el7_2.1
            利用可能: php-common-5.4.16-36.3.el7_2.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.3.el7_2
            利用可能: php-common-5.4.16-42.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-42.el7
            利用可能: php-common-5.4.16-43.el7_4.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-43.el7_4
            利用可能: php-common-5.4.16-43.el7_4.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-43.el7_4.1
            利用可能: php-common-5.4.16-45.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-45.el7
**********************************************************************
yum can be configured to try to resolve such errors by temporarily enabling
disabled repos and searching for missing dependencies.
To enable this functionality please set 'notify_only=0' in /etc/yum/pluginconf.d/search-disabled-repos.conf
**********************************************************************

--> トランザクションの確認を実行しています。
---> パッケージ kernel.x86_64 0:3.10.0-693.5.2.el7 を 削除
---> パッケージ kernel-devel.x86_64 0:3.10.0-693.5.2.el7 を 削除
---> パッケージ php-cli.x86_64 0:5.4.16-46.el7 を 更新
--> 依存性の処理をしています: php-cli(x86-64) = 5.4.16-46.el7 のパッケージ: php-devel-5.4.16-46.el7.x86_64
---> パッケージ php-common.x86_64 0:5.4.16-46.el7 を 更新
--> 依存性の処理をしています: php-common(x86-64) = 5.4.16-46.el7 のパッケージ: php-mbstring-5.4.16-46.el7.x86_64
--> 依存性解決を終了しました。
エラー: パッケージ: php-devel-5.4.16-46.el7.x86_64 (@rhel-7-server-optional-rpms)
             要求: php-cli(x86-64) = 5.4.16-46.el7
            削除中: php-cli-5.4.16-46.el7.x86_64 (@rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-46.el7
            次のものにより更新された: : php-cli-5.4.16-46.1.el7_7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-46.1.el7_7
            利用可能: php-cli-5.4.16-21.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-21.el7
            利用可能: php-cli-5.4.16-23.el7_0.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0
            利用可能: php-cli-5.4.16-23.el7_0.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0.1
            利用可能: php-cli-5.4.16-23.el7_0.3.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-23.el7_0.3
            利用可能: php-cli-5.4.16-36.el7_1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.el7_1
            利用可能: php-cli-5.4.16-36.1.el7_2.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.1.el7_2.1
            利用可能: php-cli-5.4.16-36.3.el7_2.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-36.3.el7_2
            利用可能: php-cli-5.4.16-42.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-42.el7
            利用可能: php-cli-5.4.16-43.el7_4.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-43.el7_4
            利用可能: php-cli-5.4.16-43.el7_4.1.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-43.el7_4.1
            利用可能: php-cli-5.4.16-45.el7.x86_64 (rhel-7-server-rpms)
                php-cli(x86-64) = 5.4.16-45.el7
エラー: パッケージ: php-mbstring-5.4.16-46.el7.x86_64 (@rhel-7-server-optional-rpms)
             要求: php-common(x86-64) = 5.4.16-46.el7
            削除中: php-common-5.4.16-46.el7.x86_64 (@rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-46.el7
            次のものにより更新された: : php-common-5.4.16-46.1.el7_7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-46.1.el7_7
            利用可能: php-common-5.4.16-21.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-21.el7
            利用可能: php-common-5.4.16-23.el7_0.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0
            利用可能: php-common-5.4.16-23.el7_0.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0.1
            利用可能: php-common-5.4.16-23.el7_0.3.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-23.el7_0.3
            利用可能: php-common-5.4.16-36.el7_1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.el7_1
            利用可能: php-common-5.4.16-36.1.el7_2.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.1.el7_2.1
            利用可能: php-common-5.4.16-36.3.el7_2.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-36.3.el7_2
            利用可能: php-common-5.4.16-42.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-42.el7
            利用可能: php-common-5.4.16-43.el7_4.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-43.el7_4
            利用可能: php-common-5.4.16-43.el7_4.1.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-43.el7_4.1
            利用可能: php-common-5.4.16-45.el7.x86_64 (rhel-7-server-rpms)
                php-common(x86-64) = 5.4.16-45.el7
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest

原因

rhel-7-server-optional-rpms リポジトリ(チャンネル)がenableでないと、当該事象が発生します。 上記リポジトリがenableであるかどうかは、yum repolistコマンドで確認することができます。

以下のような状態である(rhel-7-server-optional-rpmsがenableである)場合は、当該事象は発生しません。 rhel-7-server-optional-rpmsが結果に表示されない場合は、当該事象が発生する可能性があります。

# yum repolist
読み込んだプラグイン:langpacks, product-id, search-disabled-repos, subscription-manager
リポジトリー ID                                                   リポジトリー名                                                              状態
rhel-7-server-optional-rpms/7Server/x86_64                        Red Hat Enterprise Linux 7 Server - Optional (RPMs)                         19,656
rhel-7-server-rpms/7Server/x86_64                                 Red Hat Enterprise Linux 7 Server (RPMs)                                    27,011

対応

以下のコマンドを実行し、rhel-7-server-optional-rpmsリポジトリを追加します。

subscription-manager repos --enable rhel-7-server-optional-rpms

注意点

optionalリポジトリは、RHELのサポート対象ではない(RedHatのグローバルサポートサービスを受けられない)ため、導入に際しては注意が必要です。 https://access.redhat.com/ja/solutions/4387631

Red Hat では、Red Hat/Red Hat JBoss 製品の機能に加えて、お客様の利便性を向上させるソフトウェアパッケージ (RPM) を追加で提供しています。これらのソフトウェアパッケージには、オープンソースライセンスのソフトウェア (「Optional」Red Hat Network チャンネル) および商用ライセンスのソフトウェア (「Supplementary」Red Hat Network チャンネル) があります。Optional および Supplementary チャンネルのソフトウェアパッケージはサポート対象ではなく、ABI の保証も適用されません。

RHELでoptionalリポジトリに属するPHPパッケージは次のとおりです。

  • php-bcmath
  • php-devel
  • php-embedded
  • php-enchant
  • php-dba
  • php-fpm
  • php-intl
  • php-mbstring
  • php-mysqlnd
  • php-pspell
  • php-snmp

参考

MODx Evolutionのエレメントをファイル出力する

MODx Evolutionは、CMSとしても、ライトなWebアプリケーションフレームワークとしても使い勝手が良いのですが、エレメントの管理に常に悩まされます。エレメント(テンプレート、テンプレート変数、チャンク、スニペット、プラグイン)は管理画面上から手軽に追加・編集可能な利点がある反面、DB上でコードが管理されているのでバージョン管理やコードの比較、バックアップがしづらい等、そのような問題がメンテ時の欠点として出てきます。(手軽さとメンテのしやすさはトレードオフの関係です)

そこで、コードを出力してファイルとして管理できるようにしました。ざっくりと書いた感じなので、調整が必要な場合もあるかも知れませんが、これによってメンテが少しでも楽になれば。。

コード

<?php

$dbname = 'DB名';
$dbhost = 'DBホスト(FQDN or IP)';
$dsn = 'mysql:dbname=' . $dbname . ';host=' . $dbhost;
$user = 'ユーザー名';
$password = 'パスワード';

$dbo = new PDO($dsn, $user, $password);
$dbo->query('set names UTF8');

$base_dir = dirname(__FILE__);

$prefix = 'modx_'; // MODxテーブルプレフィックス
$tables = [
        'site_snippets',
        'site_templates',
        'site_tmplvars',
        'site_modules',
        'site_plugins',
        'site_htmlsnippets',
];

foreach ($tables as $table) {
        $sql = 'select * from ' . $prefix . $table . ';';
        $my_dir = $base_dir . '/' . $table;
        mkdir ($my_dir, 0755);

        foreach ($dbo->query($sql)->fetchAll(PDO::FETCH_ASSOC) as $row) {
                $tmp = $row;
                unset($tmp['id']);
                switch ($table) {
                        case 'site_snippets':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['name']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.php', $row['snippet']);
                                break;
                        case 'site_templates':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['templatename']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.html', $row['content']);
                                break;
                        case 'site_tmplvars':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['name']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.html', $row['elements']);
                                break;
                        case 'site_modules':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['name']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.php', $row['modulecode']);
                                break;
                        case 'site_plugins':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['name']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.php', $row['plugincode']);
                                break;
                        case 'site_htmlsnippets':
                                $filen_base = '/' . str_replace(' ', '_', $tmp['name']);
                                file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
                                file_put_contents($my_dir . $filen_base . '.html', $row['snippet']);
                                break;
                }
        }
}

Python3とSeleniumとGoogle ChromeでWebページのスクリーンショットはSelenium-Screenshotが便利です

Python 3とSeleniumとGoogle ChromeでWebページのスクリーンショットを取得する方法の1つとして、Selenium標準の save_screenshot メソッドを使う方法がありますが、この方法の場合、指定されたサイズ(ウインドウサイズ)のスクリーンショットを取得することはできますが、Webページ全体のスクリーンショットを取得することはできません。

Googleで検索してみると、色々な方法がヒットしますが、最も簡単で、かつ再利用性の高い方法は、Selenium-Screenshotパッケージを使う方法です。Selenium-Screenshotパッケージを使用すると、簡単にWebページ全体のスクリーンショットや、HTML要素を指定したスクリーンショットを取得することができます。

インストール

1.Python3のダウンロードとインストール

Windowsの場合は、下記URLよりインストーラーをダウンロードしてインストールする方法が簡単です。 https://www.python.jp/

LinuxやMac, FreeBSDなどでは、パッケージマネージャからインストールします。 例えば、Ubuntu 18.04LTSの場合はちょっと古いですが(実行時にDeprecatedが出るかも知れませんが)以下が参考になるでしょう。 Ubuntu 18.04LTSとchromium-browser(Headless)とpython3でSeleniumする

Pythonのバージョン複数分けて使いたい場合は、pythonbrewのようなvirtualenvっぽい何かを利用したり、Dockerで環境を分けるのが良いでしょう。

2.パッケージのインストール

seleniumと、Selenium-Screenshotパッケージをインストールします。

pip install selenium
pip install Selenium-Screenshot

3.ChromeDriverのダウンロード

下記URLより、自分の環境(Chromeのバージョン)に合ったChromeDriverをダウンロードします。 https://chromedriver.chromium.org/downloads

なお、Windows以外でパッケージマネージャよりSeleniumをインストールした場合は、パッケージマネージャよりChromeDriverをインストール出来る場合があります。その場合は、特別な事情(パッケージマネージャよりインストールされるものが満足に動作しない、機能が足りない等)を除き、可能な限りパッケージマネージャよりインストールされるものを使用するのが良いでしょう。

コード例

以下はWindowsで、https://www.asahi.com/ のスクリーンショットを取得する例です。 なお、ChromeDriver(chromedriver.exe)はPythonスクリプトと同じフォルダ(ディレクトリ)にあることを、ここでは想定しています。 環境に合わせて、executable_path(ChromeDriverのパス)を変更することで、Windowsに限らず他のOSでも動作します。

from Screenshot import Screenshot_Clipping
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')

ob=Screenshot_Clipping.Screenshot()
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe", options=options)
driver.set_window_size(1280, 720)

driver.get("https://www.asahi.com/")
ob.full_Screenshot(driver, save_path=r'.', image_name='Myimage.png')

driver.close()
driver.quit()

上記Pythonスクリプトを実行すると、Myimage.pngというファイル名でスクリーンショット画像が出力されます。 その画像を開くと、以下のようにWebページ全体のスクリーンショットを確認することができます。 f:id:tabimoba:20200402021843p:plain

参考