情報収集は「業務」か?

色々な意見がありそうです。テレビ番組も会議室で視聴すれば「業務」なのでしょうね。

ただ、たとえば百貨店に勤めている方なら「百貨店」のニュースは気になるものです。あるいはネット企業に勤めている方なら「AI」「IoT」「ビッグデータ」といったキーワードが気になるものです。

もし、それらのキーワードに関係する「特集番組」がテレビ放送として企画されているなら、見逃す訳には行きません。とくに公共放送で取り上げられるとなれば、社会への影響も非常に大きなものがあります。

<NHK API 管理画面>

誰でも使える NHK API

日本の公共放送であるNHKは、『番組表API』を公開しています。2016年6月にはVer.2の提供が開始され、「7日先」の番組情報まで取得できるようになりました。

レスポンス抜粋

"id" : "2017041215654",
"event_id" : "15654",
"start_time" : "2017-04-12T04:30:00+09:00",
"end_time" : "2017-04-12T05:00:00+09:00",
"title" : "NHKニュース おはよう日本",
"subtitle" : "▼国内外の最新ニュース ▼スポーツ情報 ▼地域の課題や話題のリポート ▼日本と世界の気象情報",
"content" : "※番組内容は変更になる場合があります ▼番組HP http://www.nhk.or.jp/ohayou/",
"act" : "【キャスター】森田洋平,【気象キャスター】酒井千佳",


この API は非常にシンプルな OPEN API です。

ユーザー登録さえすれば、誰でもスグにアクセスでき、利用上のルールに関しても「1日300アクセスまで」と非常に明快です。OAuth1/OAuth2といった認可フローもなく、セキュア通信(HTTPS)ですらありません!


一方で、標準仕様に厳格な API と言うこともできます。

日頃いろいろな API を活用している方であれば、Web サイトで使用できる文字(UTF-8)は、そのまま通信されるものと思い込んでしまっています。しかし、ソコは「流石NHK」です。「英数記号(ASCII 文字)だけで送受信」(Unicodeエスケープ)というルール(JSON RFC7159)をしっかり守り、日本語一文字一文字が \nXXXX と変換されています。(通信ログの検証等では使いづらいのですが)

[テレビ番組のキーワード検索]

「業務」の自動化

このワークフロー・アプリは、NHK API を通じて番組表情報を自動取得します。そして、あらかじめ設定しておいたキーワードにマッチする番組が無いかを自動探索する仕組みです。

たとえば「京都」というキーワードを設定しておけば、明日の朝4時に(!)「外国人向けの情報番組」があることをメールで確認できるようになります。いわゆる「ニュースアプリ」や『Google Alert』に代表されるような「Web 探索」とは違ったアプローチと言えます。

業務フローをよく見ればわかりますが、放置したとしても、24時間後に同じ条件で探索してくれます。

設定例

  • 地デジ総合: 京都,祇園,舞妓
  • 衛星BS1: 京都,祇園,舞妓,花街,先斗町,歌舞練場

通知メール抜粋

2017-04-14 04:11:00
◇ONE MINUTE ADVISER「関西空港から駅への行き方」
あの有名外国人スターが来日!?関空で駅までの行き方が分からないというスターにONE MINUTE ADVISERが楽しく解説します。京都・嵐山で外国人旅行者に人気の隠れスポットも紹介。

[テレビ番組のキーワード検索:「2.検索条件の変更」画面]

自動工程の設定方法

このワークフロー・アプリ(業務プロセス)のキモは、自動取得した番組表を検索するところです。

すなわち自動工程では「API通信でデータ取得する」だけでなく、「取得したデータから必要なデータを抽出する」という仕組みにしておく必要があります。もしプログラミングの知識がある方なら『スクリプト工程』でサーバサイド JavaScript を設定するのが良いでしょう。(そうでない方はスクリプトがパッケージ化された『サービス工程のAddonファイル』を活用してサービス工程の設定だけで済ませるべきです。)


『スクリプト工程』であれば、

キーワード「京都」に対して「東 "京都"」が検索ヒットする

