Help us understand the problem. What is going on with this article?

【Java】URLを入力するとそのページが使っているWordPressのテーマ名を表示するプログラムを作ってみた

はじめに

28歳業界未経験、プログラミング素の人です。

Qiita初投稿!!

現在Javaの研修を受けているので学んだことの備忘録として、
あと同じプログラミング初心者の方々のお役に少しでも立てればと思いQiitaに投稿することにしました。

お見苦しい点多々あるかと思いますが、生暖かい目で見てやってください。

この記事について

webページ見てたら「このサイトwordpress使ってんのかな?」「何のテーマ使ってるんやろ?」って思うことが結構あるので、勉強がてら自分なりにJavaで書いてみました。
コマンド上で動く、ブラウザからURLをコピペして実行するだけで結果が表示される簡単な奴です。

方法を考える

HTMLソースコードの<head>内にwp-contentという文字列が含まれているかでWordPressを使っているかチェックします。
テーマ名はwp-content/themes/の後に書かれているので、ソースコード内の一番初めに出てくるwp-content/themes/の部分を取得すれば分かりそうです。

html取得 → Listに代入 → for文で一行ずつチェック

という流れでやってみました。

サンプルコード

Sample.java
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

public class Sample {
    private List<String> contents;
    private final String CHARSET = "UTF-8";

    public static void main(String[] args) {
        String inputUrl = "";
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        Sample sample = new Sample();

        try {
            inputUrl = reader.readLine();
            sample.addContents(inputUrl);
            sample.checkWordpress();
        } catch (IOException e) {
            System.out.println(e);
        }
    }

    // 指定したページがWordpressを使っているか確かめるメソッド
    public void checkWordpress() {
        boolean WpCheck = false;

        for (String content : getContents()) {
            // headタグ内に "wp-content/themes/" が含まれているかで判定
            if (content.contains("wp-content/themes/") == true) {
                int idx = content.indexOf("wp-content/themes/");
                String line = content.substring(idx + 18); // "wp-content/themes/"以降の文字列
                idx = line.indexOf("/"); // テーマ名直後の "/" のインデックス番号
                System.out.println("\nテーマ名 : " + line.substring(0, idx)); // テーマ名を出力
                WpCheck = true;
                break;
            }
        }
        if (WpCheck == true) {
            System.out.println("Wordpressを使っています。\n");
        } else {
            System.out.println("\nWordpressは使われていません。");
        }
    }

    // 指定されたURLのソースコードを取得するメソッド
    public List<String> download(String url, String charset) throws Exception {

        URLConnection conn = new URL(url).openConnection();
        InputStream is = conn.getInputStream();

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(is, charset))) {
            ArrayList<String> lineList = new ArrayList<String>();
            String line = null;
            while ((line = reader.readLine()) != null) {
                lineList.add(line);
            }
            return lineList;
        }
    }

    // ダウンロードしたソースコードをListに代入するメソッド
    public void addContents(String url) {
        try {
            this.contents = download(url, getCharset());
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("無効なURLです。");
            System.exit(0);
        }
    }

    public List<String> getContents() {
        return this.contents;
    }
    public String getCharset() {
        return this.CHARSET;
    }
}



【実行結果】
qiita.png

試しに「lightning」の公式ページのURLを指定しました。
テーマ名が取得できました。

解説

標準入力でURLを指定して、http通信で取得したhtmlソースコードをListに代入しています。
checkWordpressメソッドで、Listに代入したhtmlソースコードを一行ずつfor文でチェックします。
if文で"wp-content/themes/"がソースコードに含まれているか判定。
"wp-content/themes/"のインデックス番号を取得。
テーマ名を取得したいので、"wp-content/themes/"の文字数(18文字)を足したインデックス番号以降の文字列を取得。
テーマ名直後の "/" のインデックス番号を取得して、0番目から"/"までの文字列を抜き出せばテーマ名が分かります。

最後に

もっと効率の良い方法があると思いますが、今の自分にはこれが精一杯でした笑
そもそもブラウザでページのソースを表示したらすぐに分かるんですけど、勉強のためにやってみました。
自分が欲しい機能を作るのは、楽しいし達成感あるしめっちゃ調べるので勉強になります。


終わり

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away