BASIC NEWSの技術的な話
はじめに
このページではBASIC NEWSを生成するGoogle Apps Scriptのスクリプト
について説明しています。
BASIC NEWSは2つのスクリプトで構成されています。
- 夜間にトリガー機能で毎日実行される記事収集処理
- ブラウザから収集した記事を編集する記事編集画面
以下、この2つのスクリプトについて解説したいと思います。
記事収集処理(メイン)
メイン関数のソースは以下です。
この関数を毎日指定した時刻にトリガー機能で実行します。
function bloggerbasicmainfm01() {
// ツイッター、Googleカスタムサーチ、youtube、はてなブックマーク、koboを検索してファイルに出力する
// Googleカスタムサーチ 検索ワード
var words = [
'BASIC プログラム',
'BASIC プログラム site:chiebukuro.yahoo.co.jp',
];
// その他 検索ワード
var wordsx = [
'BASIC プログラム',
'BASIC プログラミング',
];
var kekka = '';
var kekkagcs = '';
var kekkatw = '';
var kekkahtb = '';
var kekkayou = '';
var kekkakob = '';
var ddata = '';
var ddatast = ' [\n';
var ddataen = '\n ]';
// kobo検索
for (var i = 0; i < wordsx.length; i++) {
kekkakob += kobosr(wordsx[i]);
Utilities.sleep(1000)
}
// youtube検索
for (var i = 0; i < wordsx.length; i++) {
kekkayou += youtubesr(wordsx[i]);
Utilities.sleep(1000)
}
// はてなブックマークRSS検索
for (var i = 0; i < wordsx.length; i++) {
kekkahtb += hatenabook(wordsx[i]);
Utilities.sleep(1000)
}
// twitter検索
for (var i = 0; i < wordsx.length; i++) {
kekkatw += twsrch(wordsx[i]);
Utilities.sleep(1000)
}
// 検索ワード分Googleカスタムサーチする
for (var i = 0; i < words.length; i++) {
kekkagcs += gcsget(words[i]);
Utilities.sleep(1000)
}
// JSONデータを生成
var svrfilename = 'json.txt';
ddata = ddatast + kekkatw + kekkayou + kekkagcs + kekkahtb + kekkakob.slice( 0, -2 ) + ddataen;
// Google ドライブに保存
var files = DriveApp.getFiles();
while (files.hasNext()) {
var file = files.next();
if (svrfilename == file.getName()) {
Logger.log(file.getName());
file.setContent(ddata);
Logger.log('更新完了');
};
}
return false;
}
TwitterやYoutubeなどの情報源をAPI経由等で検索。
結果をJSONファイルとしてGoogleドライブに保存してるだけです。
Googleドライブに保存したJSONを記事編集画面で利用します。
記事収集処理(kobo)
記事収集処理(メイン)から呼び出される各情報元毎の
検索関数のうちkobo書籍検索を例として載せておきます。
function kobosr(p1) {
// kobo書籍検索
var url1 = 'https://app.rakuten.co.jp/services/api/Kobo/EbookSearch/20140811?format=json&keyword=';
var url2 = encodeURIComponent(p1);
var url3 = '&language=JA&hits=5&sort=-releaseDate&applicationId=xxxx';
var url = url1 + url2 + url3;
var jsonKobo = UrlFetchApp.fetch(url).getContentText();
var book = JSON.parse(jsonKobo);
Logger.log(book.Items.length);
var kobo = '';
var jsonout = '';
var jsonwk = '';
var jsonwkhtml = '';
// 取得件数は最大5件
for (var i=0; i < book.Items.length; i++) {
//タイトル名,画像,URL,著者,概要取得
// はてな記法 * 見出し [~:] 画像
kobo += '<h2>'+book.Items[i].Item.title+'(📖)</h2>\n';
kobo += '<img src="'+ book.Items[i].Item.smallImageUrl.replace('?_ex=64x64','') +'"><br>'+'\n';
kobo += '<a href="'+book.Items[i].Item.itemUrl+'">'+book.Items[i].Item.itemUrl+'</a><br>\n';
kobo += '概要:【'+book.Items[i].Item.author+' 著】'+book.Items[i].Item.itemCaption+'<br><br>\n\n';
jsonwkhtml = '<h2>'+book.Items[i].Item.title.replace(/\"/g,'”')+'(📖)</h2>';
jsonwkhtml += '<img src=\\"' + book.Items[i].Item.smallImageUrl.replace('?_ex=64x64','') + '\\">'+'<br>';
jsonwkhtml += '<a href=\\"'+book.Items[i].Item.itemUrl+'\\">'+book.Items[i].Item.itemUrl+'</a><br>';
jsonwkhtml += '概要:【'+book.Items[i].Item.author.replace(/\n/g,'').replace(/</g,'<').replace(/>/g,'>').replace(/\"/g,'”')+' 著】'+book.Items[i].Item.itemCaption.replace(/\n/g,'').replace(/</g,'<').replace(/>/g,'>').replace(/\"/g,'”')+'<br><br>';
jsonwk = jsontemp001(book.Items[i].Item.title.replace(/\"/g,'”'),book.Items[i].Item.itemCaption.replace(/\n/g,'').replace(/</g,'<').replace(/>/g,'>').replace(/\"/g,'”'),jsonwkhtml,'no-massage','no-massage','no-massage');
jsonout += jsonwk + ',\n'
}
return jsonout;
}
kobo検索のwebapiを呼び出して書籍名を検索してJSON用
データを作成しています。
記事編集画面
記事編集画面もGASでWEBアプリを作って利用しています。
WEB画面についてはソース例を作るのが難しいので
画面のイメージと説明のみ記載します。
WEBアプリなので画面側でボタンを押すとJavascript経由で
GASの関数を呼び出してcallbackで画面側に結果を返して
います。
この画面の例ではありませんが、似たような画面を作成
したときの記事が以下にありますので参考までに
載せておきます。
ドシロウトがGASでSpreadSheetをデータベース替わりにWebアプリケーション作ってみた
BASIC NEWSでは収集した記事を最終的には人が
編集画面で削除しています。
終わりに
BASIC NEWS の技術的な部分についての話を簡単に記載
しました。
もっと簡単な方法があるかもしれませんが私の技術レベル
ではこれが限界でした。
以上
コメント
コメントを投稿