といった悲劇にも対処することができます。つまり、「排除ワード」を設定できるようにしたり、「AND検索」を設定できる様にしたり、利用用途にあわせた様々な改良を楽しむことができるでしょう。(?)


ちなみに、クラウド型ワークフロー『Questetra BPM Suite』では、文字列型データの格納制限として「100万文字まで」というルールがあります。たとえば、地上波とBS放送のすべての番組表を一気に取得(nhkService="tv")して、文字列型データに格納してしまおうとすると、エラーになる可能性があるので注意が必要です。(←体験談)

<スクリプト工程「番組表取得」の設定例>
// TV Program search via NHK Program List API (ver. 20170410) 
// (c) 2017, Questetra, Inc. (the MIT License) 
// 情報提供: NHK 

//// == コンフィグ&参照 / Config & Retrieving == 
// あなたの "NHK番組表API" の "登録済みアプリ" 
// http://api-portal.nhk.or.jp/ 
var nhkKey = "Your-Key-32-Your-Key-32-Your-Key"; 

// http://api-portal.nhk.or.jp 
var nhkArea = data.get( "q_nhkArea" ) + ""; 
var nhkService = data.get( "q_nhkService" ) + ""; 
// 総合"g1",Eテレ"e1",BS1"s1",BSプレ"s3" 
var nhkDate = data.get( "q_nhkDate" ) + ""; 
var searchWordsCsv = data.get( "q_searchWordsCsv" ) + ""; 


//// == 演算 / Calculating == 
var accessLog = ""; 
var matchLog = ""; 

/// -- GET program list -- 
var uri = "http://api.nhk.or.jp/v2/pg/list/"; 
uri += nhkArea + "/"; 
uri += nhkService + "/"; 
uri += nhkDate + ".json?key="; 
uri += nhkKey; 

// com.questetra.bpms.core.event.scripttask.HttpClientWrapper 
// https://www.questetra.com/ja/tour/m2/m230/ 
// HttpRequestWrapper 
var requestMsg = httpClient.begin(); 

// HttpResponseWrapper 
var responseMsg = requestMsg.get( uri ); 
accessLog += "---GET--- " + responseMsg.getStatusCode() + " " + responseMsg.getCharset() + "\n"; 
accessLog += responseMsg.getResponseAsString() + "\n\n"; 

/// -- Word Search -- 
var responseObj = JSON.parse( responseMsg.getResponseAsString() ); 
var searchWords = searchWordsCsv.split(","); 

var tmp = ""; 
for (var i = 0; i < responseObj.list[nhkService].length; i ++) { // Bracket notation 
  tmp = responseObj.list[nhkService][i].start_time.slice(11, 16) + "\n"; 
  tmp += responseObj.list[nhkService][i].title + "\n"; 
  tmp += responseObj.list[nhkService][i].subtitle + "\n"; 
  tmp += responseObj.list[nhkService][i].content + " "; 
  tmp += responseObj.list[nhkService][i].act + "\n"; 

  for (var j = 0; j < searchWords.length; j ++) { 
    if ( tmp.match( searchWords[j] ) ) { 
      matchLog += tmp + "\n+++ \n\n"; 
      break; 
    } 
  } 
} 

//// == ワークフローデータへの代入 / Data Updating == 
retVal.put( "q_accessLog", accessLog ); 
retVal.put( "q_matchLog", matchLog ); 


<サービス工程Addonファイルの作成例>
<?xml version="1.0" encoding="UTF-8"?><service-task-definition> 

<label>NHK Program Search</label> 

