ちょっと便利なslack bot作った

ゼミの夏休みの宿題としてpythonでちょっと変わったslack botを作りました。
大きな機能として3つあります。

雑談対話機能

f:id:matatsuna:20160920122954p:plain
ドコモのAPIの雑談会話機能を実装しました。
リプライを送るとそれに反応してくれます。
dev.smt.docomo.ne.jp

プログラミング実行環境支援機能

例えば以下のようなサイトに書いてあるサンプルを実行して、確認するのにイチイチ新しいファイルを作るのがめんどくさいので、ソースコードを貼り付けだけでslack botがURLを返してくれるようにしました。
PHPでフォームからデータを受け取る方法(GETとPOST) | TechAcademyマガジン

対応言語

  • html

f:id:matatsuna:20160924231326p:plain

f:id:matatsuna:20160924231340p:plain
htmlとphpはファイルをサーバーにおくだけでできました。

  • processing

f:id:matatsuna:20160924231457p:plain
processingjsにコードを挿入して実装しました。

f:id:matatsuna:20160924231409p:plain
f:id:matatsuna:20160924231414p:plain
このことについては後日記事を別に書きます。

超高性能計算システム

f:id:matatsuna:20160924232257p:plain
wolframalphaのapiをたたいて、計算結果を画像で返信させています。
slackが画像を展開してくれるのできれいにできました。
詳しいapiのたたき方は後日記事にします。
www.wolframalpha.com

この3つの機能をゼミ合宿で、プログラミング実行環境支援機能とHSPの部分をABPro2016で発表しました。
abpro.jp

大自然豊かな栃木県のさくら那須モータースクールに2週間の合宿免許しに行ってきた

8月31日から9月14日まで栃木県のさくら那須モータースクールに運転免許を取得しに行ってきました。
オートマチックでとったので2週間まるまるかかりました。

免許の取り方

2週間何をするのか制度の大まかなことは知ってたほうがいいですね。戸惑いました。
www.shikakun.net

申し込み

5月に行くことは決まってて、6月半ばに本腰でネットを調べたのですが、すでに場所によっては埋まってたりしてました。
あと、ネットだと見にくかったり、調べにくいので、ファミマにおいてある雑誌「WAO!!」に頼りました。雑誌で、大まかな場所とプランを決めて、ネットのフォームからまだ、空いてるかどうかの問い合わせをすると調べてくれて、電話で返答が帰ってきました。
希望の場所はすでに埋まってたのですが、空いてる場所として、さくら那須モータースクールを勧めらたのでそこにしました。
結構ギリギリだったと思います。早めに予約を入れることをお勧めします。申し込みサイトによっては早期割引や団体割引があるので調べたほうがいいかもしれないです。
www.mentoro.jp

出発

東京方面から行く場合、東京駅から宇都宮駅まで新幹線で行くのが普通ですが、大宮まで行ってから乗りました。宇都宮につくと、大きなバックを持った同じような年代の人たちが微妙な距離を保ちながら待ってました。迎えのバスが来て、いざ、さくら那須モータースクールに行きました。宇都宮から40分ぐらいかかりました。

さくら那須モータースクールのいいとこわるいとこ

いいとこ
  • 教習車がマツダアクセラで新車(本当に良かった)
  • 寮と教習所が同じ敷地内(暇な空き時間は寮に帰って作業してた)
  • まわりに何もないから歩行者も比較的少なくて運転しやすい(たまに高齢者の自転車とかあってヒヤッとするけど、基本田んぼだらけ)
  • 教習所の待合室も寮の部屋の中もWiFi完備(しかも5GHz!)
  • 自転車で15分のところにスーパー(2L数本買って、みんなで割り勘した)
  • 焼き餃子、揚げ餃子、蒸し餃子、期間中にめっちゃ餃子食べた(食堂の運営が有名な宇都宮餃子専門チェーン店の宇都宮餃子館 | 餃子の通販、お取り寄せ、店舗情報)
  • ご飯がおいしかった(朝から味噌汁、毎食サラダが食える幸せ、毎食の食べ放題部分が充実してた)
  • お楽しみ特典がしゃぶしゃぶと餃子食べ放題(幸せだった)
  • 近くの日本三大美肌の湯の一つである喜連川温泉に無料で行ける(時間が合わなくて1回しか行けなかったけど最高だった)
わるいとこ
  • 栃木弁がわからない時は本当にわからない(教習で困ることはなかった)
  • 寮の玄関が喫煙所(通るたびに死にそうだった)
  • まわりに商業施設はない(ネットさえあれば呼吸できるから大丈夫だったけどね)

教習所を選ぶ点で

あまり公の情報ではない可能性があるのですが、日程的に遅れることなく、第一段階で仮免を取得し、第二段階を最短で卒業できる人は68%だそうです。
卒業するときに周りを見てみると大体、そんなもんでした。
それと、見ても気にしない人もいるかもしれないですが、各都道府県の警察が教習所を卒業した人の事故率というのを発表してます。
あくまでも、教習所の教え方が悪いっていうことはないと思いますが、参考にしてみては~
栃木県警察 TOCHIGI POLICE

