paiza times

paizaがお届けする、テック・キャリア・マネジメント領域における「今必要な情報」を届けるWebメディア

logo

paizaがお届けする、テック・キャリア・マネジメント領域の「今必要な情報」を届けるWebメディア

プログラミング未経験でもできた!文系女子がGASでTwitterのbot作ってみた


Picture by ITエンジニアを目指す女子高生たちの学園ライフ4コマ漫画『ぱいじょ!』

f:id:paiza:20200213232443j:plain こんにちは。ブログ初登場のヤマダです(実はオフィス移転パーティーの記事には登場してます)。普段はpaiza運営事務局で、採用企業のサポートをしています。

世間では2/14といえば…そう、バレンタインですね!みなさんはチョコレートをあげたりもらったりしましたか? paizaではプログラミングができることが正義なので、できない人はチョコレートをもらえません!チョコがほしいなら最低でもスキルチェックでBランクは取ってほしいですね!(嘘です)

……とか言っている自分はというと、今のところまだDランクしか取れていません。ごめんなさい。「いつかはBランクを……」と思いながらかれこれ3年近くたちました。後輩も増えてきてさすがにこれではいけないなと思うようになり最近勉強を始めています。

そして今回は勉強の成果を後輩たちに示すため、GAS(Google Apps Script)を使ったTwitterのbot作りに挑戦してみました。せっかくだしバレンタインぽいものが作りたいなと思ったので、チョコを配る霧島京子ちゃんbotを作ってみました

霧島京子ちゃんというのはpaizaで連載中のエンジニアを目指す女子高生の日常(?)を描いた4コマ漫画『ぱいじょ!』の主人公で、学習講座にも登場している女の子のことです。

この記事では、プログラミングほぼ初心者の私がどうやって勉強してbotを作ったかを紹介します。JavaScriptを使って何か作ってみたいと思っていた人、Twitterのbot作りに興味がある人の参考になればうれしいです。

まだ今日チョコをもらえていない人はぜひ京子ちゃんからもらってみてください!

botを作るまで:JavaScriptを勉強したよ

さきほどは「後輩たちにいいところを見せるため」とか書きましたが、実際には「エンジニアではないけど、スプレッドシートとか使うし、GASを使って業務を効率化できるといいなぁ」と思っていました。

弊社エンジニアはみんな優しいのでお願いしたら(忙しい合間をぬって)やってくれますが、せっかくプログラミング学習コンテンツを提供している会社なのだから、できることなら自分でなんとかしたいなと。

というわけでpaizaラーニングの「JavaScript入門編」をまず受講してみました。霧島京子ちゃんがかわいい声で解説してくれるので頑張れます! 中の人(上間江望さん)も大好きです!

JavaScriptの基本的な書き方、条件文・if文、配列の基礎まではこの講座で学べます。

あとは「レベルアップ問題集」という名前で公開されている、スキルチェックの練習問題もやりました。これは時間制限がないのと、テストケースや解答例も見れるので勉強にピッタリなんですよ。

ちなみにJavaScriptは標準入力の処理がちょっと難しいので、こちらの動画講座も参考にしてくださいね。(「JavaScript」で検索してみてね)

また、弊社ではエンジニアがプログラミング未経験者向けに勉強会(通称「修行」)を開催してくれていて、分からない問題の解き方を教えてもらったり、こういうSQL書いて分析したいんだけど…と相談したりできます!いいでしょー!

というわけで、JavaScriptの基礎を学んで、GASに挑戦してみました。いろいろできてすごいですね。

以下の記事を書いた編集担当のおじさんも「bot作りは楽しい、超楽しい」って言ってましたし、最終的なゴールである仕事のツールを作る勉強にもなりそうなので頑張ってやってみます!

paiza.hatenablog.com

GASを使ってチョコを配るbotを作る

まずは何をしたいかを挙げてみました。こんな感じです。

  • 「チョコほしい」とリプライされたら自動でリプライしたい
  • ツイート内容はランダムにしたい

それを実現するためにどうすればいいか、エンジニアにも聞きつつ考えてみました。

  • TwitterのAPIを使う必要がありそう
  • GASで処理させると良さそう
  • ツイートしたい文言をスプレッドシートに入れておき、そこから取ってくればよさそう

なんとなくやることは分かりました。

※なお、これ以降にはバレンタインbotのネタバレが含まれるので「先に遊んでみたい!」という方はpaiza公式Twitterアカウント宛に「チョコほしい」という文字を含んだリプライをしてみてください。ぜひフォローもお願いします!

(2/15 追記)リプライを返すbotの運用は2/14 23:59をもって終了しました。遊んでくださった皆さまありがとうございました。