<configs> 
  <config name="conf_DataIdA" required="true" form-type="TEXTFIELD"> 
    <label>A: Set NHK KEY</label> 
  </config> 
  <config name="conf_DataIdB" required="true" form-type="SELECT" select-data-type="STRING_TEXTFIELD"> 
    <label>B: Select AREA CODE</label> 
  </config> 
  <config name="conf_DataIdC" required="true" form-type="SELECT" select-data-type="STRING_TEXTFIELD"> 
    <label>C: Select SERVICE CODE</label> 
  </config> 
  <config name="conf_DataIdD" required="true" form-type="SELECT" select-data-type="DATE"> 
    <label>D: Select DATE</label> 
  </config> 
  <config name="conf_DataIdE" required="true" form-type="SELECT" select-data-type="STRING_TEXTFIELD"> 
    <label>E: Set SEARCH WORDS CSV</label> 
  </config> 
  <config name="conf_DataIdF" required="true" form-type="SELECT" select-data-type="TEXTAREA"> 
    <label>F: Select Access Log</label> 
  </config> 
  <config name="conf_DataIdG" required="true" form-type="SELECT" select-data-type="TEXTAREA"> 
    <label>G: Select Match Log</label> 
  </config> 
</configs> 


<script><![CDATA[ 
// TV Program search via NHK Program List API (ver. 20170411) 
// (c) 2017, Questetra, Inc. (the MIT License) 
// 情報提供: NHK 

//// == コンフィグ&参照 / Config & Retrieving == 
// あなたの "NHK番組表API" の "登録済みアプリ" 
// http://api-portal.nhk.or.jp/ 
var nhkKey = configs.get( "conf_DataIdA" ) + ""; 

// http://api-portal.nhk.or.jp
var nhkArea = data.get( configs.get( "conf_DataIdB" ) ) + "";
var nhkService = data.get( configs.get( "conf_DataIdC" ) ) + "";
 // 総合"g1",Eテレ"e1",BS1"s1",BSプレ"s3"
var nhkDate = data.get( configs.get( "conf_DataIdD" ) ) + "";
var searchWordsCsv = data.get( configs.get( "conf_DataIdE" ) ) + "";

var dataIdF = configs.get( "conf_DataIdF" );
var dataIdG = configs.get( "conf_DataIdG" );

//// == 演算 / Calculating == 
var accessLog = ""; 
var matchLog = ""; 

/// -- GET program list -- 
var uri = "http://api.nhk.or.jp/v2/pg/list/"; 
uri += nhkArea + "/"; 
uri += nhkService + "/"; 
uri += nhkDate + ".json?key="; 
uri += nhkKey; 

// com.questetra.bpms.core.event.scripttask.HttpClientWrapper 
// https://www.questetra.com/ja/tour/m2/m230/ 
// HttpRequestWrapper 
var requestMsg = httpClient.begin(); 

// HttpResponseWrapper 
var responseMsg = requestMsg.get( uri ); 
accessLog += "---GET--- " + responseMsg.getStatusCode() + " " + responseMsg.getCharset() + "\n"; 
accessLog += responseMsg.getResponseAsString() + "\n\n"; 

/// -- Word Search -- 
var responseObj = JSON.parse( responseMsg.getResponseAsString() ); 
var searchWords = searchWordsCsv.split(","); 

var tmp = ""; 
for (var i = 0; i < responseObj.list[nhkService].length; i ++) { // Bracket notation 
  tmp = responseObj.list[nhkService][i].start_time.slice(11, 16) + "\n"; 
  tmp += responseObj.list[nhkService][i].title + "\n"; 
  tmp += responseObj.list[nhkService][i].subtitle + "\n"; 
  tmp += responseObj.list[nhkService][i].content + " "; 
  tmp += responseObj.list[nhkService][i].act + "\n"; 

  for (var j = 0; j < searchWords.length; j ++) { 
    if ( tmp.match( searchWords[j] ) ) { 
      matchLog += tmp + "\n+++ \n\n"; 
      break; 
    } 
  } 
} 


//// == ワークフローデータへの代入 / Data Updating == 
retVal.put( dataIdF, accessLog ); 
retVal.put( dataIdG, matchLog ); 

]]></script> 
</service-task-definition> 


