NHK番組表: 番組リスト, 検索
NHK番組表: 番組リスト, 検索 (NHK Program Guide: Programs, Search)
指定地域チャンネルの指定日番組表を検索します。キーワード、番組ジャンル、時刻範囲によるフィルタが可能です。なお、キーワード検索は番組タイトル・サブタイトル・放送内容・出演者の結合文字列に対して適用されます。(NHK番組の情報提供:NHK)
Configs
  • A: API Key をセットしてください *#{EL}
  • B1: 地域ID(放送局)をセットしてください (例 東京:”130″, 京都:”260″) *#{EL}
  • B2: サービスID(チャンネル)をセットしてください (例 総合:”g1″, テレビ全て:”tv”) *#{EL}
  • B3: 番組表の日付をセットしてください (“YYYY-MM-DD” はじまり文字列) *#{EL}
  • C1: Keywordフィルタをコンマ区切りでセットしてください (例 “DX,トランスフォーメーション”)#{EL}
  • C2: ジャンルフィルタをセットしてください (例 総合ニュース:”0000″)#{EL}
  • C3: 時刻フィルタの先頭をセットしてください (この時刻より後に開始される番組に絞る “YYYY-MM-DD HH:MM”)#{EL}
  • C4: 時刻フィルタの末尾をセットしてください (この時刻より前に開始される番組に絞る “YYYY-MM-DD HH:MM”)#{EL}
  • D1: 検索結果リストTSVが格納される文字列型データ項目を選択してください (更新)
  • D2: 全番組 Raw JSON が格納される文字列型データ項目を選択してください (更新)
  • E0: リスト1番の番組IDが格納される文字列型データ項目を選択してください (更新)
  • E1: リスト1番のサービス名(チャンネル)が格納される文字列型データ項目を選択してください (更新)
  • E2: リスト1番の番組開始時刻が格納される日時型データ項目を選択してください (更新)
  • E3: リスト1番の番組終了時刻が格納される日時型データ項目を選択してください (更新)
  • E4: リスト1番の番組タイトルが格納される文字列型データ項目を選択してください (更新)
  • E5: リスト1番のサブタイトルが格納される文字列型データ項目を選択してください (更新)
  • E6: リスト1番の番組内容が格納される文字列型データ項目を選択してください (更新)
  • E7: リスト1番の番組出演者が格納される文字列型データ項目を選択してください (更新)
Script (click to open)
// GraalJS Script (engine type: 2)

//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){ 

//// == Config Retrieving / 工程コンフィグの参照 ==
const strApiKey             = configs.get( "StrConfA" );  // required
  if( strApiKey           === "" ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " Config {A API Key} is empty \n" );
  }
const strAreaId             = configs.get( "StrConfB1" ); // required
  if( strAreaId           === "" ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " Config {B Area ID} is empty \n" );
  }
const strServiceId          = configs.get( "StrConfB2" ); // required
  if( strServiceId        === "" ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " Config {B Service ID} is empty \n" );
  }
const strGuideDateTail      = configs.get( "StrConfB3" );  // required
  if( strGuideDateTail    === "" ){
    throw new Error( "\n AutomatedTask ConfigError:" +
                     " Config {B Guide Date} is empty \n" );
  }
  const strGuideDate        = strGuideDateTail.slice(0, 10); // (formatted)
const strFilterKeywords     = configs.get( "StrConfC1" );
  const arrFilterKeywords   = strFilterKeywords.split(",");
const strFilterGenre        = configs.get( "StrConfC2" );
const strFilterTimeBegin    = configs.get( "StrConfC3" );
const strFilterTimeEnd      = configs.get( "StrConfC4" );
const strPocketListTsv      = configs.getObject( "SelectConfD1" );
const strPocketRawJson      = configs.getObject( "SelectConfD2" );
const strPocketFirstId      = configs.getObject( "SelectConfE0" );
const strPocketFirstService = configs.getObject( "SelectConfE1" );
const timePocketFirstStart  = configs.getObject( "SelectConfE2" );
const timePocketFirstEnd    = configs.getObject( "SelectConfE3" );
const strPocketFirstTitle   = configs.getObject( "SelectConfE4" );
const strPocketFirstSub     = configs.getObject( "SelectConfE5" );
const strPocketFirstContent = configs.getObject( "SelectConfE6" );
const strPocketFirstAct     = configs.getObject( "SelectConfE7" );