事前準備

TwitterのAPI利用申請をしよう

振り返ると、このAPI利用申請を通すのがめちゃくちゃ大変でした。英語で申請して、詳細をもっと送れと英語でメールが来たら英語で返信しないといけないので……。プログラミングをがんばるはずだったのに英語で挫折を味わいました。

ここは先人たちの知恵をお借りしましょう……。以下の情報を参考にしました。

Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2019年8月時点の情報 - Qiita

2回リジェクトされるとそのアカウントで再申請はできなくなるみたいなので気をつけてください。自分のアカウントで申請してみたのですが、1回リジェクトされました……。怖かった……。

スプレッドシートに自動リプライしたい内容を書こう

今回はチョコを配るbotということで、こんな感じでリプライ内容を用意しました。

リプライをくれたユーザーのTwitter IDを覚えておくためにA列を使います。初期値としてA列にはひとまず”1”と入れておきます。(リプライもらったらここが更新されます。)

B列にツイート内容とハッシュタグ、C列に画像URLを記載します。

f:id:paiza:20200213141035j:plain

GASでTwitter APIを利用するための設定をしよう

API申請が承認されたあとにTwitterのDeveloper画面のAppsメニューから今回のbotの情報を登録します。

登録後に「Keys and tokens」タブで確認できるCustomer API keysの情報をGASで使います。(詳しくはさきほどAPI申請時に参考にした記事に記載されています)

f:id:paiza:20200213142906j:plain

GASプロジェクトにbotの処理を実装

初めて使う方はGASを追加する必要があります。Google Driveの追加メニューからその他 > アプリを追加 > Google Apps Scriptを検索して追加してください。追加するとメニューに表示されるようになりますのでプロジェクトを新規作成してください。

f:id:paiza:20200213143806p:plain

まず、TwitterのAPIをGASで扱うにはライブラリをインポートする必要があります。これはすでに先人が作成してくださっているものを利用させてもらいましょう。

プロジェクトのリソース > ライブラリで表示されたダイアログに
Mb2Vpd5nfD3Pz-_a-39Q4VfxhMjh3Sh48
を入力してライブラリを追加します。

つづいてTwitterの基本機能(ツイートするとかタイムライン取得するとか)を使うためのコードを書きます。「Twitter.gs」として保存しておきましょう。このあたりは以下の記事を参考にしました。

【GAS】Twitterのbotを作ってみました。サクッとできます! | Webird Programming.Tech

OAth認証が成功したら準備OKです。

チョコを配るbot部分のコードを書こう

ようやく本題にたどり着きました。大きく分けると以下の2つの動作を実装する必要があります。

  • 「チョコほしい」とリプライされたら自動リプライする
  • ツイートしたい文言をランダムでスプレッドシートから取る

さきほど作成した「Twitter.gs」とは別に「BotCode.gs」というファイルを作成し書いていきたいと思います。

まず、リプライ処理をする関数をmyFunctionで呼び出す部分を頭に書いておきます。のちほど説明しますが、このmyFunctionがトリガーで呼び出す関数となります。

function myFunction() {
 reply();
}

reply関数の中身を書いていきます。なにはともあれスプレッドシートの情報を取得しましょう。

 //リプライ内容を書いたスプレッドシートの情報を取得
 var spreadsheet = SpreadsheetApp.openById('**********'); // スプレッドシートのIDを指定
 var sheet = spreadsheet.getSheets()[0]; // 最初のシートを取得

スプレッドシートの情報の取り方は他にもありますが、今回はID指定をして最初のシートを取る方法にしました。

IDというのはスプレッドシートのURLの***のところをいいます。

https://docs.google.com/spreadsheets/d/**********/edit

次に「チョコほしい」という単語を含んだリプライをもらったらリプライするという部分を書きます。

リプライをくれた相手のTwitter IDをスプレッドシートのA1に格納してあるので、それを取得してリプライをする必要があります。

 //取得したリプライのIDをシートのA1セルから取得
 var last_id = sheet.getRange("A1").getValue();
 var retobj = {};
 retobj = getNewReply(last_id);
 last_id = retobj.last_id;

「チョコほしい」という単語を含んでいたら、chocolate関数で取得した内容をくっつけてリプライを送ります。

    var text = value['text'];
    text = text.replace(/ /g," ");
    
    //「チョコほしい」という単語に反応する
    if (text.indexOf('チョコほしい') != -1) {
      var mes = chocolate();
      text = text.replace(/チョコほしい/g,"");
      
      //リプライを送る
      var status = "@"+value['user']['screen_name']+" " + mes;
      var replyTo = value.id_str;

      Twitter.tweet(status,replyTo);
      }

