WordPressにはすでにリンクチェックのプラグインがありますが、それをC#でバッチとして作成してみようと思います
-
WordPress RestAPIをさわってみる - ナストンのまとめ
今回はWordPress RestAPIを使って全投稿データをCSVに書き出すようにしてみます動作環境は以下です バージ ...
続きを読む
今回は以下のバージョンで検証しています
名前 | バージョン |
---|---|
OS | WIndows 11 Pro |
C# | .Net 8.0 |
HtmlAgilityPack | 1.11.61 |
必要なものをインストールする
今回HTMLのhrefタグからURLを取得する際に『HtmlAgilityPack』というモジュールを使用するのでNugetからインストールします
WordPressに投稿されている記事から本文を取得する
以前の記事では、本文については触れていなかったのでまずは本文の取得からになります
本文の取得はタイトル取得時と同じように取得できます
internal class PostResponse
{
public PostResponse() { }
[JsonPropertyName("id")]
public int? Id { get; set; }
[JsonPropertyName("date")]
public string? Date { get; set; }
[JsonPropertyName("title")]
public TitleRendered? Title { get; set; }
[JsonPropertyName("link")]
public string? Link { get; set; }
[JsonPropertyName("content")]
public ContentRendered Content { get; set; }
}
internal class TitleRendered
{
public TitleRendered() { }
[JsonPropertyName("rendered")]
public string? Rendered { get; set; }
}
internal class ContentRendered
{
public ContentRendered() { }
[JsonPropertyName("rendered")]
public string? Rendered { get; set; }
}
HtmlAgilityPackを使用してhrefタグを取得する
以前の記事を参考にWordPressRestAPIで本文を含む情報を取得し、その本文をHtmlAgilityPackでhrefタグのURLを取得します
void HtmlDocumentVer(string url, string userName, string secretKey)
{
var wPRestAPI = new WPRestAPI(url, userName, secretKey);
var postResponses = wPRestAPI.GetAllPosts();
foreach (var post in postResponses)
{
// HtmlDocumentオブジェクトを作成
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(post.Content.Rendered);
// href属性を持つ全ての<a>タグを取得
var hrefList = new List<string>();
var links = htmlDoc.DocumentNode.SelectNodes("//a[@href]");
if (links == null)
{
continue;
}
Console.WriteLine(post.Title.Rendered);
foreach (var link in links)
{
var hrefValue = link.GetAttributeValue("href", string.Empty);
hrefList.Add(hrefValue);
}
// 取得したhrefを出力
foreach (var href in hrefList)
{
Console.WriteLine(href);
}
}
}
正規表現を使用してhrefタグを取得する
次に正規表現でhrefのURLを取得する方法ですが、もしかしたら正規表現を調整する必要があるのであまりおすすめはしません
public List<string> CheckLink(string content)
{
string pattern = @"href=\""(.*?)\""";
var regex = new Regex(pattern);
var result = new List<string>();
var matches = regex.Matches(content);
result.AddRange(matches.Select(m => m.Value));
return result;
}
void RegexVer(string url, string userName, string secretKey)
{
var wPRestAPI = new WPRestAPI(url, userName, secretKey);
var postResponses = wPRestAPI.GetAllPosts();
foreach (var post in postResponses)
{
var matches = new RegexCheck().CheckLink(post.Content.Rendered);
if(matches.Count == 0)
{
continue;
}
Console.WriteLine(post.Title.Rendered);
foreach(var match in matches)
{
// 取得したhrefを出力(href="および末尾の"を削除)
var replaceMatch = match.Replace("href=\"", "");
replaceMatch = replaceMatch.Replace("\"", "");
Console.WriteLine(replaceMatch);
}
}
}
URLに対してリンクチェックを実施する
上記のどちらからで取得したURLに対してHEADリクエストを実施して200番台であればOKと今回はみなしています
public bool UrlRequest(string url)
{
bool result = false;
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
request.Timeout = 10000;
using (var response = (HttpWebResponse)request.GetResponse())
{
// HTTPステータスコードを取得
HttpStatusCode statusCode = response.StatusCode;
// ステータスコードが200番台であれば成功とみなす
result = (int)statusCode >= 200 && (int)statusCode < 300;
}
return result;
}
最後に
やはり正規表現は追加のライブラリ等が必要なく簡単に実装できますが、調整が必要になったりするので使えるのであればライブラリの方が実装や保守に関しては楽かなと思います。また、今回の内容はHtmlのhrefタグに対してなら有効なので、WordPressでないウェブサイトでも使えると思います
今回のコードはGitHubにアップしているので参考にしてみてください
-
BlogSampleCodeProjects/WordPressPostDataLinkcheck at main · nasuton/BlogSampleCodeProjects · GitHub
Project for sample code used in the blog.(Blogで記載しているサンプルコード ...
GitHubへ
会社紹介
私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています
会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造
この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています
ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します
-
アドバンスド・ソリューション株式会社
アドバンスド・ソリューションは主にMicrosoft製品を使用して、企業の生産性向上に取り組んでいます。要件定義から導入 ...
サイトへ移動