//// == Data Retrieving / ワークフローデータの参照 ==
// (Nothing. Retrieved via Expression Language in Config Retrieving)


//// == Calculating / 演算 ==

/// ▽放送地域、サービス(放送波)を指定することで、番組情報を取得
/// https://api-portal.nhk.or.jp/doc-list-v2-con
/// ▽放送地域、EPG番組ジャンル、日付を指定することで、番組情報を取得
/// https://api-portal.nhk.or.jp/doc-genre-v2-con

// request1, prepare
let getUri1  = "https://api.nhk.or.jp/v2/pg/list" +
               "/" + strAreaId +
               "/" + strServiceId +
               "/" + strGuideDate +
               ".json";
if( strFilterGenre !== "" ){
    getUri1  = "https://api.nhk.or.jp/v2/pg/genre" +
               "/" + strAreaId +
               "/" + strServiceId +
               "/" + strFilterGenre +
               "/" + strGuideDate +
               ".json";
}
let request1 = httpClient.begin(); // HttpRequestWrapper
    request1 = request1.queryParam( "key", strApiKey ); 
// request1, try
const response1     = request1.get( getUri1 ); // HttpResponseWrapper
engine.log( " AutomatedTask ApiRequest1 Start: " + getUri1 );
const response1Code = response1.getStatusCode() + "";
const response1Body = response1.getResponseAsString() + "";
engine.log( " AutomatedTask ApiResponse1 Status: " + response1Code );
if( response1Code !== "200"){
  throw new Error( "\n AutomatedTask UnexpectedResponseError: " +
                    response1Code + "\n" + response1Body + "\n" );
}
// response1, parse
// engine.log( response1Body ); // debug
/* response sample
{
  "list": {
    "g1": [
      {
        "id": "2021022206260",
        "event_id": "06260",
        "start_time": "2021-02-22T03:50:00+09:00",
        "end_time": "2021-02-22T04:32: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": "空からクルージング特別編「ヨーロッパの城と宮殿」",
        "subtitle": "世界各地の絶景の中を空からゆったりと旅をする紀行番組「空からクルージング」…",
        "content": "ヨーロッパ各地に残るたくさんの城や宮殿の美しい姿と、歴史の物語を紹介する。ス…",
        "act": "",
        "genres": [
          "1000"
        ]
      },
*/
const response1Obj = JSON.parse( response1Body );
engine.log( " AutomatedTask ApiResponse1 Services: " + Object.keys(response1Obj.list).toString() );

/// Store All in 2D-Array, Temporarily
let arrAllPrograms = [];
Object.keys(response1Obj.list).forEach(function( strService ) {
  engine.log( " AutomatedTask ApiResponse1 # of " + strService +
              ": " + response1Obj.list[strService].length );
  for( let i = 0; i < response1Obj.list[strService].length; i++ ){
    let tmp = [];
    tmp.push( strService );
    tmp.push( response1Obj.list[strService][i].id );
    tmp.push( response1Obj.list[strService][i].start_time ); // 2
    tmp.push( response1Obj.list[strService][i].end_time );
    tmp.push( response1Obj.list[strService][i].title );    // 4
    tmp.push( response1Obj.list[strService][i].subtitle ); // 5
    tmp.push( response1Obj.list[strService][i].content );  // 6
    tmp.push( response1Obj.list[strService][i].act );      // 7
    arrAllPrograms.push( tmp );
  }
});
engine.log( " AutomatedTask: # of Programs without filter: " + arrAllPrograms.length );

