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

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

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

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

Twitter

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

API

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

Q&A

解決済

1回答

2242閲覧

GASでTwitterのDMを取得したいが認証情報が足りないと言われる

saba_111

総合スコア1

Google Apps Script

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

Twitter

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

API

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

0グッド

0クリップ

投稿2021/01/14 09:32

はじめに

GASでTwitterbotを作ろうとしています。とりあえずの処理としてDMで受け取ったメッセージをツイートしたいと考えています。しかし、DMを取得しようとするとエラーが出てしまいます。pythonでは実装できただけにどうすれば良いか分からず困っています。

#発生するエラー
Exception: Request failed for https://api.twitter.com returned code 401. Truncated server response: {"errors":[{"code":32,"message":"Could not authenticate you."}]}

#実現したいこと
TwitterのDM(厳密に言えばDMイベント)を取得したい

#ソースコード

gas

1// セルを取得 2var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); // 「シート1」はシート名 3var postMessageCell = sheetData.getRange(2, 1); // セルの位置。縦横それぞれ1~の番号で指定できる 4 5// ツイートを投稿 6function postUpdateStatus() { 7 var service = getTwitterService(); 8 var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', { 9 method: 'post', 10 payload: { status: postMessageCell.getValue() } 11 }); 12} 13 14//ここが実行できない 15function getDmMedia(){ 16 var api = getTwitterService(); 17 var responce = api.fetch('https://api.twitter.com/1.1/direct_messages/events/list.json', { 18 method: 'get', 19 payload: {count:10} 20 }); 21} 22 23 24// Twitter AppのConsumer Api Key 25var CONSUMER_KEY = "******"; 26var CONSUMER_SECRET = "*********"; 27 28// 認証URLを取得しログに出力する 29function logAuthorizeUri() { 30 var twitterService = getTwitterService(); 31 Logger.log(twitterService.authorize()); 32} 33 34// OAuth認証をよしなにしてくれるサービスクラスのインスタンスを生成・取得する 35function getTwitterService() { 36 return OAuth1.createService('Twitter') 37 .setAccessTokenUrl('https://api.twitter.com/oauth/access_token') 38 .setRequestTokenUrl('https://api.twitter.com/oauth/request_token') 39 .setAuthorizationUrl('https://api.twitter.com/oauth/authenticate') 40 .setConsumerKey(CONSUMER_KEY) 41 .setConsumerSecret(CONSUMER_SECRET) 42 // リダイレクト時に実行されるコールバック関数を指定する 43 .setCallbackFunction('authCallback') 44 // アクセストークンを保存するPropertyStoreを指定する 45 .setPropertyStore(PropertiesService.getUserProperties()); 46} 47 48// リダイレクト時に実行されるコールバック関数 49function authCallback(request) { 50 var twitterService = getTwitterService(); 51 // ここで認証成功時にアクセストークンがPropertyStoreに保存される 52 var isAuthorized = twitterService.handleCallback(request); 53 if (isAuthorized) { 54 return HtmlService.createHtmlOutput('Success'); 55 } else { 56 return HtmlService.createHtmlOutput('Denied'); 57 } 58} 59 60function reset() { 61 var twitterService = getTwitterService(); 62 twitterService.reset(); 63} 64 65function getUserId() { 66 var service = getTwitterService(); 67 var screenName = "saba_haisin" //@screen_nameさんにDMを送る場合 68 var requestURL = "https://api.twitter.com/1.1/users/lookup.json?screen_name=" + screenName 69 var response = service.fetch(requestURL, { 70 method: "get", 71 contentType: 'application/json' 72 }); 73 var o = JSON.parse(response.getContentText()); 74 var user_id = o[0].id_str //配列で帰ってくるのでそのうちの最初の要素のuser_idを取得する 75 76 newDirectMessage(user_id) 77} 78 79function newDirectMessage(user_id){ 80 try{ 81 var service = getTwitterService(); 82 var payload = JSON.stringify({ 83 event: { 84 type: 'message_create', 85 message_create: { 86 target: { 87 recipient_id: String(user_id) 88 }, 89 message_data: { text: "テスト" } 90 } 91 } 92 }); 93 var response = service.fetch('https://api.twitter.com/1.1/direct_messages/events/new.json',{ 94 method: 'POST', 95 contentType: 'application/json', 96 payload: payload 97 }); 98 return response; 99 } catch(e) { 100 Logger.log('Exception:'+e); 101 } 102}

#補足・試したこと
DMの送信や投稿はできるため認証自体は行われていると思っています。
公式リファレンスをみても特に追加の認証が必要と言った情報は見つけられませんでした。公式リファレンス,ダイレクトメッセージイベントの取得

#pythonでDMを取得するコード
pythonでの取得する場合のコードも載せておきます。

python

1# -*- coding: utf-8 -*- 2from requests_oauthlib import OAuth1Session 3import json 4 5 6 7consumer_key='**********' 8consumer_secret='**********' 9access_token='**********' 10access_token_secret='**********' 11 12token=OAuth1Session(consumer_key,consumer_secret,access_token,access_token_secret) 13end_point = 'https://api.twitter.com/1.1/direct_messages/events/list.json' 14 15def main(): 16 params={'count':5} 17 res = token.get(end_point,params=params) 18 directmsg = json.loads(res.text) 19 #これでDMのイベントを取得 20if __name__ == '__main__': 21 main()

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

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

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

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

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

guest

回答1

0

ベストアンサー

POSTではなくGETなので、payloadは渡しません。
下記のようにurlにパラメータを付加する形としてください。

GAS

1function QueryString(dict) { 2 var keys = []; 3 for(var k in dict) { 4 keys.push(k + '=' + encodeURI(dict[k])); 5 } 6 return keys.join("&"); 7} 8 9function getDmMedia(){ 10 const api = getService(); 11 const params = {count : 10}; 12 const qs = QueryString(params); 13 const response = api.fetch(`https://api.twitter.com/1.1/direct_messages/events/list.json?${qs}`); 14 console.log(JSON.parse(response)); 15} 16

 

または単純に、QueryString関数を使わずURLに直接パラメータを付けて

GAS

1function getDmMedia(){ 2 const api = getService(); 3 const response = api.fetch('https://api.twitter.com/1.1/direct_messages/events/list.json?count=10'); 4 console.log(JSON.parse(response)); 5}

でも取れます。

投稿2021/01/15 14:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

saba_111

2021/01/15 17:16

ありがとうございます。GASに関して初心者であるため仕様が分からず格闘していました。POSTの際にはURLに付随もしくはQueryString関数を用いてリクエストを送るのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問