よろしくお願いいたします。
以下、GoogleAppsScript,スクリプトエディタ
// 最初にこの関数を実行し、ログに出力されたURLにアクセスしてOAuth認証する
function twitterAuthorizeUrl() {
Twitter.oauth.showUrl();
}
// OAuth認証成功後のコールバック関数
function twitterAuthorizeCallback(request) {
return Twitter.oauth.callback(request);
}
// OAuth認証のキャッシュをを削除する場合はこれを実行(実行後は再度認証が必要)
function twitterAuthorizeClear() {
Twitter.oauth.clear();
}
//認証するための関数
var Twitter = {
projectKey: 'xxxxxxxxxxxxxxxxxxxxx',
consumerKey: 'xxxxxxxxxxxxxxxxxxxxx',//API key,
consumerSecret: 'xxxxxxxxxxxxxxxxxxxxx',//API secret key,
apiUrl: "https://api.twitter.com/1.1/",
oauth: {
name: "twitter",
service: function (screen_name) { return OAuth1.createService(this.name) // Set the endpoint URLs. .setAccessTokenUrl('https://api.twitter.com/oauth/access_token') .setRequestTokenUrl('https://api.twitter.com/oauth/request_token') .setAuthorizationUrl('https://api.twitter.com/oauth/authorize') // Set the consumer key and secret. .setConsumerKey(this.parent.consumerKey) .setConsumerSecret(this.parent.consumerSecret) // Set the project key of the script using this library. .setProjectKey(this.parent.projectKey) // Set the name of the callback function in the script referenced // above that should be invoked to complete the OAuth flow. .setCallbackFunction('twitterAuthorizeCallback') // Set the property store where authorized tokens should be persisted. .setPropertyStore(PropertiesService.getUserProperties()); }, showUrl: function () { var service = this.service(); if (!service.hasAccess()) { Logger.log(service.authorize()); } else { Logger.log("認証済みです"); } }, callback: function (request) { var service = this.service(); var isAuthorized = service.handleCallback(request); if (isAuthorized) { return HtmlService.createHtmlOutput("認証に成功しました!このタブは閉じてかまいません。"); } else { return HtmlService.createHtmlOutput("認証に失敗しました・・・"); } }, clear: function () { OAuth1.createService(this.name) .setPropertyStore(PropertiesService.getUserProperties()) .reset(); }
},
api: function (path, data) {
var that = this, service = this.oauth.service();
if (!service.hasAccess()) {
Logger.log("先にOAuth認証してください");
return false;
}
path = path.toLowerCase().replace(/^//, '').replace(/.json$/, ''); var method = ( /^statuses/(destroy/\d+|update|retweet/\d+)/.test(path) || /^media/upload/.test(path) || /^direct_messages/(destroy|new)/.test(path) || /^friendships/(create|destroy|update)/.test(path) || /^account/(settings|update|remove)/.test(path) || /^blocks/(create|destroy)/.test(path) || /^mutes/users/(create|destroy)/.test(path) || /^favorites/(destroy|create)/.test(path) || /^lists/[^/]+/(destroy|create|update)/.test(path) || /^saved_searches/(create|destroy)/.test(path) || /^geo/place/.test(path) || /^users/report_spam/.test(path) ) ? "post" : "get"; var url = this.apiUrl + path + ".json"; var options = { method: method, muteHttpExceptions: true }; if ("get" === method) { if (!this.isEmpty(data)) { url += '?' + Object.keys(data).map(function (key) { return that.encodeRfc3986(key) + '=' + that.encodeRfc3986(data[key]); }).join('&'); } } else if ("post" == method) { if (!this.isEmpty(data)) { options.payload = Object.keys(data).map(function (key) { return that.encodeRfc3986(key) + '=' + that.encodeRfc3986(data[key]); }).join('&'); if (data.media) { options.contentType = "multipart/form-data;charset=UTF-8"; } } } try { var result = service.fetch(url, options); var json = JSON.parse(result.getContentText()); if (json) { if (json.error) { throw new Error(json.error + " (" + json.request + ")"); } else if (json.errors) { var err = []; for (var i = 0, l = json.errors.length; i < l; i++) { var error = json.errors[i]; err.push(error.message + " (code: " + error.code + ")"); } throw new Error(err.join("\n")); } else { return json; } } } catch (e) { this.error(e); } return false;
},
error: function (error) {
var message = null;
if ('object' === typeof error && error.message) {
message = error.message + " ('" + error.fileName + '.gs:' + error.lineNumber + ")";
} else {
message = error;
}
Logger.log(message);
},
isEmpty: function (obj) {
if (obj == null) return true;
if (obj.length > 0) return false;
if (obj.length === 0) return true;
for (var key in obj) {
if (hasOwnProperty.call(obj, key)) return false;
}
return true;
},
encodeRfc3986: function (str) {
return encodeURIComponent(str).replace(/[!'()]/g, function (char) {
return escape(char);
}).replace(/*/g, "%2A");
},
init: function () {
this.oauth.parent = this;
return this;
}
}.init();
【ライブラリ状況】
OAuth1 ver.12
TwitterWebService ver.2
【問題点】
いくつか問題点ときになる点があるので順を追って記載
*記憶が曖昧な点もございます。
1.上記のコードとライブラリ、API KEY, API Secretなどを設定したのち、関数箇所に
TwitterAuthorizeUrlを選択し、実行
2.エラーが発生(Error starting OAuth flow: <?xml version="1.0" encoding="UTF-8"?><errors><error code="415">Callback URL not approved )。どうやらcallback設定したURLにうまくアクセスできなかったようなので、Twitter DeveloperページでEnableの箇所チェックを外す。
3.何度かエラーが発生。記憶が曖昧なのですが繰り返している間に認証される
4.通常認証される際は、実行ボタンを押したのちTwitter側に認証を求められる画面が出ると思いますが、
何も出ず、関数右手にある「実行のヒント」と言う電球マークが光る
5.確認すると「メソッド ScriptApp.getProjectKey は推奨されていません。ExpandFile: Service Line: 32」
と表示される。
6.Twitter側で確認すると既に認証ずみのアプリとなっており、適応されているのか不明な状態。
流れとしては上記のような感じです。
現在、自動フォローBOTは動いておりません。
またこれと付随して、疑問点なのがTwitter側に申請したBOTのうち難点かはグレーのアイコンのものとブルーのアイコンのものがございますが、差異が不明です。
また上記のコードは同一GAS内に2枚目のスクリプトコードとして作成しました。
GASは一つのスプレッドシートに一つなどの制約などあるかも不明です。
ご質問多くなっておりますが、アドバイスいただけますと幸いです。
あなたの回答
tips
プレビュー