/// Filter by Keywords
let arrKeywordFilteredPrograms = arrAllPrograms.filter( function( arr ) {
  let boolMatch = false;
  if( strFilterKeywords === "" ){
    boolMatch = true;
  }else{
    for( let i = 0; i < arrFilterKeywords.length; i++ ){
      let regTmp = new RegExp( arrFilterKeywords[i] );
      for( let j = 4; j < 8; j++ ){
        if( regTmp.test( arr[j] ) ){
          engine.log( " AutomatedTask Matched: '" + arrFilterKeywords[i] + "' in: " + arr[j] );
          boolMatch = true;
          break;
        }
      }
      if( boolMatch ){ break; }
    }
  }
  if( boolMatch ){ return arr; }
});
engine.log( " AutomatedTask: # of Programs Keyword Filtered: " + arrKeywordFilteredPrograms.length );

/// Filter by Time
let dateFilterTimeBegin   = new Date();
let dateFilterTimeEnd     = new Date();
if( strFilterTimeBegin  !== "" ){
    dateFilterTimeBegin   = toJsDate( strFilterTimeBegin );
}
if( strFilterTimeEnd    !== "" ){
    dateFilterTimeEnd     = toJsDate( strFilterTimeEnd );
}
let arrTimeFilteredPrograms = arrKeywordFilteredPrograms.filter( function( arr ) {
  let boolMatch = false;
  let dateProgramStartTime = new Date( arr[2] );
  if( strFilterTimeBegin === "" && strFilterTimeEnd === "" ){
    boolMatch = true;
  }else if( strFilterTimeBegin !== "" && strFilterTimeEnd === "" ){
    if( dateFilterTimeBegin.getTime() <= dateProgramStartTime.getTime() ){
      boolMatch = true;
    }
  }else if( strFilterTimeBegin === "" && strFilterTimeEnd !== "" ){
    if( dateProgramStartTime.getTime() <= dateFilterTimeEnd.getTime() ){
      boolMatch = true;
    }
  }else if( strFilterTimeBegin !== "" && strFilterTimeEnd !== "" ){
    if( dateFilterTimeBegin.getTime() <= dateProgramStartTime.getTime() && 
        dateProgramStartTime.getTime() <= dateFilterTimeEnd.getTime() ){
      boolMatch = true;
    }
  }
  if( boolMatch ){ return arr; }
});
engine.log( " AutomatedTask: # of Programs StartTime Filtered: " + arrTimeFilteredPrograms.length );

/// Create TSV
let strListTsv = "";
for(   let i = 0; i < arrTimeFilteredPrograms.length; i++ ){
  for( let j = 0; j < arrTimeFilteredPrograms[i].length; j++ ){
    strListTsv     += arrTimeFilteredPrograms[i][j];
    if( j !== arrTimeFilteredPrograms[i].length - 1 ){
      strListTsv   += "\t";
    }
  }
  if( i !==   arrTimeFilteredPrograms.length - 1 ){
    strListTsv     += "\n";
  }
}