<SAMPLE RESPONCE> (※部分的に編集されています)
{
  "list":{
    "g1":[
      {
        "id" : "2017041219033",
        "event_id" : "19033",
        "start_time" : "2017-04-12T04:11:00+09:00",
        "end_time" : "2017-04-12T04:15:00+09:00",
        "area":{
          "id" : "260",
          "name" : "京都"
        },
        "service":{
          "id" : "g1",
          "name" : "NHK総合1",
          "logo_s":{
            "url" : "//www.nhk.or.jp/common/img/media/gtv-100x50.png",
            "width" : "100",
            "height" : "50"
          },
          "logo_m":{
            "url" : "//www.nhk.or.jp/common/img/media/gtv-200x100.png",
            "width" : "200",
            "height" : "100"
          },
          "logo_l":{
            "url" : "//www.nhk.or.jp/common/img/media/gtv-200x200.png",
            "width" : "200",
            "height" : "200"
          }
        },
        "title" : "NHKプレマップ「連続テレビ小説 ひよっこ」",
        "subtitle" : "",
        "content" : "",
        "act" : "",
        "genres":[
          "0207"
        ]
      },
      {
        "id" : "2017041215654",
        "event_id" : "15654",
        "start_time" : "2017-04-12T04:30:00+09:00",
        "end_time" : "2017-04-12T05:00:00+09:00",
        "area":{
          "id" : "260",
          "name" : "京都"
        },
        "service":{
          "id" : "g1",
          "name" : "NHK総合1",
          "logo_s":{
            "url" : "//www.nhk.or.jp/common/img/media/gtv-100x50.png",
            "width" : "100",
            "height" : "50"
          },
          "logo_m":{
            "url" : "//www.nhk.or.jp/common/img/media/gtv-200x100.png",
            "width" : "200",
            "height" : "100"
          },
          "logo_l":{
            "url" : "//www.nhk.or.jp/common/img/media/gtv-200x200.png",
            "width" : "200",
            "height" : "200"
          }
        },
        "title" : "NHKニュース おはよう日本",
        "subtitle" : "▼国内外の最新ニュース ▼スポーツ情報 ▼地域の課題や話題のリポート ▼日本と世界の気象情報",
        "content" : "※番組内容は変更になる場合があります ▼番組HP http://www.nhk.or.jp/ohayou/",
        "act" : "【キャスター】森田洋平,【気象キャスター】酒井千佳",
        "genres":[
          "0000",
          "0002",
          "0100"
        ]
      },
    ]
  }
}

<データ項目一覧画面>


[雛形ダウンロード (無料)]
<類似プロセス>
≪関連記事≫

[英文記事 (English Entry) ]

銀行口座の自動操作

日本では『銀行API』が盛り上がっています。

この Workflow Sample ブログを運営しているクエステトラ社においても、「『MFクラウド』(会計クラウド)と『みずほビジネスWEB』(銀行オンラインサービス)とのAPI連携の恩恵」によって、入金情報のリアルタイム確認が可能となり、会計システムへの記録もおよそ当日処理(日次決算)されるようになりました。(ワークフローによってしか作成できない売掛金等の情報は「CSVインポート」のままですが…、MFクラウドさん自身がAPIを提供する日も遠くないハズ…)
※ちなみに「スクレイピング方式」(会計クラウドに銀行パスワードを預ける方式)による連携は使用禁止にしていました

そして、この入出金情報のデータ連携を可能とする『銀行API』という政策は、2017年中にも「改正銀行法」として法整備される見込みであり、また FinTech 業界も好意的に受け止めていることから、銀行システムと様々なオンラインサービスが密接に接続されていく将来が予想されています。

まずは「参照系API」から

ただ、目下のところは、一部の事業者しか『銀行API』にアクセスできません。

今後についても、そのアクセスできる事業者となるには一定の審査が入ることが予想されています。また、今国会における議論如何によっては、「許認可制」になってしまう可能性もゼロではない状況にあります。


銀行側のアクセス許可についても、当面は「参照系API」に限定される可能性があります。

つまり、「APIサービス」の試運転期間のようなものとして、「入出金情報の取得」や「残高情報の取得」といった資産の移動を伴わないデータ参照通信に限定したサービスとして開始されることが想定されます。(既にこの2017年4月から「更新系API」の事例も出てきましたが…)


ちなみに「日本独自の課題」も見え隠れしています。

