【Power Automate】Atom FeedをPull型で取得するPower Automate Flow


# はじめに - Feedとは
 - RSS, Atomの総称。双方ともにBlogを始めとした記事、または更新情報などを配信するための**文字規格**
 - 情報配信技術の総称として説明されることもある
 - 「XML」（Extensible Markup Language）で構成されている
 - [Feedly](https://www.bing.com/ck/a?!&&p=855ba5ad98134e59JmltdHM9MTY3NzYyODgwMCZpZ3VpZD0zYTAwN2YwNi0wMDEzLTZjN2EtMmUyOC02ZWI0MDE2OTZkNDkmaW5zaWQ9NTE4OQ&ptn=3&hsh=3&fclid=3a007f06-0013-6c7a-2e28-6eb401696d49&psq=feedly&u=a1aHR0cHM6Ly9mZWVkbHkuY29tLw&ntb=1)を始めとした情報収集アプリは、 **RSSリーダー**であり、RSSフィードを収集している。

### 参考
https://curo.jp/log/feed-rss-atom

# RSSフィードの活用方法
Power Automateに**RSSフィードの更新情報をキャッチするトリガー**があるため、
Teamsを中心としたアプリで、**REST APIで情報収集の自動化が可能**です

:::note info
Botなどで活かされているのはこのテクニックであると想定されます
:::
 
https://learn.microsoft.com/ja-jp/connectors/rss/

# PULL型の情報収集（Atom Feed）
一方、**コネクタがないAtom Feedの場合は、HTTP要求を送信することによって情報をキャッチできる**
 - ユーザーからHTTP要求を送ってフィードを取得する方法
 - なおYouTubeの最新チャネルを取得する、といった場合にも応用可能
     - コネクタが用意されていない場合に使える技術（YouTubeはコネクタが存在します）

https://qiita.com/e_toyoda/items/185c1dea055e230918b9

今回は上記の記事を参考に、**PULL型の情報収集をローコードで実践する方法**をご紹介します。

## 1. XMLのリンクを調べる
👆の記事を参考にして展開すると、サイトによって.xmlといったURLが存在します！

今回は極めてわかりやすいサイトとして「[Publickey](https://www.publickey1.jp/)」を紹介

https://www.publickey1.jp/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/1d3a9f30-8d97-02b1-3cdf-4eb418f612c3.png)

上記がXMLを取得できる[リンク](https://www.publickey1.jp/atom.xml)です。

## 2. Power AutomateでHTTP要求を送信する
- シンプルにHTTP要求を`GET Method`で送信するとXMLが戻り値として返ってきます！
- XMLの中から最新のFeedを取得する方法もあるが、Power Automateの`json関数`でJSON形式にデータを変更します
    - JSON形式にすることによって後続の作業が進めやすくなるため
    - 筆者の感覚では **見やすい** という点もポイント

:::note info
**推しポイント！**
json関数でXMLが一瞬でJSON形式に変わる・・・
json関数大好きです🐟✨
:::

## 3. JSONから最新の情報を抜き出す
JSONをで読み解くと、`entry` が配列になっており、こちらのインデックス[0]のオブジェクトが、
最新記事と解釈できる👀✨
 - より詳細に調べたい方は自分でやってみましょう！

```PowerFx:関数
json(body('XML_PULL'))?['feed']?['entry'][0]
```
:::note info
配列のインデックスは0始まり！
:::

```json:戻り値
{
  "title": "Ruby30周年イベント（中編）～言語を「作りたい」と思ってから10年以上経って、スキルと環境が追いついてRubyを作ることができるようになった",
  "link": {
    "@rel": "alternate",
    "@type": "text/html",
    "@href": "https://www.publickey1.jp/blog/23/ruby3010ruby.html"
  },
  "id": "tag:www.publickey1.jp,2023://2.7104",
  "published": "2023-03-01T16:21:41Z",
  "updated": "2023-03-02T02:56:10Z",
  "summary": "まつもとゆきひろ氏によって開発が始まったRuby言語の30周年を祝うイベント「プログラミング言語Ruby30周年記念イベント」が2月25日にオンラインで開催されました。 イベントでは関係者やRuby愛好家らによる過去30年の振り返りやRub...",
  "author": {
    "name": "jniino"
  },
  "category": [
    {
      "@term": "プログラミング言語",
      "@scheme": "http://www.sixapart.com/ns/types#category"
    },
    {
      "@term": "ruby",
      "@label": "Ruby",
      "@scheme": "http://www.sixapart.com/ns/types#tag"
    }
  ],
  "content": {
    "@type": "html",
    "@xml:lang": "ja",
    "@xml:base": "https://www.publickey1.jp/",
    "#text": "\n\nまつもとゆきひろ氏によって開発が始まったRuby言語の30周年を祝うイベント「プログラミング言語Ruby30周年記念イベント」が2月25日にオンラインで開催されました。 イベントでは関係者やRuby愛好家らによる過去30年の振り返りやRubyにまつわるライトニングトークなどが行われ、最後にまつもとゆきひろ氏による基調講演「D is for Dream, V for Vaporware」が行われました。 基調講演では、Rubyを開発する前にまつもと氏が手がけた、Rubyの原点と……\n\n    "
  }
}
```


ここから取得するデータを抜き出し、POSTする方法を組み立てて、情報収集ツールとして活かせます！

## 4. スケジュールされたトリガーで情報収集
PULL型の情報収集になるため、**スケジュールされたトリガー** で定期的にHTTP要求を送信する

- HTTP
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/cd38b48c-711c-6229-1364-92b30028af9c.png)

URIを指定するだけの極めてシンプルな内容になります。

:::note warn
**筆者の意見**
より短いスパンでHTTP 要求を送信することもできますが、相手方の㏋のサーバー負荷の軽減と、
Power Automateの制限も考慮したスケジュールを考えましょう
:::


## 5. 連続投稿を避けるために
*スケジュールされたトリガー*で実施することを考えると、同じ情報を連続して投稿してしまう可能性があります。
そのため、取得したフィードが*配信済み*か、*未配信*か判断することが必要になるでしょう。

ここでは使いやすいSharePointのListにて対処します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2c48ecd8-dd2c-c1c0-d8de-23ba87140493.png)

1. 最上段のレコードにタイトルと最新更新日時を格納しています。
1. この値との一致・不一致でPOSTするか、どうかを判断する方法です！

:::note info
SharePoint ListにURIを格納することで、
複数サイトからまとめて収集することもできますね！
:::

`JSON`のスキーマから`published`に当たる部分が配信日付です。
投稿する際に`published`が同じ値であれば配信済み情報と判断することが出来ます。
 - 上記はあくまで一例です。Excelを始め、好きなものを使いましょう。
 - 今回はPower Platformの相性の良さからSharePointを推します🐟✨

|Title|latest_Date
|---|---
|feed title|publish datetime

 - 日付文字列で`yyyy-MM-DDThh:mm:ssZ`の形式で比較できる簡単さ・・・好きです🐟✨

## 具体的なフロー
1. Recurrence
1. HTTP 要求
1. 戻り値のXMLを`json関数`で変換
1. SharePointのレコードで配信済みの情報かどうか、条件分岐で確認する
1. 条件分岐
     - 配信済みの判断はレコードの「lastest」 = Jsonの「published」で判断、equelの場合は終了
     - Not equelの場合は、アダプティブカードをデザインし、ポスト
     - Imageは要求先のfaviconを利用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ecb12af2-4212-b329-3153-755819df5dbb.png)

## Teamsに表示される最新情報！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/3917b715-9e87-abf9-846d-f8256ecc34c4.png)

アダプティブカードでCoolに情報をストックできます！
**最新情報を見逃さない👀✨！**

## 取得された情報
VUCA時代、AIの新情報も一切見逃せません。
Teamsを中心に、組織や個人で情報収集感度を高める上でもオススメです。

またPostされたFeedを話題に、議論が始まり、新たなコラボレーションが生まれると良いですね。

# Goodな情報収集ライフを！
以上が説明でした。
RSSフィードについては、情報を取得しやすいコネクタが既にあるので、そちらを活用しましょう。

 - ちなみにこんな感じになります
     - ナチュラルにJSONでFeedの情報が返ってくるの本当にラク・・・💦
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5b9d267d-f7ab-0433-b87a-b167f644b178.png)

お付き合いいただき、ありがとうございました！
楽しいPower Lifeを！