//// == Data Updating / ワークフローデータへの代入 ==
if( strPocketListTsv      !== null && arrTimeFilteredPrograms.length > 0 ){
  engine.setData( strPocketListTsv,      strListTsv );
}
if( strPocketRawJson      !== null ){
  if( response1Body.length > 999999 ){ // Maximum string size in Workflow Platform
    engine.setData( strPocketRawJson,      '{"Json String": "over 1,000,000 characters"}' );
  }else{
    engine.setData( strPocketRawJson,      response1Body );
  }
}
if( strPocketFirstId      !== null && arrTimeFilteredPrograms.length > 0 ){
  engine.setData( strPocketFirstId,      arrTimeFilteredPrograms[0][1] );
}
if( strPocketFirstService !== null && arrTimeFilteredPrograms.length > 0 ){
  if( arrTimeFilteredPrograms[0][0] === "g1" ){
    engine.setData( strPocketFirstService, "NHK総合1" );
  }else if( arrTimeFilteredPrograms[0][0] === "g2" ){
    engine.setData( strPocketFirstService, "NHK総合2" );
  }else if( arrTimeFilteredPrograms[0][0] === "e1" ){
    engine.setData( strPocketFirstService, "NHKEテレ1" );
  }else if( arrTimeFilteredPrograms[0][0] === "e2" ){
    engine.setData( strPocketFirstService, "NHKEテレ2" );
  }else if( arrTimeFilteredPrograms[0][0] === "e3" ){
    engine.setData( strPocketFirstService, "NHKEテレ3" );
  }else if( arrTimeFilteredPrograms[0][0] === "e4" ){
    engine.setData( strPocketFirstService, "NHKワンセグ2" );
  }else if( arrTimeFilteredPrograms[0][0] === "s1" ){
    engine.setData( strPocketFirstService, "NHKBS1" );
  }else if( arrTimeFilteredPrograms[0][0] === "s2" ){
    engine.setData( strPocketFirstService, "NHKBS1(102ch)" );
  }else if( arrTimeFilteredPrograms[0][0] === "s3" ){
    engine.setData( strPocketFirstService, "NHKBSプレミアム" );
  }else if( arrTimeFilteredPrograms[0][0] === "s4" ){
    engine.setData( strPocketFirstService, "NHKBSプレミアム(104ch)" );
  }else if( arrTimeFilteredPrograms[0][0] === "r1" ){
    engine.setData( strPocketFirstService, "NHKラジオ第1" );
  }else if( arrTimeFilteredPrograms[0][0] === "r2" ){
    engine.setData( strPocketFirstService, "NHKラジオ第2" );
  }else if( arrTimeFilteredPrograms[0][0] === "r3" ){
    engine.setData( strPocketFirstService, "NHKFM" );
  }else if( arrTimeFilteredPrograms[0][0] === "n1" ){
    engine.setData( strPocketFirstService, "NHKネットラジオ第1" );
  }else if( arrTimeFilteredPrograms[0][0] === "n2" ){
    engine.setData( strPocketFirstService, "NHKネットラジオ第2" );
  }else if( arrTimeFilteredPrograms[0][0] === "n3" ){
    engine.setData( strPocketFirstService, "NHKネットラジオFM" );
  }
}
if( timePocketFirstStart  !== null && arrTimeFilteredPrograms.length > 0 ){
  let dateFirstStart = new Date( arrTimeFilteredPrograms[0][2] );
  engine.setData( timePocketFirstStart,  new java.sql.Timestamp( dateFirstStart.getTime() ) );
}
if( timePocketFirstEnd    !== null && arrTimeFilteredPrograms.length > 0 ){
  let dateFirstEnd   = new Date( arrTimeFilteredPrograms[0][3] );
  engine.setData( timePocketFirstEnd,    new java.sql.Timestamp( dateFirstEnd.getTime() ) );
}
if( strPocketFirstTitle   !== null && arrTimeFilteredPrograms.length > 0 ){
  engine.setData( strPocketFirstTitle,   arrTimeFilteredPrograms[0][4]  );
}
if( strPocketFirstSub     !== null && arrTimeFilteredPrograms.length > 0 ){
  engine.setData( strPocketFirstSub,     arrTimeFilteredPrograms[0][5] );
}
if( strPocketFirstContent !== null && arrTimeFilteredPrograms.length > 0 ){
  engine.setData( strPocketFirstContent, arrTimeFilteredPrograms[0][6] );
}
if( strPocketFirstAct     !== null && arrTimeFilteredPrograms.length > 0 ){
  engine.setData( strPocketFirstAct,     arrTimeFilteredPrograms[0][7] );
}

} //////// END "main()" /////////////////////////////////////////////////////////////////



function toJsDate( bpmsDateOrDatetimeStr ){
  // BPMS Date:     "2020-04-01"  (subtype "Y/M" "M/D" "Y", not supported)
  // BPMS Datetime: "2020-04-01 23:59"
  let year       = 0;
  let monthIndex = 0;
  let day        = 0;
  let hours      = 0;
  let minutes    = 0;

  //  The ECMA/JavaScript Date object has a large number of methods.
  // "Date.parse" is danger (strongly discouraged)
  // - new Date("2014-11-10") // Mon Nov 10 2014 09:00:00 GMT+0900 (JST)
  // - new Date(2014, 10, 10) // Mon Nov 10 2014 00:00:00 GMT+0900 (JST)
  let arrDatetime = bpmsDateOrDatetimeStr.split(" ");
  if( arrDatetime.length === 1 ){
    let arrDateParts = arrDatetime[0].split("-");
    year       = parseInt(arrDateParts[0], 10);
    monthIndex = parseInt(arrDateParts[1], 10) - 1;
    day        = parseInt(arrDateParts[2], 10);
  }
  if( arrDatetime.length === 2 ){
    let arrDateParts = arrDatetime[0].split("-");
    let arrTimeParts = arrDatetime[1].split(":");
    year       = parseInt(arrDateParts[0], 10);
    monthIndex = parseInt(arrDateParts[1], 10) - 1;
    day        = parseInt(arrDateParts[2], 10);
    hours      = parseInt(arrTimeParts[0], 10);
    minutes    = parseInt(arrTimeParts[1], 10);
  }
  return new Date( year, monthIndex, day, hours, minutes );
}



