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



## 導入

わざわざスクリプト書かなくてもデフォルトでRSSコネクタがあるやん・・・というのは置いておいて、Poweshellで実現する方法をここにメモとして残します。

### 前提

- Windows 10 Enterprise
- Powershell 5.1

## 結論

ソースコードは[Github](https://github.com/migisk/ps2msteams/blob/master/src/getrssfeed.ps1)

```powershell
# 検索キーワードをもとに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ファイルとして分離。

```powershell
# 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.ini``を``Get-Content``で取得。

2. 1.で読み込んだ行数分``$ini``にハッシュとして格納。

   →``$``、``;``で始まる行は無視。

以下を参考にさせていただきました。

- [PowerShell設定ファイルの読み込み](http://capm-network.com/?tag=PowerShell%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF)

###RSSフィード取得

RSSフィードを取得する部分。

```powershell
# 検索キーワード
$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
```

以下を参考にさせていただきました。

- [Qiitaの情報をRSSで取得する](http://dotnsf.blog.jp/archives/1053502711.html)
- [PowershellでRSSフィードを取得](https://qiita.com/usop4/items/940b842424c1bb59a2b7)

 

### タイトル行編集

何故か``$titleline``を1行で編集使用とするとエラーになる…

```powershell
# 初期化、タイトル行出力
$titleline = "**"
$titleline += [string](Get-Date -format "yyyy/MM/dd HH:mm:ss")
$titleline += " Qiita RSSフィード (Tags:" + $keyword
$titleline += ")**"
$text = @()
$text += $titleline
```

``$text``はTeams投稿用テキストの配列。

配列への要素追加は``+=``を用いる。



### 取得したRSSフィードから指定件数を抽出

```powershell
# $limit件のみ抽出、Markdown出力
$limit = 5
for ($i=0; $i -lt $limit; $i++) {
    $text += "<br>"
    $text += "- [" + $f.feed.entry[$i].title + "](" + $f.feed.entry[$i].url + ")"
}
```

以下を参考にさせていただきました。

- [RSS、atomの仕様をまとめる](https://qiita.com/you8/items/e903fd463cf770688e1e)
- [Office 365 Message Card Reference](https://docs.microsoft.com/ja-jp/outlook/actionable-messages/message-card-reference)

textはMarkdownで記載できる。改行には``<br>``が必要っぽい。



### JSONに変換

```powershell
# 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投稿

```powershell
# 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については[こちら](https://qiita.com/miyamiya/items/ccae505b8e97b5b532a7)が参考になる。



## 所感

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