GoogleAppsScript에서 Twitter 이미지 수집
5977 단어 트위터GoogleAppsScript오, ぇ D 리브
7일째 도 썼습니다 @w_cota 가 보내 드리겠습니다.
소개
당사 Advent Calendar 8일째 에서 @ ぺ와 _t 도 말씀 드렸습니다만 당사에서는 효율화 등 다양한 목적으로 Spreadsheets를 비롯한 많은 Google Apps를 이용하여 운영하고 있습니다.
사내에서도 운영에 관련된 KPI 지표이며 이벤트 스케줄 나름을 Spreadsheets 등으로 관리하고 있으며, 이들을 효율화하기 위해 사내 엔지니어는 GoogleAppsScript(이하 GAS)를 활용하여 편리 스크립트 등을 쓰고 있습니다만, 나는 거의 GAS를 만지지 않았다.
거기서 이번 이런 기회도 얻은 것이고 일념 발기, 우선은 GAS를 만져 보지 않을까 하는 것으로 완전하게 취미의 스크립트를 써 보았으므로 그 소개 등.
개요
GAS와 TwitterAPI를 이용하여 특정 사용자의 타임라인에 게시된 이미지를 오로지 수집합니다.
수집한 이미지는 Spreadsheets에 URL을 내보내고 GoogleDrive에 저장합니다.
구현
코드.gs// OAuth1認証
var twitter = TwitterWebService.getInstance(
'consumer_key',
'consumer_secret'
);
// Twitter認証
function authorize() {
twitter.authorize();
}
// コールバック
function authCallback(request) {
return twitter.authCallback(request);
}
// 特定ユーザのタイムラインを取得
function getUserTimeline() {
// 書き込み先のスプレッドシートを取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
var as = SpreadsheetApp.getActiveSheet();
// 現在のシートの状態を確認
var col = as.getLastRow() + 1;
var urls = as.getRange(1, 1, col).getValues();
// 画像を保存するドライブのフォルダを指定
// https://developers.google.com/apps-script/reference/drive/folder
var folder = DriveApp.getFolderById('画像を保存するGoogleDriveのフォルダID');
// TwitterAPIでタイムラインを取得してJSONパース
// https://dev.twitter.com/rest/reference/get/statuses/user_timeline
var twitter_id = 'タイムラインを取得したいTwitterID';
var service = twitter.getService();
var response = service.fetch('https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name='+twitter_id);
var tweets = JSON.parse(response);
var url, is_duplicate, tweet, imageBlob;
or (var i=0; i<tweets.length-1; i++) {
is_duplicate = false;
tweet = tweets[i];
// 写真が添付されているツイートのみピックアップ
if (tweet.entities.media!=undefined && tweet.entities.media[0].type=='photo') {
// ツイートに添付されている枚数分だけ繰り返す
for(var k=0; k<tweet.extended_entities.media.length; k++) {
// JSONから画像のURLを取得
url = tweet.extended_entities.media[k].media_url;
// 写真のURLが重複しているかどうかチェック
for (var j=0; j<col; j++) {
if (urls[j][0] == url) {
is_duplicate = true;
break;
}
}
// 重複していなかったらシートへ書き込み
if(!is_duplicate) {
as.getRange(col, 1).setValue(url);
col++;
urls = as.getRange(1, 1, col).getValues();
// ドライブにアップロード
// https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app
imageBlob = UrlFetchApp.fetch(url).getBlob();
folder.createFile(imageBlob);
}
}
}
}
}
이번 주안으로는 GAS를 사용해 보는 것이 목적이었으므로, TwitterAPI에의 액세스는 yoshiyuki-hirano님의 이 글 로 소개되고 있습니다 라이브러리를 사용시키고 받았습니다.
GAS와 TwitterAPI를 이용하여 특정 사용자의 타임라인에 게시된 이미지를 오로지 수집합니다.
수집한 이미지는 Spreadsheets에 URL을 내보내고 GoogleDrive에 저장합니다.
구현
코드.gs// OAuth1認証
var twitter = TwitterWebService.getInstance(
'consumer_key',
'consumer_secret'
);
// Twitter認証
function authorize() {
twitter.authorize();
}
// コールバック
function authCallback(request) {
return twitter.authCallback(request);
}
// 特定ユーザのタイムラインを取得
function getUserTimeline() {
// 書き込み先のスプレッドシートを取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
var as = SpreadsheetApp.getActiveSheet();
// 現在のシートの状態を確認
var col = as.getLastRow() + 1;
var urls = as.getRange(1, 1, col).getValues();
// 画像を保存するドライブのフォルダを指定
// https://developers.google.com/apps-script/reference/drive/folder
var folder = DriveApp.getFolderById('画像を保存するGoogleDriveのフォルダID');
// TwitterAPIでタイムラインを取得してJSONパース
// https://dev.twitter.com/rest/reference/get/statuses/user_timeline
var twitter_id = 'タイムラインを取得したいTwitterID';
var service = twitter.getService();
var response = service.fetch('https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name='+twitter_id);
var tweets = JSON.parse(response);
var url, is_duplicate, tweet, imageBlob;
or (var i=0; i<tweets.length-1; i++) {
is_duplicate = false;
tweet = tweets[i];
// 写真が添付されているツイートのみピックアップ
if (tweet.entities.media!=undefined && tweet.entities.media[0].type=='photo') {
// ツイートに添付されている枚数分だけ繰り返す
for(var k=0; k<tweet.extended_entities.media.length; k++) {
// JSONから画像のURLを取得
url = tweet.extended_entities.media[k].media_url;
// 写真のURLが重複しているかどうかチェック
for (var j=0; j<col; j++) {
if (urls[j][0] == url) {
is_duplicate = true;
break;
}
}
// 重複していなかったらシートへ書き込み
if(!is_duplicate) {
as.getRange(col, 1).setValue(url);
col++;
urls = as.getRange(1, 1, col).getValues();
// ドライブにアップロード
// https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app
imageBlob = UrlFetchApp.fetch(url).getBlob();
folder.createFile(imageBlob);
}
}
}
}
}
이번 주안으로는 GAS를 사용해 보는 것이 목적이었으므로, TwitterAPI에의 액세스는 yoshiyuki-hirano님의 이 글 로 소개되고 있습니다 라이브러리를 사용시키고 받았습니다.
// OAuth1認証
var twitter = TwitterWebService.getInstance(
'consumer_key',
'consumer_secret'
);
// Twitter認証
function authorize() {
twitter.authorize();
}
// コールバック
function authCallback(request) {
return twitter.authCallback(request);
}
// 特定ユーザのタイムラインを取得
function getUserTimeline() {
// 書き込み先のスプレッドシートを取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
var as = SpreadsheetApp.getActiveSheet();
// 現在のシートの状態を確認
var col = as.getLastRow() + 1;
var urls = as.getRange(1, 1, col).getValues();
// 画像を保存するドライブのフォルダを指定
// https://developers.google.com/apps-script/reference/drive/folder
var folder = DriveApp.getFolderById('画像を保存するGoogleDriveのフォルダID');
// TwitterAPIでタイムラインを取得してJSONパース
// https://dev.twitter.com/rest/reference/get/statuses/user_timeline
var twitter_id = 'タイムラインを取得したいTwitterID';
var service = twitter.getService();
var response = service.fetch('https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name='+twitter_id);
var tweets = JSON.parse(response);
var url, is_duplicate, tweet, imageBlob;
or (var i=0; i<tweets.length-1; i++) {
is_duplicate = false;
tweet = tweets[i];
// 写真が添付されているツイートのみピックアップ
if (tweet.entities.media!=undefined && tweet.entities.media[0].type=='photo') {
// ツイートに添付されている枚数分だけ繰り返す
for(var k=0; k<tweet.extended_entities.media.length; k++) {
// JSONから画像のURLを取得
url = tweet.extended_entities.media[k].media_url;
// 写真のURLが重複しているかどうかチェック
for (var j=0; j<col; j++) {
if (urls[j][0] == url) {
is_duplicate = true;
break;
}
}
// 重複していなかったらシートへ書き込み
if(!is_duplicate) {
as.getRange(col, 1).setValue(url);
col++;
urls = as.getRange(1, 1, col).getValues();
// ドライブにアップロード
// https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app
imageBlob = UrlFetchApp.fetch(url).getBlob();
folder.createFile(imageBlob);
}
}
}
}
}
그리고 이상과 같이 내용으로서는 매우 간단하게 되어 있다고 생각합니다.
마지막으로 getUserTimeline 함수가 정기적으로 움직이도록 GAS에서 설정합니다.
※ 실행간격은 API의 상한을 넘지 않도록 && 줍고 싶은 유저의 TL의 속도와 합치고
나중에 적당히 기다리고 있으면 ...
이 거리!
제대로 드라이브에 업로드되었습니다.
이것이 어떻게 스마트 폰 앱의 운영에 연결되는지는 스스로도 모르겠지만 우선 생각해 낸 것을 형태로 할 수 있어서 좋았습니다.
주요 개선점
가끔 오류를 뱉고 있습니다.
주의점
여기까지 쓰고 있습니다만, 자신 이외의 Twitter에 흐르고 있는 화상을 GoogleDrive에 올리거나, 저작권이 되어 초상화권이 되어 귀찮은 생각이 들기 때문에 빡빡하지 않는 것이 좋다고 생각합니다.
참고 자료
htp // 요시유키-히라노. 하테나 bぉg. jp/엔트리/2015/10/13/010317
htp : // bg. 히카 69. 이 m/bぉg/2014/01/28/굉장히 ぇ- psssc리 pt/
htps : //에서 ゔぇぺぺrs. 오, ぇ. 코 m / 아 ps-sc 리 pt / 레후 렌세 / sp 라 d ぇ t /
htps : //에서 v. 라고 r. 코 m / 레 st / 푸 b c
Reference
이 문제에 관하여(GoogleAppsScript에서 Twitter 이미지 수집), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/w_cota/items/a87b421ba8bc2b90a938
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
htp // 요시유키-히라노. 하테나 bぉg. jp/엔트리/2015/10/13/010317
htp : // bg. 히카 69. 이 m/bぉg/2014/01/28/굉장히 ぇ- psssc리 pt/
htps : //에서 ゔぇぺぺrs. 오, ぇ. 코 m / 아 ps-sc 리 pt / 레후 렌세 / sp 라 d ぇ t /
htps : //에서 v. 라고 r. 코 m / 레 st / 푸 b c
Reference
이 문제에 관하여(GoogleAppsScript에서 Twitter 이미지 수집), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/w_cota/items/a87b421ba8bc2b90a938텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)