/*
Notes:
- Detects exposure to NHK broadcast automatically. (Industry trends, regions info, competitors,,)
    - If the search result is zero, nothing is updated. It does not cause a runtime error.
    - "Notification to stakeholders" triggered by information detection, etc.
- You can get the broadcast summary of your favorite program with filtering by channel and time.
- Searchable up to 8 days in advance.
    - Specify with a string starting with "YYYY-MM-DD". ("Datetime type data" is also acceptable)
    - To config dynamically "process start date" and "21:00 the day after the process start date"
        - #{#format(processInstanceStartDatetime,'yyyy-MM-dd')}
        - #{#format(processInstanceStartDatetime.addDays(1), 'yyyy-MM-dd 21:00')}
        - https://questetra.zendesk.com/hc/en-us/articles/360024292872-R2272
- Search result list (TSV)
    - Program ID, Service Name, Start time, End time, Program title, subtitle, content, performers
    - Time format: String of "ISO 8601 Extended Format" (YYYY-MM-DDThh:mm:ss+09:00)

Notes-ja:
- NHKへの露出を自動検知します。(業界トレンド語、地元地域、競合他社など)
    - 検索結果がゼロの場合、何も更新されません。処理エラーにもなりません。
    - 情報検知をトリガーにした「ステークホルダーへの情報発信業務」など
- チャンネルと開始時刻等でフィルタすれば、お気に入りの番組の放送概要を取得することが可能です。
- 8日先までの日時が指定可能です。
    - "YYYY-MM-DD" で始まる文字列で指定します。("日時型データ" の参照でも構いません)
    - 動的に「プロセス開始日」や「プロセス開始日の翌日21時」をConfigセットしたい場合
        - #{#format(processInstanceStartDatetime, 'yyyy-MM-dd')}
        - #{#format(processInstanceStartDatetime.addDays(1), 'yyyy-MM-dd 21:00')}
        - https://questetra.zendesk.com/hc/ja/articles/360024292872-R2272
- 検索結果リスト(TSV)
    - 番組ID、サービス名、開始時刻、終了時刻、番組タイトル、サブタイトル、内容、出演者
    - 時刻は "ISO 8601 拡張形式" の文字列(YYYY-MM-DDThh:mm:ss+09:00)
*/