すなわち、大半の口座名が「半角カナ」で処理されてきた歴史的経緯があり、長音、拗音、中黒点といった文字データが、(少なくとも現時点では)、正式なカナ名称として表示されません。
  • キヨウトダイガクガクチヨウ ヤマギワジユイチ
  • カ)リクル-トホ-ルデイングス
つまるところ、少なくとも当面はAPIアクセスするシステム側で「データ変換」を行う必要があります。(「自動仕訳ルール」など)

[送金プロセス]

経理工程の独立

「独立したサブルーチン・プロセス」として『PayPal 請求フロー』を準備しておくと、とても便利です。

ワークフローシステム内の様々なビジネスフローから呼び出すことができるので、プロセスオーナーは、メインのビジネスフローの設計やメンテナンスに注力することができます。

下流側の経理部門の視点で言っても、複数のビジネスフローを区別なく処理できるため、効率よい業務をこなせるようになるでしょう。(ただし上流への関与は減る傾向になります)。また、ここ1・2年の変化が極めて激しい経理システム(※)にあって、「一元的に管理メンテナンスしたい」というニーズもあります。

※「クラウド会計」「銀行API」「会計BPO」など


PayPal請求書の処理

以下の業務プロセス定義(ワークフロー・アプリ)は、PayPal と自動連携する『PayPal 請求プロセス』です。

「PayPal REST API」、具体的には「PayPal Invoicing API」を通じて、ワークフローシステム側から様々なリクエストが行われます。つまり、
  • PayPal 側に『PayPal請求書』を生成させ、
  • PayPal から『PayPal請求書』を送信させ、
  • PayPal に対して『PayPal請求書』の決済状況を確認する
という仕組みになっています。(直接 PayPal にログインする機会は減ることになります)

[PayPal請求プロセス]

請求の自動化

ワークフローシステム『Questetra』から、請求システムとしての『PayPal』をコントロールできれば、とても便利です。

たとえば『商品納入フロー』が完了した直後に「納入内容に合わせた PayPal 請求書」が自動発行されるような仕組みを作れば、「請求ミス」や「請求モレ」の発生を防ぐことができます。もし、現状が「紙の請求書」を郵送する請求業務なのであれば、切手代・印刷費・事務人件費を全てゼロにすることも可能です。

前回までの記事では、「PayPal 内に請求書を生成させる」や「PayPal 内に生成させた請求書を更にお客様にメール送信させる」といった指示が、PayPal に対して自動的に行われる仕組みを紹介しました。

更なる自動化

  • PayPal に「PayPal請求書」を生成させる
  • PayPal に「PayPal請求書」をメール送信させる
が自動化できたのなら、更に
  • PayPal に対して、入金があったか確認する
についても自動化したいものです。(債権回収業務の効率化)

今回の記事では、自動工程を上手に組み立てて『入金確認フロー』を無人化することを考察してみます。

※ここでは自動工程の一種である「スクリプト工程」を使うため、プログラミング知識が必要となります

[エントリ受付システム-ペイパル請求~入金確認]

請求システムとしての PayPal

「PayPal 請求書」は、とても便利です。

PayPal にログインして「相手のメールアドレス」と「販売した商品明細」をセットするだけで、誰でも簡単に請求書を送ることができます。「ちょっとした受託作業」や「特別な値引き」にも柔軟に対応できる数少ない決済手段と言えるでしょう。その簡単さは「むしろECサイトで買い物をする手続きの方が難しい」と思えてしまうくらいです。しかも、買い手から売り手に「クレジットカード番号」を渡す必要もありません。

しかし、何十枚も発行しなければならない、となれば流石に面倒です。(その「柔軟さ」がアダとなってしまいます)

全く同じ請求内容であれば一括して処理する機能もあるのですが、それぞれに微妙に内容が異なるのであれば一つ一つ請求情報をセットせざるをえません。ただ、手作業の繰り返しは、どうしてもミスを招きます。

請求書生成と送信の自動化

以前の記事(※)で『PayPal システムに対して「PayPal 請求書を生成せよ」というリクエストが自動送信される仕組み』を紹介しました。

第525話:自動工程から OAuth2 リクエストを送出させる方法

