なんで作ろうと思ったか
元々はRSSリーダーをGASで実装しようと思ったのですが、作るのが意外と面倒でRSSのURL引っ張ってくるのも面倒だったのでTwitterのListをRSS代わりに使おうということになりました。
Twitter使えばいいじゃないってなりますが、Twitterは流して見るのが難しいのと更新分がわからないのでメールにしました。
LINEやSlackでしたい方はAPI使ってください。
UI
- Twitterのリストの登録
- 1日に1回そのリストの更新分がメールで送られてくる
- リンククリックでそのサイトが開く
最短1分で1回実行できると思うので頻繁に更新確認したい方は調整してください。
メールはこんな感じです。
処理フロー
- Twitterの特定のリストの読み込み
- 時間でフィルタして更新分のみ取得
- メール文への整形
- メール送信
ソース
Twitterの認証は参考資料1または参考資料2を参照してください。
// 認証用インスタンス
var twitter = TwitterWebService.getInstance(
//必要なライブラリ 1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSXf2E_KBBPC3xTF
'aaa', // 作成したアプリケーションのConsumer Key
'bbb' // 作成したアプリケーションのConsumer Secret
);
// 認証
function authorize() {
twitter.authorize();
}
// 認証解除
function reset() {
twitter.reset();
}
// 認証後のコールバック
function authCallback(request) {
return twitter.authCallback(request);
}
var service = twitter.getService();
function getListTweets(listName, userName, count, retweet) {
return JSON.parse(service.fetch('https://api.twitter.com/1.1/lists/statuses.json?slug='+ listName +
'&owner_screen_name=' + userName +
'&count=' + count +
'&include_rts=' + retweet));
}
function getHtmlBodyFromListUpdate(listName, userName, periodHour) {
//@userNameのlistNameリストを200ツイート分読み込む、リツイートはなし(false)
return getListTweets(listName, userName, 200, false)
.filter(function(x) {
//periodHour時間以内のツイート取得。x.created_atは東京時間ではないがnew Dateが
//勝手に東京時間にしてくれる、えらい。getTime()でミリ秒取得
return new Date(x.created_at).getTime() > new Date().getTime() - periodHour * 60 * 60 * 1000
}).map(function(x) {
//ツイート内部の改行削除
return x.text.replace(/\n/g, '')
}).reduce(function(acc, cur) {
//見た目の処理。URLが2つある場合は最初のURLが使用される。残りは消える。
const url = pullUrls(cur)[0];
return acc + '<li><a href=' + url + '>' + removeUrls(cur) + '</a></li><br>'
}, '<ol>') + '</ol>';
}
//文字列内のURLをすべて取得する。返り値は配列
function pullUrls(str) {
const urls = str.match(/(http(s)?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/gi);
return (urls == null) ? [] : urls;
}
//文字列内のURLをすべて削除する。返り値はURLのなくなった文字列
function removeUrls(str) {
return str.replace(/(http(s)?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/gi, "");
}
function main() {
const htmlBody = getHtmlBodyFromListUpdate('listName', 'userName', 24)
GmailApp.sendEmail('xxx@email.address', 'ニュースまとめ', '', {htmlBody: htmlBody})
}
あとがき
設定した時間内のツイートが200以上だと漏れが出る。これはAPIの仕様なので仕方ない。実行時間を早めるなどしてください。(periodHourの変更)
ニュースチェックのために作ったので、ツイート内にリンクがある前提で書いてます。リンクなしのツイートも問題なく動くと思いますが、無効なリンクが貼られるので適当に修正してくだいさい。