情報収集は「業務」か?
色々な意見がありそうです。テレビ番組も会議室で視聴すれば「業務」なのでしょうね。ただ、たとえば百貨店に勤めている方なら「百貨店」のニュースは気になるものです。あるいはネット企業に勤めている方なら「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" : "【キャスター】森田洋平,【気象キャスター】酒井千佳",
"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が楽しく解説します。京都・嵐山で外国人旅行者に人気の隠れスポットも紹介。
◇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"
]
},
]
}
}
<データ項目一覧画面>
[雛形ダウンロード (無料)]
- 業務テンプレート:テレビ番組のキーワード検索-スクリプト工程
- 業務テンプレート:テレビ番組のキーワード検索-サービス工程(アドオン)
- 第524話:サーバサイド JavaScript による業務の自動化 (2017-02-27)
- 第504話:監査書類を Dropbox に自動保存! (2016-10-11)
- 第525話:自動工程から OAuth2 リクエストを送出させる方法 (2017-03-06)
- M230 自動工程: 業務データの複雑なデータ加工が自動実行されるように設定する(ECMAスクリプト) (使い方)
- M227 自動工程: 業務データの結合や四則演算が自動実行されるように設定する (使い方)
- M224 自動イベント: 業務データを挿し込んだメール文が、自動的にメール送信されるように設定する (使い方)
- M202 業務の流れ: 処理フローを定義し、各工程の締切時刻を設定する (使い方)
[英文記事 (English Entry) ]





0 件のコメント :
コメントを投稿