3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PowershellでQiitaのRSSフィードを取得してMicrosoft Teamsに投稿してみる

Posted at

導入

わざわざスクリプト書かなくてもデフォルトで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])
    }
}
  1. .\ini\config.iniGet-Contentで取得。

  2. 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"]
}
  • $URITeamsのIncoming Webhookで取得したURI。Webhookについてはこちらが参考になる。

所感

  • ずっと文字化けと戦っていたけどファイルをUTF8 with BOMに変換したら全てが解決した。
  • sjisでもOK。
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?