gas로 약간의 discord bot 만들기
그 모드를 아무래도 나는 많이 하고 있는 것 같고,
하루가 얼마나 되는지, 친구와 얼마나 차이가 있는지
알고 싶어졌습니다.
그래서 이번에는 게임의 매칭 대기 시간을 이용하여 discord의 bot를 작성해 보았습니다.
gas로 간단하게 스케줄 실행이 가능하다고 들었으므로, gas로 했습니다.
메커니즘
 htps : // r6 b. 코m/
↑는 그 게임의 통계를 보는 사이트입니다(비공식)
API 를 이용하여 통계를 얻고 있습니다.
같은 흐름을 스케줄 실행하고 있습니다.
실행 결과
 
자신의 유저명 이외는 일단 숨기고 있습니다.
사용자 이름과 총 킬 수, 어제와의 차이를 표시합니다.
 스프레드시트
 
자신의 유저명 이외는 일단 숨기고 있습니다.
A 열의 사용자 이름
B열에 킬수(초회 등록시는 0)
설정합니다.
 소스 코드
function main() {
  // チェックするユーザー, キル数を取得
  var sheet = SpreadsheetApp.getActiveSheet();
  var users = sheet.getRange('A:A').getValues();
  var count = users.filter(String).length;  // ユーザー数
  var beforeKills = sheet.getRange('B:B').getValues();
  var messages = [];
  for (var i = 0; i < count; i++) {
    var id = getPlayerId(users[i]);
    if (!id) {
      messages.push('このユーザー名は存在しません。');
      continue;
    }
    var currentKills = getThuntKills(id);
    // 差分計算
    var diff = Number(currentKills) - Number(beforeKills[i]);
    diff = Math.floor(diff);
    messages.push('総キル数: `' + currentKills + '`\n 前回との差分: `' + diff + '`');
    // スプレッドシートの更新
    sheet.getRange('B' + (i + 1)).setValue(currentKills);
  }
  // キル数でソート
  sort();
  var text = createText(count, users, messages);
  postDiscord(text);
}
/**
 * プレイヤーIDを取得する
 *
 * @param {String} username - ユーザー名
 * 
 * @returns String プレイヤーID
 */
function getPlayerId(username) {
  var url = 'https://r6.apitab.com/search/uplay/' + username;
  var response = UrlFetchApp.fetch(url);
  var content = JSON.parse(response.getContentText('UTF-8'));
  // 存在しないユーザーを確認
  if (content['foundmatch'] === false) { return false; }
  var p_id = Object.keys(content['players'])[0];
  return p_id;
}
/**
 * テロハントのキル数を取得する
 *
 * @param {String} id - プレイヤーID
 * 
 * @returns Number キル数
 */
function getThuntKills(id) {
  var url = 'https://r6.apitab.com/player/' + id;
  var response = UrlFetchApp.fetch(url);
  var content = JSON.parse(response.getContentText('UTF-8'));
  var kills = content['stats']['generalpve_kills']
  return kills;
}
/**
 * 投稿するメッセージを作成する
 *
 * @param {Int} count - ユーザー数
 * @param {Array} users - ユーザー
 * @param {Array} messages - メッセージ
 * 
 * @returns Object - 投稿するメッセージ
 */
function createText(count, users, messages) {
  var results = [];
  for (i = 0; i < count; i++) {
    results[i] = {
      'name': users[i][0],
      'value': messages[i],
      'inline': true
    };
  }
  var text = {
    "embeds": [
      {
        "color": 15105570, // orange
        "fields": results
      }
    ]
  };
  return text;
}
/**
 * Discordに投稿する
 *
 * @param {Object} text - 投稿するメッセージ
 */
function postDiscord(text) {
  var url = 'https://discordapp.com/api/webhooks/000000000000/xxxxxxxxxxxxxxxxxx';
  var params = {
    'method': 'POST',
    'headers': { 'Content-type': 'application/json' },
    'payload': JSON.stringify(text)
  };
  UrlFetchApp.fetch(url, params);
}
/**
 * キル数でソートをする
 */
function sort() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var range = sheet.getRange("A:B");
  range.sort([{ column: 2, ascending: false }]);
}
 실행 트리거
 
선택만 합니다만 아침 9시 정도에 투고되도록 했습니다.
 감상

자신의 유저명 이외는 일단 숨기고 있습니다.
A 열의 사용자 이름
B열에 킬수(초회 등록시는 0)
설정합니다.
소스 코드
function main() {
  // チェックするユーザー, キル数を取得
  var sheet = SpreadsheetApp.getActiveSheet();
  var users = sheet.getRange('A:A').getValues();
  var count = users.filter(String).length;  // ユーザー数
  var beforeKills = sheet.getRange('B:B').getValues();
  var messages = [];
  for (var i = 0; i < count; i++) {
    var id = getPlayerId(users[i]);
    if (!id) {
      messages.push('このユーザー名は存在しません。');
      continue;
    }
    var currentKills = getThuntKills(id);
    // 差分計算
    var diff = Number(currentKills) - Number(beforeKills[i]);
    diff = Math.floor(diff);
    messages.push('総キル数: `' + currentKills + '`\n 前回との差分: `' + diff + '`');
    // スプレッドシートの更新
    sheet.getRange('B' + (i + 1)).setValue(currentKills);
  }
  // キル数でソート
  sort();
  var text = createText(count, users, messages);
  postDiscord(text);
}
/**
 * プレイヤーIDを取得する
 *
 * @param {String} username - ユーザー名
 * 
 * @returns String プレイヤーID
 */
