質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

708閲覧

GAS 自動フォローBOTが動きません。

退会済みユーザー

退会済みユーザー

総合スコア0

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2020/04/18 13:15

編集2020/04/18 13:26

よろしくお願いいたします。

以下、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は一つのスプレッドシートに一つなどの制約などあるかも不明です。

ご質問多くなっておりますが、アドバイスいただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問