LoginSignup
0
0

More than 1 year has passed since last update.

Twitterで遊べるワードゲームをつくった!【んこダイス, 初心者🔰, twitter API】

Last updated at Posted at 2023-02-17

⇩⇩つくったもの⇩⇩
https://twitter.com/NKOdiceBot

おことわり

説明だいぶはしょってます(^^;
この記事はちょっとずつ更新していくつもりですのでストックお願いしますm(__)m
質問があればコメントでよろしくです~

プログラムの主な機能

①本アカウントが自分でダイスをふる

・毎日定時に「うまちんこお〇」から五文字をランダムで取り出す
・⇧の五文字をtweet
・⇧の五文字をんこダイス公式ルールに沿ってスコア計算

②本アカウントが他者にダイスをふらせる

・本アカウントにメンション「@NKOdiceBot ダイスをふる」をしたアカウントを検索する
・五文字を生成
・⇧の五文字をtweet
・⇧の五文字をんこダイス公式ルールに沿ってスコア計算

(GASのトリガーで毎分実行)

「うまちんこお〇」から五文字をランダムで取り出す


const letters = ['',  '',  '',  '',  '',  '',  '',];
const sprSh = SpreadsheetApp.getActiveSpreadsheet();
const sheetMy = sprSh.getSheetByName("しとmy");
let lastRow_sheetMy = sheetMy.getLastRow()
// ⇧(letのグローバル宣言について)例:関数A,Bにわたる一連の実行の間に
// Aの時とBの時でlasiRow1の値が変化(再代入)するならばletを使う

function generateFiveLetters(){
  let rolledWord_array = [];
  for (let i = 0; i<5 ; i++){
    let nmbData = "";
    nmbData = Math.floor(Math.random()*letters.length);
    let generatedWord = letters[nmbData];
    rolledWord_array.push(generatedWord)
  }
  const jw = rolledWord_array.join("");
  return jw
}

五文字をtweet

//TwitterAPIにリクエスト送る呪文
function forPost(msg) {
  const res = getTwitterService().fetch(
    "https://api.twitter.com/2/tweets", {
      'method' : 'post',
      'contentType' : 'application/json',
      'payload' : JSON.stringify({
      "text": msg,
      })
    }
  )
  const parsedRes = JSON.parse(res)
  Logger.log(parsedRes.data)
  Logger.log(parsedRes.data.id)
  return res
}

//tweetした五文字をスプレに記録する(その後のスコア計算のため)
function logWordTweetId_onSheetMy(joinedLetters,tweetId_str){
  const nowTime = new Date();
  sheetMy.appendRow(
    [joinedLetters,nowTime.toTimeString() +" / "+ nowTime.toDateString(),tweetId_str]
    )
}

function postGeneratedFiveLetters(){
  const msg = generateFiveLetters()
  const response_gottenContentText_parsed = JSON.parse(forPost(msg).getContentText())
  const joinedLetters = msg
  
  Logger.log("パースされた⇒"+response_gottenContentText_parsed)
  const tweetId_str = response_gottenContentText_parsed.data.id
  Logger.log(tweetId_str)

  logWordTweetId_onSheetMy(joinedLetters,tweetId_str)

  // ⇩append使用NG!!!because最終行からget⇒最終行にsetしてるから
  sheetMy.getRange(lastRow_sheetMy +1,3).setValue(tweetId_str)
}

公式ルール"FACES"(個別の出目による得点)の計算

//GASのスプレッドシート(シート名"しとmy")とスプレの最終行を指定
const sheetMy = sprSh.getSheetByName("しとmy");
let lastRow_sheetMy = sheetMy.getLastRow()
//getActiveSpreadsheet()の参考サイト:https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app

//A列最終行にある"できた文字"(tweet済み)から文字を取得・Arrayの型に変換
const fiveLetters_latestPosted = sheetMy.getRange(lastRow_sheetMy,1).getValue()
const fiveLetters_latestPosted_array = Array.from(fiveLetters_latestPosted)
//Array.from()の参考サイト:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from

//んこダイス公式ルール"FACES"に従ってスコアを計算
function caliculateScore(fiveLetters_latestPosted){
  let u = 0
  let m = 0
  let c = 0
  for (let n = 0; n<5 ; n++){
    if (fiveLetters_latestPosted[n] === ''){
      u = u +500
      }else{if (fiveLetters_latestPosted[n] === ''){
        m = m +500
        }else{if (fiveLetters_latestPosted[n] === ''){
          c = c +500
          }else{if (fiveLetters_latestPosted[n] === ''){
              u = u + 50
              m = m + 50
              c = c + 50
            }else{if (fiveLetters_latestPosted[n] === ''){
              u = u + 100
              m = m + 100
              c = c + 100
              }else{if (fiveLetters_latestPosted[n] === ''){
                u = u + 300
                m = m + 300
                c = c + 300
                }else{Logger.log("fiveLettersの中に小便が混ざってるヨ")}
              }
            }
          }
        }
      }
  }
  const syoubenTimes = 5 - (fiveLetters_latestPosted_array.length)
  u = u + syoubenTimes * (-500)
  m = m + syoubenTimes * (-500)
  c = c + syoubenTimes * (-500)
  const totalScore = u + m + c
  const caliculatedScore = 
    ("U : "+ u + "\nM : "+ m + "\nC : "+ c + "\n\n合計スコア : "+ totalScore)
  sheetMy.getRange(lastRow_sheetMy,4).setValue(totalScore)

  return caliculatedScore
}

五文字postにリプの形式でtweet

// APIリクエストを送信
function forReply(msg, tweetId) {
  const res = getTwitterService().fetch(
    "https://api.twitter.com/2/tweets", {
      // ⇧⇧⇧⇧GAS専用のfeatchでもいけるか、という議論が巻き起こっている
      // UrlFetchApp.fetch()はIDとか含まれてないからできないと思う。
      'method' : 'post',
      'contentType' : 'application/json',
      // 'muteHttpExceptions' : true ,
      'payload' : JSON.stringify({
      "text": msg,
      "reply": {"in_reply_to_tweet_id": tweetId}
      })
    }
  );
  Logger.log(res)
  Logger.log(res.getContentText())
  Logger.log(JSON.stringify(JSON.parse(res.getContentText())));
  // expected : {"data":{"id":"1606900814865633281","text":"ぬぬめめん"}}

  Logger.log(JSON.parse(res.getContentText()));
  // expected :	{data={id=1606900814865633281, text=ぬぬめめん}}
}

全体の関数の流れ

マインドマイスターんこだいす.png

参考文献(gitHubURLあり)

このbotのコードはgitHubで見れます!!
https://github.com/5dogs/NKOdiceBot

んこダイスのルール:
http://ksym.jp/nkodice/rules.html

JavaScript公式リファレンス:
https://developer.mozilla.org/ja/

GAS(スプレッドシート部門)公式リファレンス:
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app

TwitterAPI公式リファレンス:
https://developer.twitter.com/en/docs/twitter-api

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0