導入
わざわざスクリプト書かなくてもデフォルトでRSSコネクタがあるやん・・・というのは置いておいて、Poweshellで実現する方法をここにメモとして残します。
前提
- Windows 10 Enterprise
- Powershell 5.1
結論
ソースコードはGithub
# 検索キーワードをもとにRSSフィードを取得し、指定件数をTeamsに投稿する。
# ini読み込み
$lines = Get-Content ".\ini\config.ini"
$ini = @{}
foreach ($line in $lines) {
if ($line -match "^$") {
continue
} elseif ($line -match "^;") {
continue
} else {
$param = $line.split("=", 2)
$ini.add($param[0], $param[1])
}
}
# 検索キーワード
$keyword = $ini["keyword"]
# RSSフィードURL
$url = "https://qiita.com/tags/" + $keyword + "/feed.atom"
# RSSフィード取得
Write-Host $ini["startmsg"]
$res = Invoke-WebRequest -Uri $url
[XML]$f = $res.Content
# 初期化、タイトル行出力
$titleline = "**"
$titleline += [string](Get-Date -format "yyyy/MM/dd HH:mm:ss")
$titleline += " Qiita RSSフィード (Tags:" + $keyword
$titleline += ")**"
$text = @()
$text += $titleline
# $limit件のみ抽出、Markdown出力
$limit = 5
for ($i=0; $i -lt $limit; $i++) {
$text += "<br>"
$text += "- [" + $f.feed.entry[$i].title + "](" + $f.feed.entry[$i].url + ")"
}
# JSONに変換
$body = @{
text = [string]$text
}
$body = ConvertTo-JSON $body
$body = [Text.Encoding]::UTF8.GetBytes($body)
# IncomingWebhook URI
# Test用
#$URI = $ini["devuri"]
# 本番
$URI = $ini["prouri"]
# Teams投稿
$result = Invoke-RestMethod -uri $URI -Method Post -body $body -ContentType 'application/json'
if ($result -eq 1) {
Write-Host $ini["successmsg"]
} else {
Write-Host $ini["failedmsg"]
}
各部分のメモ
ini読み込み
機密情報を含むため設定系はiniファイルとして分離。
# ini読み込み
$lines = Get-Content ".\ini\config.ini"
$ini = @{}
foreach ($line in $lines) {
if ($line -match "^$") {
continue
} elseif ($line -match "^;") {
continue
} else {
$param = $line.split("=", 2)
$ini.add($param[0], $param[1])
}
}
-
.\ini\config.ini
をGet-Content
で取得。 -
1.で読み込んだ行数分
$ini
にハッシュとして格納。→
$
、;
で始まる行は無視。
以下を参考にさせていただきました。
###RSSフィード取得
RSSフィードを取得する部分。
# 検索キーワード
$keyword = $ini["keyword"]
# RSSフィードURL
$url = "https://qiita.com/tags/" + $keyword + "/feed.atom"
# RSSフィード取得
Write-Host $ini["startmsg"]
$res = Invoke-WebRequest -Uri $url
[XML]$f = $res.Content
以下を参考にさせていただきました。
タイトル行編集
何故か$titleline
を1行で編集使用とするとエラーになる…
# 初期化、タイトル行出力
$titleline = "**"
$titleline += [string](Get-Date -format "yyyy/MM/dd HH:mm:ss")
$titleline += " Qiita RSSフィード (Tags:" + $keyword
$titleline += ")**"
$text = @()
$text += $titleline
$text
はTeams投稿用テキストの配列。
配列への要素追加は+=
を用いる。
取得したRSSフィードから指定件数を抽出
# $limit件のみ抽出、Markdown出力
$limit = 5
for ($i=0; $i -lt $limit; $i++) {
$text += "<br>"
$text += "- [" + $f.feed.entry[$i].title + "](" + $f.feed.entry[$i].url + ")"
}
以下を参考にさせていただきました。
textはMarkdownで記載できる。改行には<br>
が必要っぽい。
JSONに変換
# JSONに変換
$body = @{
text = [string]$text
}
$body = ConvertTo-JSON $body
$body = [Text.Encoding]::UTF8.GetBytes($body)
編集してきた配列をハッシュに格納して、ConvertTo-JSON
でJSONに変換。
$body = [Text.Encoding]::UTF8.GetBytes($body)
は何故か文字化けしたので追記。UTF8に変換しています。
Teams投稿
# IncomingWebhook URI
# Test用
#$URI = $ini["devuri"]
# 本番
$URI = $ini["prouri"]
# Teams投稿
$result = Invoke-RestMethod -uri $URI -Method Post -body $body -ContentType 'application/json'
if ($result -eq 1) {
Write-Host $ini["successmsg"]
} else {
Write-Host $ini["failedmsg"]
}
-
$URI
TeamsのIncoming Webhookで取得したURI。Webhookについてはこちらが参考になる。
所感
- ずっと文字化けと戦っていたけどファイルをUTF8 with BOMに変換したら全てが解決した。
- sjisでもOK。