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


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

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">初めてのJavaScript(GAS)でこんなんつくりましたーー！！<br>TwitterのAPIが終了したはずなのになぜか動いております💧<br><br>「「<a href="https://twitter.com/NKOdiceBot?ref_src=twsrc%5Etfw">@NKOdiceBot</a> ダイスをふる」」<br><br>のメンションで遊べるのでぜひぜひー🔥<a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング</a> <a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%88%9D%E5%BF%83%E8%80%85?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング初心者</a> <a href="https://t.co/NpSIFxWcFy">https://t.co/NpSIFxWcFy</a></p>&mdash; んこダイスbot (@NKOdiceBot) <a href="https://twitter.com/NKOdiceBot/status/1626701574012817408?ref_src=twsrc%5Etfw">February 17, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

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

### プログラムの主な機能
①本アカウントが自分でダイスをふる

・毎日定時に「うまちんこお〇」から五文字をランダムで取り出す
・⇧の五文字をtweet
・⇧の五文字を[んこダイス公式ルール](http://ksym.jp/nkodice/rules.html)に沿ってスコア計算

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

・本アカウントにメンション「@NKOdiceBot ダイスをふる」をしたアカウントを検索する
・五文字を生成
・⇧の五文字をtweet
・⇧の五文字を[んこダイス公式ルール](http://ksym.jp/nkodice/rules.html)に沿ってスコア計算

（GASのトリガーで毎分実行）


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

```javascript

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

```javascript
//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"(個別の出目による得点)の計算

```javascript
//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

```javascript
// 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084643/eac4e065-bb39-230d-92a4-b1f33dfc652c.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