はじめに
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()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/15 17:16