function getPlayerId(username) {
  var url = 'https://r6.apitab.com/search/uplay/' + username;
  var response = UrlFetchApp.fetch(url);
  var content = JSON.parse(response.getContentText('UTF-8'));
  // 存在しないユーザーを確認
  if (content['foundmatch'] === false) { return false; }
  var p_id = Object.keys(content['players'])[0];
  return p_id;
}
/**
 * テロハントのキル数を取得する
 *
 * @param {String} id - プレイヤーID
 * 
 * @returns Number キル数
 */
function getThuntKills(id) {
  var url = 'https://r6.apitab.com/player/' + id;
  var response = UrlFetchApp.fetch(url);
  var content = JSON.parse(response.getContentText('UTF-8'));
  var kills = content['stats']['generalpve_kills']
  return kills;
}
/**
 * 投稿するメッセージを作成する
 *
 * @param {Int} count - ユーザー数
 * @param {Array} users - ユーザー
 * @param {Array} messages - メッセージ
 * 
 * @returns Object - 投稿するメッセージ
 */
function createText(count, users, messages) {
  var results = [];
  for (i = 0; i < count; i++) {
    results[i] = {
      'name': users[i][0],
      'value': messages[i],
      'inline': true
    };
  }
  var text = {
    "embeds": [
      {
        "color": 15105570, // orange
        "fields": results
      }
    ]
  };
  return text;
}
/**
 * Discordに投稿する
 *
 * @param {Object} text - 投稿するメッセージ
 */
function postDiscord(text) {
  var url = 'https://discordapp.com/api/webhooks/000000000000/xxxxxxxxxxxxxxxxxx';
  var params = {
    'method': 'POST',
    'headers': { 'Content-type': 'application/json' },
    'payload': JSON.stringify(text)
  };
  UrlFetchApp.fetch(url, params);
}
/**
 * キル数でソートをする
 */
function sort() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var range = sheet.getRange("A:B");
  range.sort([{ column: 2, ascending: false }]);
}
 실행 트리거
 
선택만 합니다만 아침 9시 정도에 투고되도록 했습니다.
 감상
function main() {
  // チェックするユーザー, キル数を取得
  var sheet = SpreadsheetApp.getActiveSheet();
  var users = sheet.getRange('A:A').getValues();
  var count = users.filter(String).length;  // ユーザー数
  var beforeKills = sheet.getRange('B:B').getValues();
  var messages = [];
  for (var i = 0; i < count; i++) {
    var id = getPlayerId(users[i]);
    if (!id) {
      messages.push('このユーザー名は存在しません。');
      continue;
    }
    var currentKills = getThuntKills(id);
    // 差分計算
    var diff = Number(currentKills) - Number(beforeKills[i]);
    diff = Math.floor(diff);
    messages.push('総キル数: `' + currentKills + '`\n 前回との差分: `' + diff + '`');
    // スプレッドシートの更新
    sheet.getRange('B' + (i + 1)).setValue(currentKills);
  }
  // キル数でソート
  sort();
  var text = createText(count, users, messages);
  postDiscord(text);
}
/**
 * プレイヤーIDを取得する
 *
 * @param {String} username - ユーザー名
 * 
 * @returns String プレイヤーID
 */
function getPlayerId(username) {
  var url = 'https://r6.apitab.com/search/uplay/' + username;
  var response = UrlFetchApp.fetch(url);
  var content = JSON.parse(response.getContentText('UTF-8'));
  // 存在しないユーザーを確認
  if (content['foundmatch'] === false) { return false; }
  var p_id = Object.keys(content['players'])[0];
  return p_id;
}
/**
 * テロハントのキル数を取得する
 *
 * @param {String} id - プレイヤーID
 * 
 * @returns Number キル数
 */
function getThuntKills(id) {
  var url = 'https://r6.apitab.com/player/' + id;
  var response = UrlFetchApp.fetch(url);
  var content = JSON.parse(response.getContentText('UTF-8'));
  var kills = content['stats']['generalpve_kills']
  return kills;
}
/**
 * 投稿するメッセージを作成する
 *
 * @param {Int} count - ユーザー数
 * @param {Array} users - ユーザー
 * @param {Array} messages - メッセージ
 * 
 * @returns Object - 投稿するメッセージ
 */
function createText(count, users, messages) {
  var results = [];
  for (i = 0; i < count; i++) {
    results[i] = {
      'name': users[i][0],
      'value': messages[i],
      'inline': true
    };
  }
  var text = {
    "embeds": [
      {
        "color": 15105570, // orange
        "fields": results
      }
    ]
  };
  return text;
}
/**
 * Discordに投稿する
 *
 * @param {Object} text - 投稿するメッセージ
 */
function postDiscord(text) {
  var url = 'https://discordapp.com/api/webhooks/000000000000/xxxxxxxxxxxxxxxxxx';
  var params = {
    'method': 'POST',
    'headers': { 'Content-type': 'application/json' },
    'payload': JSON.stringify(text)
  };
  UrlFetchApp.fetch(url, params);
}
/**
 * キル数でソートをする
 */
function sort() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var range = sheet.getRange("A:B");
  range.sort([{ column: 2, ascending: false }]);
}

선택만 합니다만 아침 9시 정도에 투고되도록 했습니다.
감상
미래의 자신에게
해주세요.
링크
 rainbow six siege
 사용한 API
 discord webhook document
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(gas로 약간의 discord bot 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/bakuwarorin/items/164f29c446f8723d787b
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
Reference
이 문제에 관하여(gas로 약간의 discord bot 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bakuwarorin/items/164f29c446f8723d787b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)