/*
APPENDIX
- Create an API key on the "API Apps" page of your personal account beforehand.
    - https://api-portal.nhk.or.jp/my-apps/
- Program data is acquired via "Program List API" or "Program Genre API".
    - It is available free of charge. https://api-portal.nhk.or.jp/
- Area codes https://api-portal.nhk.or.jp/doc-request
    - 010: Sapporo, 011: Hakodate, 012: Asahikawa, 013: Obihiro, 014: Kushiro, 015: Kitami, 016: Muroran, 020: Aomori,
    - 030: Morioka, 040: Sendai, 050: Akita, 060: Yamagata, 070: Fukushima, 080: Mito, 090: Utsunomiya, 100: Maebashi,
    - 110: Saitama, 120: Chiba, 130: Tokyo, 140: Yokohama, 150: Niigata, 160: Toyama, 170: Kanazawa, 180: Fukui,
    - 190: Kofu, 200: Nagano, 210: Gifu, 220: Shizuoka, 230: Nagoya, 240: Tsu, 250: Otsu, 260: Kyoto,
    - 270: Osaka, 280: Kobe, 290: Nara, 300: Wakayama, 310: Tottori, 320: Matsue, 330: Okayama, 340: Hiroshima,
    - 350: Yamaguchi, 360: Tokushima, 370: Takamatsu, 380: Matsuyama, 390: Kochi, 400: Fukuoka, 401: Kitakyushu, 410: Saga,
    - 420: Nagasaki, 430: Kumamoto, 440: Oita, 450: Miyazaki, 460: Kagoshima, 470: Okinawa
- Channel codes (service)
    - g1: NHK General 1, g2: NHK General 2
    - e1: NHK Educational TV 1, e2: NHK Educational TV 2, e3: NHK Educational TV 3, e4: NHK OneSeg 2
    - s1: NHKBS1, s2: NHKBS1 (102ch), s3: NHKBS Premium, s4: NHKBS Premium (104ch)
    - r1: NHK Radio 1st, r2: NHK Radio 2nd, r3: NHKFM
    - n1: NHK Net Radio No. 1, n2: NHK Net Radio No. 2, n3: NHK Net Radio FM
    - tv: all TV, radio: all radio, netradio: all net radio
    - When searched multiple channels at once with "tv" etc., the same program will be hit multiple times.
- Genre codes
    - 0000: News (Comprehensive)
    - 0002: News (Special)
    - 0003: News (Politics / Diet)
    - 0005: News (Overseas / International)
    - 0009: News (Local / Regional)
    - 0100: Sports (Sports News)
    - 0101: Sports (Baseball)
    - 0102: Sports (Soccer)
    - 0102: Sports (Olympic Games / International Games)
    - 0203: Information (Health / Medical)
    - 0205: Information (Gourmet / Cooking)
    - 0300: Drama (Domestic drama)
    - 0301: Drama (Overseas drama)
    - 0302: Drama (Historical drama)
    - 0402: Music (Classical / Opera)
    - 0409: Music (Nursery Rhymes / Kids)
    - 0500: Variety (Quiz)
    - 0502: Variety (Talk)
    - 0504: Variety (Music)
    - 0600: Movie (Western)
    - 0601: Movie (Japanese)
    - 0602: Movie (Anime)
    - 0700: Anime (Domestic)
    - 0800: Documentary / Culture (Society / Current Affairs)
    - 0801: Documentary / Culture (History / Travel)
    - 0803: Documentary / Culture (Space / Science / Medicine)
    - 0807: Documentary / Culture (Documentary in general)
    - 0903: Theater / Performance (Rakugo / Performance)
    - 1000: Hobbies / Education (Travel / Fishing / Outdoor)
    - 1007: Hobbies / Education (Conversation / Language)
    - 1008: Hobbies / Education (Infants / Elementary School Students)
    - 1010: Hobbies / Education (University students / Examinations)
    - 1100: Welfare (Elderly)
    - 1104: Welfare (Sign language)

APPENDIX-ja
- ご利用アカウントの "My Apps" ページにて、あらかじめ API Key を生成しておく必要があります。
    - https://api-portal.nhk.or.jp/my-apps/
- 番組データは "Program List API" もしくは "Program Genre API" 経由で取得されます。
    - 無料で利用可能です。 https://api-portal.nhk.or.jp/
- 地域 https://api-portal.nhk.or.jp/doc-request
    - 010:札幌, 011:函館, 012:旭川, 013:帯広, 014:釧路, 015:北見, 016:室蘭, 020:青森,
    - 030:盛岡, 040:仙台, 050:秋田, 060:山形, 070:福島, 080:水戸, 090:宇都宮, 100:前橋,
    - 110:さいたま, 120:千葉, 130:東京, 140:横浜, 150:新潟, 160:富山, 170:金沢, 180:福井,
    - 190:甲府, 200:長野, 210:岐阜, 220:静岡, 230:名古屋, 240:津, 250:大津, 260:京都,
    - 270:大阪, 280:神戸, 290:奈良, 300:和歌山, 310:鳥取, 320:松江, 330:岡山, 340:広島,
    - 350:山口, 360:徳島, 370:高松, 380:松山, 390:高知, 400:福岡, 401:北九州, 410:佐賀,
    - 420:長崎, 430:熊本, 440:大分, 450:宮崎, 460:鹿児島, 470:沖縄
- チャンネル(サービス)
    - g1:NHK総合1, g2:NHK総合2
    - e1:NHKEテレ1, e2:NHKEテレ2, e3:NHKEテレ3, e4:NHKワンセグ2
    - s1:NHKBS1, s2:(102ch), s3:NHKBSプレミアム, s4:(104ch)
    - r1:NHKラジオ第1, r2:NHKラジオ第2, r3:NHKFM
    - n1:NHKネットラジオ第1, n2:NHKネットラジオ第2, n3:NHKネットラジオFM
    - tv:テレビ全て, radio:ラジオ全て, netradio:ネットラジオ全て
    - "tv" 等で複数チャンネルを一括検索した場合、多くの場合、同じ番組が複数回ヒットします。
- ジャンル
    - 0000:ニュース/報道(定時・総合)
    - 0002:ニュース/報道(特集・ドキュメント)
    - 0003:ニュース/報道(政治・国会)
    - 0005:ニュース/報道(海外・国際)
    - 0009:ニュース/報道(ローカル・地域)
    - 0100:スポーツ(スポーツニュース)
    - 0101:スポーツ(野球)
    - 0102:スポーツ(サッカー)
    - 0102:スポーツ(オリンピック・国際大会)
    - 0203:情報/ワイドショー(健康・医療)
    - 0205:情報/ワイドショー(グルメ・料理)
    - 0300:ドラマ(国内ドラマ)
    - 0301:ドラマ(海外ドラマ)
    - 0302:ドラマ(時代劇)
    - 0402:音楽(クラシック・オペラ)
    - 0409:音楽(童謡・キッズ)
    - 0500:バラエティ(クイズ)
    - 0502:バラエティ(トークバラエティ)
    - 0504:バラエティ(音楽バラエティ)
    - 0600:映画(洋画)
    - 0601:映画(邦画)
    - 0602:映画(アニメ)
    - 0700:アニメ/特撮(国内アニメ)
    - 0800:ドキュメンタリー/教養(社会・時事)
    - 0801:ドキュメンタリー/教養(歴史・紀行)
    - 0803:ドキュメンタリー/教養(宇宙・科学・医学)
    - 0807:ドキュメンタリー/教養(ドキュメンタリー全般)
    - 0903:劇場/公演(落語・演芸)
    - 1000:趣味/教育(旅・釣り・アウトドア)
    - 1007:趣味/教育(会話・語学)
    - 1008:趣味/教育(幼児・小学生)
    - 1010:趣味/教育(大学生・受験)
    - 1100:福祉(高齢者)
    - 1104:福祉(手話)
*/