ここが一番肝心な処理ですが、スプレッドシートからランダムで内容を取得してresultという変数に入れてreply関数に返します。

選択肢は自由に増減させられるように最終行の番号を取得して、何行目を取るかrandom関数で決めています。今回はB列のツイート内容をtweet1、画像URLをtweet2に入れて最後にまとめてresultに入れました。

//返信の内容をスプレッドシートからランダムで取得する
function chocolate() {
  try {
    //リプライ内容を書いたスプレッドシートの情報を取得
    var spreadsheet = SpreadsheetApp.openById('**********');
    var sheet = spreadsheet.getSheets()[0]; //最初のシート
    var maxRow = sheet.getDataRange().getLastRow(); //最終行の番号を取得
    var rand_res = ~~( Math.random() * maxRow ) +1; //ランダムで行数を決める

    //B列:ツイート内容とハッシュタグ
    var tweetString1 = "B" + rand_res;
    var tweet1 = sheet.getRange(tweetString1);

    //C列:画像URL
    var tweetString2 = "C" + rand_res;
    var tweet2 = sheet.getRange(tweetString2);

    //リプライ内容をresultに入れてReply関数へ返す
    var result = tweet1.getValue() + tweet2.getValue();
    return result;
  
  } catch(e) {
 }
}

リプライをもらったIDを記憶する処理をはじめ、こちらの記事を大変参考にさせていただきました。ありがとうございます。

http://masayasviel.hatenablog.jp/entry/2017/12/03/141311

ちなみに、今回わたしが書いたbot側の全コードはこちらから

GAS実行のためのトリガーを設定しよう

処理は書けましたがこのままではGASを実行するためのトリガー(きっかけ)がないためリプライされても何も起こりません。

そこでGASのプロジェクトの編集 > 現在のプロジェクトのトリガーを選択し、「トリガーを追加」しましょう。

実行する関数はmyFunction、1分間隔で実行させます。本当はリプライが来たら~というような条件にしたいのですが、GASにはそういった機能はないので(そういう処理を書いたらできるのかもしれませんが…)最大1分くらいなら遅延してもまあいいだろうということでこうしました。

霧島ちゃんバレンタインbot完成!

エンジニアの方からしたらかなり拙いbotだとは思いますが…なんとか一人で(先人たちの知恵もふんだんにお借りしながら)作ることができました。

皆さんもぜひ遊んでみてくださいね。公式Twitterアカウントはこちら

今後の課題

本当は画像のURLではなくて、ツイートに画像添付をして自動リプライをさせたかったのですが、Dランクのスキルではなかなかうまくいかず、気がつけば今日になってしまいました……。

今回はバレンタインデーに間に合わないと意味がなかったのでこのような形になりましたが、もう少し時間があれば実現できそうだったので引き続きGASを勉強しつつ実装してみたいと思います!

paizaは学習講座はもちろんですが、ゲーム感覚で遊びながらプログラミングが学べるコンテンツもあるので、楽しく勉強を続けることができます。

ちなみに以下の画像は実際に作ったpaiza仕様のチロルチョコです。

f:id:paiza:20200213225317j:plain

まとめ

というわけでプログラミングほぼ未経験者の人間がバレンタインにチョコを配るbotを作ってみました。

botを1つ作るのでも結構手間取りましたし、大変な部分もありましたが、調べながら作ってみるのは楽しくもありました。

今後自分の仕事のためになにか作れそうな自信も出てきました! ちなみにスキルチェックのBランク…はまだ難しいですが、Cランクに挑戦して無事ランクアップしました。こんなわたしでもできたので皆さんもぜひチャレンジしてみてください!

そして「プログラミングを勉強し始めたものの、作ってみたいものとか思いつかないな…」という人はとりあえず簡単なbotくらいから始めてみるといいかもしれません。成果が目に見えると楽しいので。

paizaラーニングはJavaScriptだけでなく、PythonやRuby、C#など主要言語の入門講座や、DjangoやFlaskなどWebアプリケーション開発の講座も公開しています。

詳しくはこちら
paizaラーニング




paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

そしてpaizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

詳しくはこちら
paizaのスキルチェック

paizaのおすすめコンテンツ

PPG proken プログラミングゲーム「初恋 プログラミング研究会〜海に行こうよ〜」 PPG Bingo プログラミングゲーム「コードレビューBINGO!!」
paiza転職 paiza新卒 EN:TRY paizaラーニング 記事内に記載している情報は、記事公開時点でのものとなります。 Copyright Paiza, Inc, All rights reserved.