【GAS】Twitter 리스트의 갱신분을 Gmail에 보낸다
12409 단어 트위터RSSGoogleAppsScriptgasgmail
왜 만들려고 생각했는가?
원래는 RSS 리더를 GAS로 구현하려고 생각했습니다만, 만드는 것이 의외로 번거롭고 RSS의 URL 끌어 오는 것도 귀찮았기 때문에 Twitter의 List를 RSS 대신에 사용하려고 하게 되었습니다.
Twitter 사용하면 좋지 않다고 됩니다만, Twitter는 흘려 보는 것이 어려운 것과 갱신분을 모르기 때문에 메일로 했습니다.
LINE이나 Slack로 하고 싶은 분은 API 사용해 주세요.
우이
최단 1분에 1회 실행할 수 있다고 생각하므로 자주 갱신 확인하고 싶은 분은 조정해 주세요.
메일은 이런 느낌입니다.
처리 흐름
출처
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('[email protected]', 'ニュースまとめ', '', {htmlBody: htmlBody})
}
후기
설정한 시간 내의 트윗이 200 이상이면 누출이 나온다. 이것은 API의 사양이므로 어쩔 수 없다. 실행 시간을 가속화하십시오. (periodHour 변경)
뉴스 체크를 위해 만들었으므로, 트윗 내에 링크가 있는 전제로 쓰고 있습니다. 링크 없는 트윗도 문제 없게 움직인다고 생각합니다만, 무효인 링크가 붙여지므로 적당하게 수정해 주세요.
참고 자료
// 認証用インスタンス
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('[email protected]', 'ニュースまとめ', '', {htmlBody: htmlBody})
}
설정한 시간 내의 트윗이 200 이상이면 누출이 나온다. 이것은 API의 사양이므로 어쩔 수 없다. 실행 시간을 가속화하십시오. (periodHour 변경)
뉴스 체크를 위해 만들었으므로, 트윗 내에 링크가 있는 전제로 쓰고 있습니다. 링크 없는 트윗도 문제 없게 움직인다고 생각합니다만, 무효인 링크가 붙여지므로 적당하게 수정해 주세요.
참고 자료
Reference
이 문제에 관하여(【GAS】Twitter 리스트의 갱신분을 Gmail에 보낸다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/golyat/items/5dac1a63e22cc948b72f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)