Download

2021-02-23 (C) Questetra, Inc. (MIT License)
https://support.questetra.com/ja/addons/nhk-program-guide-programs-search/
Addonファイルのインポートは Professional でのみご利用いただけます

Notes

  • NHKへの露出を自動検知します。(業界トレンド語、地元地域、競合他社など)
    • 検索結果がゼロの場合、何も更新されません。処理エラーにもなりません。
    • 情報検知をトリガーにした「ステークホルダーへの情報発信業務」など
  • チャンネルと開始時刻等でフィルタすれば、お気に入りの番組の放送概要を取得することが可能です。
  • 8日先までの日時が指定可能です。
    • “YYYY-MM-DD” で始まる文字列で指定します。(”日時型データ” の参照でも構いません)
    • 動的に「プロセス開始日」や「プロセス開始日の翌日21時」をConfigセットしたい場合
  • 検索結果リスト(TSV)
    • 番組ID、サービス名、開始時刻、終了時刻、番組タイトル、サブタイトル、内容、出演者
    • 時刻は “ISO 8601 拡張形式” の文字列(YYYY-MM-DDThh:mm:ss+09:00)

Capture

指定地域チャンネルの指定日番組表を検索します。キーワード、番組ジャンル、時刻範囲によるフィルタが可能です。なお、キーワード検索は番組タイトル・サブタイトル・放送内容・出演者の結合文字列に対して適用されます。(NHK番組の情報提供:NHK)