今回の記事では、更に『「生成した PayPal 請求書を先方に送信せよ」というリクエストが自動送信される仕組み』について考えてみたいと思います。(プログラミング知識が必要となります)

[エントリ受付システム]

和暦テキスト

日本では「西暦」ではなく「和暦」を使うケースが多くあります。

現在は『2017年』であるとともに『平成29年』でもあります。

すなわち「2017-03-13」といった日付型データも、印刷物やメール本文などにおいては、「平成29年3月13日」と表示されるべきケースが多くあります。およそ1年前の記事(※)では、自動工程である[スクリプト工程]を活用した和暦変換をご紹介しました。(クラウド型ワークフロー『Questetra BPM Suite』に流れる案件データの自動変換)

第467話:自動生成 PDF の「証明書発行日」を和暦表示する! (2016-01-25)

スクリプト工程とサービス工程

ただ、クラウド型ワークフロー『Questetra BPM Suite』のバージョン11.1以降(2016-09-05)は、「サービス定義ファイル」(アドオンXML)によって任意の[サービス工程]を追加することが可能となっています。(サービス工程の Addon)

すなわち、和暦変換を行う[サービス工程]を利用すれば、(プログラミング知識を必要とする)、[スクリプト工程]を使う必要がありません。

[証明書発行フロー-和暦変換アドオン]

サーバサイド JavaScript による自動化

前回記事(※)で『Questetra BPM Suite の「自動工程」では(簡単な数値演算だけでなく)「OAuth2 通信」も実装可能』と書きました。

第524話:サーバサイド JavaScript による業務の自動化

そこで今回の記事では「具体的にどの様な外部サービスと OAuth2 通信が可能なのか」と「具体的にどの様なプログラミングが必要なのか」について、簡単にまとめてみたいと思います。(ワークフローシステム側からリクエストする視点)

そもそも OAuth2 通信とは

OAuth (おーおーす)とは「サーバへのリクエストを認可する仕組み」です。

参考) 『みんな知るべきクラウド技術「OAuth」ってナニ?』 (2014-01-27)

OAuth2 が2012年に登場して以来、Google Drive や Dropbox など多くの「リソース・サーバ」の API が『OAuth2 アクセス』に対応するようになっています。つまり、外部のシステムは「リソース・サーバ」に対して、様々な「参照リクエスト」や「更新リクエスト」を投げることが可能となっています。 (RFC6749/6750)

クラウド型ワークフローである『Questetra BPM Suite』では、業務プロセス定義の中に配置した自動工程に、この「外部のシステム」(OAuth2 クライアント)として振る舞わせることが可能です。すなわち、案件が自動工程(スクリプト工程/サービス工程)に到達する度に以下の様なリクエストが自動的に実行されるよう、設定することができます。

  • ※ スクリプト工程: 業務設計者がサーバサイド JavaScript をセットできる工程(HttpClientWrapper を使った通信も実装可能) M230
  • ※ サービス工程(Addon): スクリプト工程をパッケージ化した工程。業務設計者はコンフィグ設定のみ可能 M415 M416

参考)


アクセストークンの取得方法

このリクエスト通信には「アクセス・トークン」が必要になります。

「アクセス・トークン」とは、「リソースの所有者によって認可されたリクエストであることの証(あかし)」であり、その実態は数十文字から200文字程度の文字列です。ただ、アクセス・トークンの取得方式は「リソース・サーバ」によって異なります。主だった方法としては、
  • A. 所有者に「許可ボタン」をクリックさせ、その後は自動取得する (Authorization Code Grant)
  • B. 秘密クレデンシャルをセットしておき、その後は自動取得する (Client Credentials Grant)
  • C. アクセストークンそのものをセットしてしまう (有効期限が無い Access Token が可能な場合など)
といった方式があるのですが、「リソース・サーバ」の管理するデータの種類や性格によって多岐に及びます。

注意) 接続先 API が実装可能な OAuth2 認可方式であっても、「HTTP ヘッダ」や「Content-Type フォーマット」に関する実装制約(Questetra側)により、自動通信を設定できない場合があります。

[請求書送信プロセス]