PipedreamでPythonistaに優しい(?)ワークフロー構築R

author:

Kazuya Takei / @attakei

date:

2022/10/15

event:

PyCon JP 2022 LT in Official Party

hashtags:

#pyconjp

はじめに

LTの趣旨

Pipedreamを使ってみた/皆さん使ってみて。

お前誰よ

https://attakei.net/_static/images/icon-attakei.jpg

Kazuya Takei / @attakei

  • 趣味系Pythonista

  • Sphinxでプレゼンテーションをしたがる人

Sphinxを通して考える、「拡張」の仕方

見てくれた方、ありがとうございました。

Pipedreamの話をします

Pipedream is 何

https://pipedream.com/

../_images/pipedream-logo.svg

Pipedream is 何

https://pipedream.com/

  • ワークフローSaaS

  • ワークフローって

    • 外部リソースなどをトリガーとして定義

    • トリガーに応じて順次アクションを実行

Pipedream is 何

../_images/pipedream-example-1.png

「PyPI上にあるパッケージの更新情報をRSSから拾ってツイートする」例

Pipedreamのライバル

  • IFTTT

  • Zapier

  • Power Automate

  • (他にもいろいろ)

ライバルとの違い?

アクションを自作出来る。( deepl_〜 は自作)

../_images/pipedream-example-2.png

ライバルとの違い?

アクションを自作出来る。(実際の動き)

カスタムコードの対応言語

  • Node.js

  • Golang

  • Bash

  • Python

Pythonistaに優しい!

使用例

GitHubのアクティビティを集計するワークフローの一部

../_images/pipedream-example-3.png

使用例

コード

from datetime import date

from python_graphql_client import GraphqlClient


def get_client(token: str) -> GraphqlClient:
  headers = {
    "Authorization": f"Bearer {token}"
  }
  return GraphqlClient(endpoint="https://api.github.com/graphql", headers=headers)


def handler(pd: "pipedream"):
  token = f"{pd.inputs['github']['$auth']['oauth_access_token']}"
  client = get_client(token)
  query = """
    query($username: String!, $date: DateTime) {
      user(login: $username) {
        contributionsCollection(from: $date, to: $date) {
          contributionCalendar {
            totalContributions
            weeks {
              contributionDays {
                contributionCount
                weekday
                date
              }
            }
          }
        }
      }
    }
  """
  variables = {
    "username": "attakei",
    "date": date.today().strftime("%Y-%m-%dT00:00:00"),
  }
  result = client.execute(query=query, variables=variables)
  print(result["data"])
  return {
    "date": date.today().strftime("%Y-%m-%d"),
    "contributions": result["data"]["user"]["contributionsCollection"]["contributionCalendar"]["weeks"][0]["contributionDays"][0]["contributionCount"]
  }

「GraphQLを使ってGitiHub APIからアクティビティを入手する」 Pythonコード を動かせる。

使用例

Q
ライブラリは? requirements.txt みたいなものは無いの?
A
標準ライブラリにないものをインポートしようとしたら、ライブラリ名とみなしてPyPIから取ってくるみたいです。(雑な理解で)

課題感

たまに意味不明な失敗する。

../_images/pipedream-failure.png
  • 正しいコードでも、微妙な頻度で失敗する。

  • アクションの実行環境周りに何かありそう。

課題感

他には、

  • 「RSSの管理をしくじって、RSS全部取り直し?」からの

  • 「RSSの全エントリーをトリガーにしてしまう」という大事件。

=> FBすれば改善されるかも?

END

ワークフローSaaSもPythonで!

無料プランあるし、無料プランでもカスタムコードは動かせます