Appendix

  • ご利用アカウントの “My Apps” ページにて、あらかじめ API Key を生成しておく必要があります。
  • 番組データは “Program List API” もしくは “Program Genre API” 経由で取得されます。
  • 地域 https://api-portal.nhk.or.jp/doc-request
    • 010:札幌, 011:函館, 012:旭川, 013:帯広, 014:釧路, 015:北見, 016:室蘭, 020:青森,
    • 030:盛岡, 040:仙台, 050:秋田, 060:山形, 070:福島, 080:水戸, 090:宇都宮, 100:前橋,
    • 110:さいたま, 120:千葉, 130:東京, 140:横浜, 150:新潟, 160:富山, 170:金沢, 180:福井,
    • 190:甲府, 200:長野, 210:岐阜, 220:静岡, 230:名古屋, 240:津, 250:大津, 260:京都,
    • 270:大阪, 280:神戸, 290:奈良, 300:和歌山, 310:鳥取, 320:松江, 330:岡山, 340:広島,
    • 350:山口, 360:徳島, 370:高松, 380:松山, 390:高知, 400:福岡, 401:北九州, 410:佐賀,
    • 420:長崎, 430:熊本, 440:大分, 450:宮崎, 460:鹿児島, 470:沖縄
  • チャンネル(サービス)
    • g1:NHK総合1, g2:NHK総合2
    • e1:NHKEテレ1, e2:NHKEテレ2, e3:NHKEテレ3, e4:NHKワンセグ2
    • s1:NHKBS1, s2:(102ch), s3:NHKBSプレミアム, s4:(104ch)
    • r1:NHKラジオ第1, r2:NHKラジオ第2, r3:NHKFM
    • n1:NHKネットラジオ第1, n2:NHKネットラジオ第2, n3:NHKネットラジオFM
    • tv:テレビ全て, radio:ラジオ全て, netradio:ネットラジオ全て
    • “tv” 等で複数チャンネルを一括検索した場合、多くの場合、同じ番組が複数回ヒットします。
  • ジャンル
    • 0000:ニュース/報道(定時・総合)
    • 0002:ニュース/報道(特集・ドキュメント)
    • 0003:ニュース/報道(政治・国会)
    • 0005:ニュース/報道(海外・国際)
    • 0009:ニュース/報道(ローカル・地域)
    • 0100:スポーツ(スポーツニュース)
    • 0101:スポーツ(野球)
    • 0102:スポーツ(サッカー)
    • 0102:スポーツ(オリンピック・国際大会)
    • 0203:情報/ワイドショー(健康・医療)
    • 0205:情報/ワイドショー(グルメ・料理)
    • 0300:ドラマ(国内ドラマ)
    • 0301:ドラマ(海外ドラマ)
    • 0302:ドラマ(時代劇)
    • 0402:音楽(クラシック・オペラ)
    • 0409:音楽(童謡・キッズ)
    • 0500:バラエティ(クイズ)
    • 0502:バラエティ(トークバラエティ)
    • 0504:バラエティ(音楽バラエティ)
    • 0600:映画(洋画)
    • 0601:映画(邦画)
    • 0602:映画(アニメ)
    • 0700:アニメ/特撮(国内アニメ)
    • 0800:ドキュメンタリー/教養(社会・時事)
    • 0801:ドキュメンタリー/教養(歴史・紀行)
    • 0803:ドキュメンタリー/教養(宇宙・科学・医学)
    • 0807:ドキュメンタリー/教養(ドキュメンタリー全般)
    • 0903:劇場/公演(落語・演芸)
    • 1000:趣味/教育(旅・釣り・アウトドア)
    • 1007:趣味/教育(会話・語学)
    • 1008:趣味/教育(幼児・小学生)
    • 1010:趣味/教育(大学生・受験)
    • 1100:福祉(高齢者)
    • 1104:福祉(手話)

See also

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

%d人のブロガーが「いいね」をつけました。