最後に

二週間で、同期の男子とは仲良くなれたし、いろんな方面から集まって来てるので楽しい合宿になりました。久しぶりの寮生活が緩くて楽しくて、こんな中高時代がよかったなぁ~っても思いました。
合宿大変とか聞いたりするのですが、自分の時間もたくさんあるので楽しく卒業できました。おかげで、ゼミと発表会の進捗も驚くほど出たし。毎週通いでとるよりかはコンパクトで良かったです。教習所も正解だった。
さてあとは一年以内に住民票のあるところで筆記の学科試験を受けるだけです!

togetterで1ヶ月以上前のツイートをまとめる、大量の短縮URLを展開する技

以前に書いた記事でTwitterハッシュタグをまとめようと思いtogetterでやろうとしたら、2週間前までしか表示されず、詰んでました。
matatsuna.hatenablog.com

まず、検索したら以下のサイトを使って過去のツイートをさかのぼる的な感じの記事がたくさん見つかったので
http://topsy.com/
アクセスしてみると
あ、あれ?閉鎖されてる?
www.itmedia.co.jp
マジか...

リンクを取得すればtogetterでインポートができる。
さて、どうやってリンクを取得しようか?
リンクってhtmlの中にあるんだよね?
じゃあ、htmlを解析したらリンクわかるんじゃね?
ってことでまずhtmlを取得します。
twitter.com
ここを使って目的のツイートをすべて読み込みます。(下にスクロースし続けます)
3000件読み込むのに10分弱かかりました。
読み込んだら右クリックでhtmlを保存します。
この保存にもかなり時間がかかりました。
読み込んでhtmlの中身を見てみると以下のような部分が繰り返しあるのとaタグのhrefのなかに短縮URLの形でそのツイート自体のリンクが入ってることがわかります。

<div class="js-tweet-text-container">
<p class="TweetTextSize  js-tweet-text tweet-text" lang="ja" data-aria-label-part="0">学校では、一太郎スマイルよく使ってたな~
<a href="https://t.co/MKDWhhtoos" rel="nofollow" dir="ltr" data-expanded-url="http://pictureadd.azurewebsites.net" class="twitter-timeline-link" target="_blank" title="http://pictureadd.azurewebsites.net" ><span class="tco-ellipsis"></span><span class="invisible">http://</span><span class="js-display-url">pictureadd.azurewebsites.net</span><span class="invisible"></span><span class="tco-ellipsis"><span class="invisible">&nbsp;</span></span></a> <a href="/hashtag/pictureadd?src=hash" data-query-source="hashtag_click" class="twitter-hashtag pretty-link js-nav" dir="ltr" ><s>#</s><b><strong>pictureadd</strong></b></a> <a href="https://t.co/g3xF1VDYXK" class="twitter-timeline-link u-hidden" data-pre-embedded="true" dir="ltr" >pic.twitter.com/g3xF1VDYXK</a></p>
</div>

このリンクだけを正規表現で取り出せばいいのでは?とも思ったのですが、あまり慣れてないので、processingで文字列検索をして取り出すことにしました。

String [] oritxt;
String hoge="";
void setup() {
oritxt=loadStrings("index.txt");
for (int i=0; i<oritxt.length; i++) {
 hoge=oritxt[i];
  if (hoge.length()>200) {//200文字以上でtrue
  int target= hoge.lastIndexOf("https://t.co/");
   if (target>1) {//https//t.coが含まれてたらtrue
    println(hoge.substring(target, target+23));
   }
  }
 }
println("END");
}

一回コードを書くだけなのできれいなコードとかは全く考えてないです。
これでリンクの取得ができました。
次はリンクの展開です。
複数リンクを展開するツールってのがなかなか見つからなかったのですが以下の記事を参考にすることにしました。
tech.cookbiz.co.jp
この中にあるスクリプトを張り付けて実行したところ動かない!
(もしかしたら動いてるかも?)
個人的に以下のように改良しました。(展開に使うサイトを変えました)

function tenkai(originalUrl) {
  var apiurl = "http://api.hitonobetsu.com/surl/open?url=" + encodeURIComponent(originalUrl); // (1)使うAPIを指定
  var response = UrlFetchApp.fetch(apiurl);
  var content = Utilities.jsonParse(response.getContentText("UTF-8"));
  var urls = content.original; // (2)JSONの戻り値からurlsだけを取得
  //urls.shift();  // APIの一番目は元のURLだったので要らない。先頭要素を削除
  return urls; // (3)スプレッドシートに出力(縦バージョン)
}

これで大量の短縮URLも少しづつ展開されて表示されます。
無事に元のアドレスがわかったのであとはtogetterのツイート読み込みのところに
f:id:matatsuna:20160712090027p:plain
リンクをすべて投下してやるだけでできます。
この方法で作成したまとめはこれです。
togetter.com
時間があったら大量のリンクを展開するwebサービスを作ってもいいかなと思ったので、気が向いたら実装します。