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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

Q&A

0回答

3998閲覧

Google Apps ScriptでTwitter Botをつくりたい

Tomonyuki

総合スコア16

Google Apps Script

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

0グッド

0クリップ

投稿2016/09/20 10:08

###実現したいこと
Google Apps Scriptで、Twitter Botを作成しようとしています。

###発生している問題
OAuth認証はできたのですが、関数を実行してツイートする、ということができません。

###該当のソースコード

function twitterAuthorizeUrl() { Twitter.oauth.showUrl(); } function twitterAuthorizeCallback(request) { return Twitter.oauth.callback(request); } function twitterAuthorizeClear() { Twitter.oauth.clear(); } var Twitter = { projectKey: "", consumerKey: "", consumerSecret: "", apiUrl: "https://api.twitter.com/1.1/", oauth: { name: "twitter", service: function(screen_name) { return OAuth1.createService(this.name) .setAccessTokenUrl('https://api.twitter.com/oauth/access_token') .setRequestTokenUrl('https://api.twitter.com/oauth/request_token') .setAuthorizationUrl('https://api.twitter.com/oauth/authorize') .setConsumerKey(this.parent.consumerKey) .setConsumerSecret(this.parent.consumerSecret) .setProjectKey(this.parent.projectKey) .setCallbackFunction('twitterAuthorizeCallback') .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(); Twitter.tweet = function(data, reply) { var path = "statuses/update"; if ("string" === typeof data) { data = {status: data}; } else if(data.media) { path = "statuses/update_with_media "; } if (reply) { data.in_reply_to_status_id = reply; } return this.api(path, data); }; var data = { "status": "ツイート文" }; var res = Twitter.api("statuses/update", data);

###試したこと
様々なサイトを拝見して、掲載されているコードを試してみたのですが、上手くいきません。正直、上記コード各部がどんな働きをしているとか、どういう過程が必要なのかもよくわかっていない状況です。丸投げだといわれてしまえば言い返せないのですが、ここからどうやったらツイートさせることができるのか、どうか、教えていただければ幸いです。

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

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

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

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

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

kei344

2016/09/20 17:33

「Twitter.api("statuses/update", data);」でデータが遅れていない、ということでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問