Skip to content

Instantly share code, notes, and snippets.

@basictomonokai
Last active October 25, 2018 05:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save basictomonokai/bbfe4a5f79e6a1f5c93b4511ea66f601 to your computer and use it in GitHub Desktop.
Save basictomonokai/bbfe4a5f79e6a1f5c93b4511ea66f601 to your computer and use it in GitHub Desktop.
ツイッター、Googleカスタムサーチ、youtube、はてなブックマーク、koboを検索してhatenaブログに投稿
function microghymainfm01() {
// ツイッター、Googleカスタムサーチ、youtube、はてなブックマーク、koboを検索してhatenaブログに出力する
// Googleカスタムサーチ 検索ワード
var words = [
'micro:bit',
'micro:bit site:qiita.com',
'micro:bit site:teratail.com',
'micro:bit site:chiebukuro.yahoo.co.jp',
];
var kekka = '';
// 検索ワード分カスタムサーチする
for (var i = 0; i < words.length; i++) {
// Logger.log(words[i]);
kekka += gcsget(words[i])
}
// はてなブックマークRSS検索
var hkekka = hatenabook();
kekka = kekka + hkekka;
// youtube検索
var ykekka = youtubesr();
// カスタムサーチ結果+youtube検索結果
kekka += ykekka;
// twitter検索
var tkekka = twsrch();
kekka = tkekka+kekka;
// kobo検索
var kkekka = kobosr();
kekka = kekka+kkekka;
// メール送信呼び出し
sendMailHatena(kekka);
}
function sendMailHatena(honbun) {
// メール送信処理
// はてなブログメール投稿用アドレス
var toHatena = 'aaaaa@blog.hatena.ne.jp';
// ブログの件名
var titleBlog = 'micro:bit新着情報('+ Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd') + ')';
// はてなブログメール投稿用アドレスに送信
MailApp.sendEmail(toHatena,titleBlog, honbun,
{ name: '自動投稿ツール',
});
Logger.log('メール送信実行終了');
}
function gcsget(p1){
//Google カスタム検索
//検索ワードセット
var word = p1;
var apiKey = 'ggggggggg'; //apiキー
var apiUrl = 'https://www.googleapis.com/customsearch/v1/';
var query = '?q='+ encodeURIComponent(word);
query += '&cx=' + 'bbbbbbbb'; //カスタム検索エンジンID
query += '&key='+apiKey;
// 日付順
query += '&sort=date';
// 日本語
query += '&lr=lang_ja';
apiUrl = apiUrl + query;
var response = UrlFetchApp.fetch(apiUrl);
if (response.getResponseCode() !== 200) {
throw new Error('エラーのため取得できませんでした');
} else {
var res = JSON.parse(response);
}
//データを取得する
try {
//検索合計数を取得する
var totalResults = res.queries["request"][0]["totalResults"].toString();
//ログ出力
Logger.log('合計検索数:'+totalResults);
Logger.log('表示可能検索数:'+res.items.length);
//タイトル名,URL,概要取得
var out = '';
for (var i = 0; i < res.items.length; i++) {
out += '*'+res.items[i]["title"].toString()+'(&#128269;)\n';
out += 'URL:'+res.items[i]["link"].toString()+'\n';
out += '概要:'+res.items[i]["snippet"].toString().replace(/\n/g,'').replace(/</g,'<').replace(/>/g,'>')+'\n\n';
}
// Logger.log(out);
return out;
} catch(e) {
return e.toString();
}
}
function youtubesr() {
// youtube検索
var url1 = 'https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&q=';
var url2 = encodeURIComponent('micro:bit');
var url3 = '&order=date&key=ccccccccccccc';
var url = url1 + url2 + url3;
var jsonYoutube = UrlFetchApp.fetch(url).getContentText();
// Logger.log(jsonYoutube);
var video = JSON.parse(jsonYoutube);
// Logger.log(video.items.length);
youtube = '';
// 取得件数は最大5件
for (var i=0; i < video.items.length; i++) {
//タイトル名,画像,URL,概要取得
// はてな記法 * 見出し [~:] 画像
youtube += '*'+video.items[i].snippet.title+'(&#128250;)\n';
youtube += '[https://i.ytimg.com/vi/' + video.items[i].id.videoId + '/default.jpg:image]'+'\n';
youtube += 'URL:'+'https://www.youtube.com/watch?v='+video.items[i].id.videoId+'\n';
youtube += '概要:【'+video.items[i].snippet.channelTitle+'】'+video.items[i].snippet.description+'\n\n';
}
return youtube;
}
function twsrch() {
// ツイッター検索
// oauth1ライブラリ呼び出し
Logger.log('twsrch');
var service = getTwitterService();
if (service.hasAccess()) {
// var res = service.fetch("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=qiita");
var twitterSearchUrl1 = 'https://api.twitter.com/1.1/search/tweets.json?q=';
var twitterSearchWord = encodeURIComponent('\"micro:bit\"');
var twitterSearchUrl2 = '&lang=ja&result_type=recent';
var twitterSearchUrlAll = twitterSearchUrl1 + encodeURI(twitterSearchWord) + twitterSearchUrl2;
var res = service.fetch(twitterSearchUrlAll);
var json = JSON.parse(res)
Logger.log(json.statuses.length);
var twkekka = '';
for (var i=0; i < json.statuses.length; i++) {
// ユーザー名,ツイートURL,ツイート取得
// はてな記法 * 見出し [~:] 画像
twkekka += '*'+json.statuses[i].user.name+'(&#128038;)\n';
twkekka += 'ツイートURL:'+'https://twitter.com/i/web/status/'+json.statuses[i].id_str+'\n';
twkekka += 'ツイート:'+json.statuses[i].text+'\n\n';
};
return twkekka;
} else {
var authorizationUrl = service.authorize();
Logger.log('Open the following URL and re-run the script: %s',
authorizationUrl);
}
}
function getTwitterService() {
Logger.log('getTwitterService');
return OAuth1.createService("Twitter")
.setAccessTokenUrl("https://api.twitter.com/oauth/access_token")
.setRequestTokenUrl("https://api.twitter.com/oauth/request_token")
.setAuthorizationUrl("https://api.twitter.com/oauth/authorize")
.setCallbackFunction('authCallback')
.setConsumerKey("ddddddddd")
.setConsumerSecret("eeeeeeeeeee")
.setPropertyStore(PropertiesService.getUserProperties())
.setAccessToken("fffffffff", "gggggggggg"); // これだよ!!
};
function kobosr() {
// kobo書籍検索
var url1 = 'https://app.rakuten.co.jp/services/api/Kobo/EbookSearch/20140811?format=json&keyword=';
var url2 = encodeURIComponent('micro:bit');
var url3 = '&language=JA&hits=5&sort=-releaseDate&applicationId=hhhhhhhhh';
var url = url1 + url2 + url3;
var jsonKobo = UrlFetchApp.fetch(url).getContentText();
// Logger.log(jsonKobo);
var book = JSON.parse(jsonKobo);
Logger.log(book.Items.length);
var kobo = '';
// 取得件数は最大5件
for (var i=0; i < book.Items.length; i++) {
//タイトル名,画像,URL,著者,概要取得
// はてな記法 * 見出し [~:] 画像
kobo += '*'+book.Items[i].Item.title+'(&#128214;)\n';
kobo += '['+ book.Items[i].Item.smallImageUrl.replace('?_ex=64x64','') +':image:w64]'+'\n';
kobo += 'URL:'+book.Items[i].Item.itemUrl+'\n';
kobo += '概要:【'+book.Items[i].Item.author+' 著】'+book.Items[i].Item.itemCaption+'\n\n';
}
return kobo;
}
function hatenabook() {
var rss = 'http://b.hatena.ne.jp/search/text?q=micro%3abit&mode=rss&users=10&sort=recent';
var resrss = fetchTodayPosts(rss);
var out = '';
// Logger.log(resrss[0][0]);
var reshatenacnt = 5;
if (resrss.length < 5) {
reshatenacnt = resrss.length;
};
for (var i = 0; i < reshatenacnt; i++) {
// 件名,URL,概要取得
// はてな記法 * 見出し
out += '*'+resrss[i][0].toString()+'(&#128209;)\n';
out += 'URL:'+resrss[i][1].toString()+'\n';
out += '概要:'+resrss[i][2].replace(/\n/g,'').replace(/</g,'<').replace(/>/g,'>')+'\n\n';
}
return out;
}
function fetchTodayPosts(feedUrl) {
var response = UrlFetchApp.fetch(feedUrl);
var rssXML = response.getContentText();
var document = XmlService.parse(rssXML);
var root = document.getRootElement();
var ns_rss = XmlService.getNamespace('http://purl.org/rss/1.0/');
var ns_dc = XmlService.getNamespace('dc', 'http://purl.org/dc/elements/1.1/');
var ns_atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');
var ns_rdf = XmlService.getNamespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#');
var rootTagName = root.getName().toLowerCase();
var entries = [];
// 記事のリストを取得
switch (rootTagName) {
case 'rdf': // 1.0
entries = root.getChildren('item', ns_rss);
break;
case 'feed': // atom
entries = root.getChildren('entry', ns_atom);
break;
case 'rss': // 2.0
entries = root.getChild('channel').getChildren('item');
break;
default:
return false;
}
return entries.map(function(entry, index) {
var title;
var link;
var desc;
var pubDate;
switch (rootTagName) {
case 'rdf': // 1.0
title = entry.getChild('title', ns_rss).getText();
link = entry.getChild('link', ns_rss).getText();
desc = entry.getChild('description', ns_rss).getText();
pubDate = entry.getChild('date', ns_dc).getText();
break;
case 'feed': // atom
title = entry.getChild('title', ns_atom).getText();
link = entry.getChild('link', ns_atom).getAttribute('href').getValue();
desc = entry.getChild('description', ns_rss).getText();
pubDate = entry.getChild('updated', ns_atom).getText();
break;
case 'rss': // 2.0
title = entry.getChild('title').getText();
link = entry.getChild('link').getText();
desc = entry.getChild('description', ns_rss).getText();
pubDate = entry.getChild('pubDate').getText();
break;
}
return [title,link,desc];
}).filter(function(item) {
return item !== '';
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment