Zenpyの使い方

記事タイトルとURLをコピーする

はじめに

PE部の谷です。
Pythonを使ってZendeskのAPIを叩くのにZenpyを使ってみたので、紹介します。

docs.facetoe.com.au

Zenpyは、Python2とPython3の両方をサポートしており、 よりシンプルにコードを書くことができます。

使い方

前準備

まずはインストール。

pip install zenpy

importで指定します。

from zenpy import Zenpy 

次に、クレデンシャルを設定します。

creds = {
    'email' : 'youremail',
    'token' : 'yourtoken',
    'subdomain': 'yoursubdomain'
}

トークンの作成はこちら↓をご覧ください。

support.zendesk.com

他にもOAuthやパスワードを使うやり方もあるのでZenpyのドキュメントを参考にしてみてください。

zenpy_clientオブジェクトを作成して準備完了です。

zenpy_client = Zenpy(**creds)

実際のコード

今回は、弊社の請求代行サービスの名称が変更になったことに伴い、 Zendesk組織の組織名、タグ、組織フィールドの項目を更新するコードを書きました。

変更内容

  • 組織名
    pieCe_株式会社hoge_xxxx-xxxxx-xxxx -> 請求代行_株式会社hoge_xxxx-xxxxx-xxxx
    pieCe_Lite_ 株式会社fuga_yyyy-yyyy-yyyy -> 請求代行_株式会社fuga_yyyy-yyyy-yyyy

  • タグ+組織フィールドの顧客種別
    piece -> resale_advanced
    piece_lite -> resale_discount

これを f:id:swx-tani:20211015184249p:plain

こうします↓

f:id:swx-tani:20211015181011p:plain

from zenpy import Zenpy
from zenpy.lib.api_objects import Organization # オブジェクトを作成、更新、削除する際に必要
import settings
import logging
 
# ログの設定
logger = logging.getLogger('Logging')
logger.setLevel(10)
fh = logging.FileHandler('ログを出力するファイルパス')
logger.addHandler(fh)
formatter = logging.Formatter('%(asctime)s:%(levelname)s:%(message)s')
fh.setFormatter(formatter)
 
# クレデンシャル設定
creds = {
   'token': settings.ZENDESK_TOKEN,
   'email': settings.ZENDESK_EMAIL,
   'subdomain': settings.ZENDESK_SUBDOMAIN
}
 
zenpy_client = Zenpy(**creds)
 
def find_target_org(pre_service):
   """
   対象のZendesk組織を取得する
   """
   target_org = zenpy_client.search(name=pre_service, type='organization')
   return target_org
 
def create_update_info(target_org, pre_service, new_service):
   """
   更新情報を作成する
   """
   updated_info_list = []
   for organization in target_org:
      new_org_name = organization.name.replace(pre_service, '請求代行')
      updated_info_list.append(
         Organization(
            id=organization.id,
            name=new_org_name,
            tags=new_service,
            organization_fields={'customer_type':f'顧客種別:{new_service}'}
         )
      )
   return updated_info_list
 
def bulk_update(updated_info_list):
   """
   一括更新
   """
   try:
      job_status_list = []
      size = 100
      for start in range(0, len(updated_info_list), size):
         job_status = zenpy_client.organizations.update(
            updated_info_list[start: start + size]
         )
         job_status_list.append(job_status)
      return job_status_list
   except Exception as e:
        logger.exception('例外が発生しました: %s', e)
 
def main():
   logger.info('start')
   pl_zendesk_org = find_target_org("pieCe_Lite")
   pl_updated_info_list = create_update_info(pl_zendesk_org, "pieCe_Lite", "resale_discount")
   result = bulk_update(pl_updated_info_list)
   logger.info(result)
   logger.info('end')
   
   logger.info('start')
   p_zendesk_org = find_target_org("pieCe")
   p_updated_info_list = create_update_info(p_zendesk_org, "pieCe", "resale_advanced")
   result = bulk_update(p_updated_info_list)
   logger.info(result)
   logger.info('end')

説明

find_target_org関数

該当する組織名の組織を取得しています。
「pieCe」,「pieCe_Lite」という単語がついた組織を取得します。

create_update_info関数

先程のfind_target_org関数の戻り値(対象の組織情報)をもとに、組織ID、新たな組織名、新たなタグ、新たな組織フィールド情報をリストに格納していきます。

bulk_update関数

create_update_info関数の戻り値(更新情報)をもとに組織の更新を行なっていきます。 ZenpyはBulk Operations(一括操作)をサポートしています。

docs.facetoe.com.au

しかし、一度に処理できるオブジェクトの数に制限があるので注意が必要です。(通常100)
今回、組織数が2000を超えたので、100件ごとの処理にするために、range(初期値,最終値,差分)とスライス操作を使ってリストの要素を指定しています。

まとめ

Zenpyぜひ使ってみてください!