ラベル GAS の投稿を表示しています。 すべての投稿を表示
ラベル GAS の投稿を表示しています。 すべての投稿を表示

2018-04-28

LINEから撮ったテキスト画像を自動で文字起こししてくれる「文字おこし君」を作りました

LINEから撮ったテキスト画像を自動で文字起こししてくれる「文字おこし君」を作りました。





目次

  • 何ができるの?
  • なんでつくったの?
  • ツイッターでの反応は?
  • 現在の稼働状況は?
  • 作り方も公開

2018-03-30

LINEから送った画像を文字起こししてくれるアプリを作るときのメモ①

ユーザーのニーズ


・卒論書く時とか、電子化されていない書物から引用したいけど、写すの糞めんどうくさい
・書評を書きたいけど、紙の本だと結構面倒くさい。
・文字起こしをしてくれるAPIのお試しページからそれをやるのも面倒くさい

実装したいもの


・Lineのインターフェイスから画像を送信したときに、その情報をGoogle Vision APIにかませて、文字おこししてかえしてくれる処理

仕様


正常系
・画像を送信すると、その画像に含まれている文字を返してくれる

異常系
・画像以外のデータ(テキスト・位置情報)を送ると、invalid dataみたいなレスポンスがちゃんと帰ってくるようにする
・文字が含まれていないもの、もしくは検出できないものに関しても、invalid imageみたいな値がちゃんと帰ってくるようにする
・APIのレスポンスを超えてしまった場合は、献金ページに移動する
・一秒間に10リクエスト以上gああると止まる

実装方法


・画像はLINEのエンドポイントからいったんbase64方式に変換して、Google Vision APIに投げると、リクエストで文字起こしした結果が返ってくる


2018-03-21

AIで似ているAV女優を紹介しているスケベAI「スケベ博士」を作りました。①アプリ紹介編

こんにちは。スケベサイエンティストのDAI(@never_be_a_pm)です。
AIで、画像から似ているAV女優を紹介してくれるLine Bot「スケベ博士」を作りました。



2018-03-19

multipart/form-dataのファイルをGoogle Apps Scriptから送信する

Google Apps Scriptでファイルを送れない


HTTPの通信を用いて、ファイルを送るとき、curlやpythonでは、コマンドでfile指定すれば、簡単にmultipartのファイルを送れる。しかし、Google Apps Script上では、簡単にmultipartを送信することができない。


2018-03-02

検索したDMMアダルトのサンプル動画をLINEからすぐ見れる「変態コンシェルジュ」を作ってみました

問題提起


こんにちは、DAIです。(@never_be_a_pm)


アダルト動画の品質は、ここ数年間でかなり品質がよくなってきています。それにつれて、サンプル動画の質も非常によくなってきています。


2018-03-01

LINEでMM号と打つと、DMMからサンプル動画を送ってくるLine Botを作成しました。

前回は画像オブジェクトをメッセージとして送信したのですが、今回はテンプレートオブジェクトで、バックグラウンドがDMM APIから取得した画像、さらに共有するURLがDMMのサンプル動画のスクリプトを作成しました。





本来であれば、動画をリスト形式で送りたいのですが、念のためバックアップを取りたいので、こちらにメモしておきます。


2018-02-27

LINEから「MM号」うつと、DMMのMM号のアダルトビデオのジャケットを返してくれるLINE Botを作成しました。

とりあえず動作確認したので、メモとして保存。
LINEで「MM号」と打つと、MM号のジャケット写真返してくれます。
本当は動画を返したいのですが、リファクタリングしてから作成したいので、とりあえず途中成果物をここに乗っけておきます。
(もちろんほかのキーワードでもいけます。)

2018-02-24

【GAS】相席ラウンジの混雑情報を、LINE Botに聞くと教えてくれる相席コンシェルジュを作ってみた

これまでの経緯


Google Apps Script上で、相席居酒屋の在席情報を一時間おきに取得し、そのデータをスプレッドシート上に保存していました。そしてそれらの値をリアルタイムでWebサイトに更新する方法を、いままで挑戦していました。


これをLINE BOT化して、どんなユーザーでもつかいやすいようにしてみました。

創ったもの


相席コンシェルジュという、LINE Botを作成しました。


Oriental Lounge Eveという相席居酒屋の、混雑状況を分析できるLine Botを作りました。QRコードから登録できます。なう→現在の混雑状況、ぶんせき→時系列データの分析ページ、あくせす→公式ページのリンクを出します。渋谷、新宿、町田店に対応しています。

以下のQRコードから友達追加することができます。



2018-02-21

Google Apps ScriptのdoGet関数・doPost関数を解説

Google Apps ScriptのdoGet() doPost()について解説


Google Apps ScriptのページのURLに、GET・POSTリクエストが送られたときに、関数を実行することができます。主に、doGet関数と、doPost関数を利用することで、これを実現できます。これらのトリガを利用して、APIを実行したりできます。ドキュメントが英語だったので、日本語にまとめます。


Google Apps ScriptでWebアプリを作る




Google Apps Scriptで、Webアプリを作ってみたいと思います。
前回までに、以下のようなことをやってきました。


相席居酒屋の客数の時系列データを、スプレッドシート上で可視化できるようにしました。しかし、これだと実際にユーザーが利用する場合、スプレッドシートにアクセスしなければならないので、すこしユーザービリティに問題があります。


今回は、Google Apps Script上で、Webアプリを作る方法についてまとめました。
完成したものはこちらです。




2018-02-20

Google Apps Scriptでスクレイピングが捗る5つの理由




Pythonでいろいろスクレイピングしてきましたが、Google Apps Scriptでのスクレイピングがかなりよいです。
今回はGoogle Apps Scriptでスクレイピングをオススメする理由を、Pythonを利用する場合と比較して解説します。


【GAS】IMPORTXML関数で取得した値を、1時間おきに定期実行で行を追加する

IMPORTXML関数で取得した結果を、一時間おきに新たに行に追加する




前回は相席屋の空席情報をIMPORTXML関数を利用して、スクレイピングしました。

相席居酒屋の空席状況をリアルタイムでスプレッドシートに更新し、グラフ化することで男しかいない糞相席屋を撲滅する試み

糞相席屋を撲滅する試み 昔友達とネタで相席居酒屋に入ったら、男しかいなくて「相席でもなんでもねえじゃん」と思って遺憾の意だったため。行くまで空席状況がわかりにくいというのが問題だと思う。

今回は、Google Apps Scriptのスクレイピングを、IMPORTXML関数で行い、その結果をGoogle Apps Scriptで定期実行プログラムを組むことによって、時系列データを取得してみたいと思います。これをすることによって、リアルタイムの1点の値ではなく、時系列データを取得することができるようになります。


2018-02-18

相席居酒屋の空席状況をリアルタイムでスプレッドシートに更新し、グラフ化することで男しかいない糞相席屋を撲滅する試み

糞相席屋を撲滅する試み


昔友達とネタで相席居酒屋に入ったら、男しかいなくて「相席でもなんでもねえじゃん」と思って遺憾の意だったため。行くまで空席状況がわかりにくいというのが問題だと思う。これは可視化しなければいけないと思った。


2018-02-11

Google Apps Scriptでスクレイピングを定期実行して、News Picksのソーシャルデータを取得する方法をまとめてみた

Google Apps Script(GAS)でスクレイピング




Google Apps Scriptで、Web上のデータのスクレイピングを定期実行する方法をまとめてみたいと思います
Google Apps Scriptは、ExcelでいうVBAのようなもので、Googleの純正アプリケーションの上に、JavaScriptを書くことで動作をさせることができます。このGoogle Apps Scriptを使って、スクレイピングツールとして利用する方法について、解説したいと思います。

初心者でもできそうです


Google Apps Scriptは、Javascriptの知識があれば簡単にできるので、初心者にもおすすめですね。

News Picksのプロフィールページの、フォロワー数といいね数をスクレイピングを定期実行しスプレッドシート上に保存


今回は、News Picksというニュースソーシャルサイトでどんなことを書いたら、いいね数やフォロワー数が増えるかを分析するシチュエーションを想定して、1時間起きにGoogle Apps Script上で、News Picksのプロフィールページから、フォロー数、フォロワー数、いいね数を取得してみたいと思います。ちなみに結果はこんな感じになりました。(1分おきと書いてしまいましたが、1時間おきでした。)





2018-02-10

Google Apps Scriptで、正規表現でスクレイピングする方法を方法を初心者向けにまとめてみた




僕が作ったわけではないのですが、Google Apps ScriptによるスクレイピングというYoutubeの動画から写経して、Google App Scriptのスクレイピングコードを勉強します。
できることとしては、Ted talksの全動画のタイトル、スピーカーをすべてGoogle Spread Sheetに取り出すことができるというものです。(詳しくは動画を見てください。)


Google App Scriptを使って、スクレイピングするメリット


そもそも、Python使ってGoogle Apps Scriptかけばええでねぇかって話なので、なぜGoogle Apps Scriptを使うのかって話から。

- サーバーを準備せずとも、定期実行が簡単


普通にPythonなどで定期実行プログラムを組むと、どうしてもサーバー立てたりする必要があります。ちょっとしたスクレイピングをする定期実行プログラムを組むために、そこまではしたくない!みたいなときに超絶使えるのが、Google Apps Scriptです。


Googleがサーバーを用意してくれるので、定期実行するにしても、サーバーを自前で用意する必要がありません。まずcronが超簡単に使えるので、簡単な定期実行プログラムを組みたいのであれば、Python用意してサーバー立ててDBに保存したいみたいな場合でも、スプレッドシートで完結するので、非常に楽です。

- JavaScriptで書ける


Google Apps Scriptは、基本的にはJavascriptで書けるので、学習コストが低いです。
また、特別にLinuxがいじれたり、DBの構築も必要がありません。Javascriptしか書けないような人でも、かけてしまうと思います。ただし、すこし正規表現の知識がないと、スクレピングは難しいかもしれません。


- データの共有が簡単


スプレッドシートを共有するだけで、データの共有ができるので、さくっとスクレピングしてきたデータを共有するなんてことができます。


https://www.youtube.com/watch?v=xkk7OxsfTpQ



やろうとしていること

僕が作ったわけではないのですが、Google Apps ScriptによるスクレイピングというYoutubeの動画から写経して、Google App Scriptのスクレイピングコードを勉強します

1. データのスクレイピング


Ted日本語ページにアクセスし、ページャーの最後までの以下の値を取得します。

  • タイトル名
  • スピーカー名
  • 作成日時



該当するページのHTMLはこんな感じ。

<div class='media__message'>
  <h4 class='h12 talk-link__speaker'>Justin Baldoni</h4>
  <h4 class='h9 m5'>
    <a class=' ga-link' data-ga-context='talks' href='/talks/justin_baldoni_why_i_m_done_trying_to_be_man_enough?language=ja' lang='ja'>
    「男らしく」在らんとすることをやめた理由
    </a>
  </h4>
  <div class='meta'>
    <span class='meta__item'>
    Posted
    <span class='meta__val'>
    Dec 2017
    </span>
    </span>
    <span class='meta__row'>
    Rated
    <span class='meta__val'>
    Inspiring, Courageous
    </span>
    </span>
  </div>
</div>


タイトル名が

<a class=' ga-link' data-ga-context='talks' href='/talks/justin_baldoni_why_i_m_done_trying_to_be_man_enough?language=ja' lang='ja'>
    「男らしく」在らんとすることをやめた理由
    </a>

スピーカー名が

<h4 class='h12 talk-link__speaker'>Justin Baldoni</h4>


作成日時が

<span class='meta__val'>
    Dec 2017
    </span>

に該当します。


検索結果のページ番号が、URLのクエリに含まれています。

https://www.ted.com/talks?language=ja&page=2

であれば、page=2、つまり2番目のページが取得できます。

https://www.ted.com/talks?language=ja&page=3


であれば、同様に、3番目のページが取得できます。
なので、N番目のページが取得できるようにするには、最後のページの番号を取得し、一つずつ数字をあげていけば全部のページにアクセスできます。


2. スプレッドシートに書き込み


スクレイピングしたデータを、スプレッドシートに書き込みます。


3. 実際のソースコード


function MainFrame() {

  var url = "https://www.ted.com/talks?language=ja"; //ted日本語のURL
  var request = UrlFetchApp.fetch(url) //http responseの取得
  var content = request.getContentText();

  //最終ページの数字を取得
  var step1 = content.match(/page=\d*/g)
  var pages = [];
  for (var i=0; i<=step1.length-1;i++){
    pages.push(step1[i].replace(/page=/,""));
  }
  var maxnum = Math.max.apply({},pages);

  //空の配列を作る

  var Speakers = [];
  var Titles = [];
  var Dates = [];

  //スクレイピング実行部分

  for (var i=1;i<=maxnum;i++){

    var url = "https://www.ted.com/talks?language=ja" + "&page=" + i;
    var request = UrlFetchApp.fetch(url);
    var content = request.getContentText();
    var speakers = SpeakersArray(content);
    var titles = TitlesArray(content);
    var dates = DateArray(content);

    for(var n=0;n<=speakers.length-1;n++){
      Speakers.push(speakers[n])
    }

    for(var n=0;n<=titles.length-1;n++){
      Titles.push(titles[n])
    }

    for(var n=0;n<=dates.length-1;n++){
      Dates.push(dates[n])
    }
  }

  //2次元配列を作成

  var Data = [];
  for(var n=0;n<=Speakers.length-1;i++){
    var data = [];
    data.push(Speakers[n]);
    data.push(Titles[n]);
    data.push(Dates[n]);
    Data.push(data);
  }  
  //スプレッドシートのid

  var id= "14OEIoSZ0RodyHgi3krhHuLDQd8k37CDy2Mm8Csrhsdk"
  var File = SpreadsheetApp.openById(id);
  var Sheet = File.getSheets();
  Sheet[0].getRange(1,1,Speakers.length,3).setValues(Data);
}

function SpeakersArray(x){

  /*実際のHTML
    <h4 class='h12 talk-link__speaker'>Justin Baldoni</h4>
  */

  //スピーカー名を配列で返す
  var step1 = x.match(/<h4\sclass='h12\stalk-link__speaker'>.*<\/h4>/g);
  var extract = []
  for (var i=0;i<=step1.length-1;i++){
    extract.push(step1[i]
  .replace(/<h4\sclass='h12\stalk-link__speaker'>/g,"")
  .replace(/<\/h4>/g,"")
  .replace(/\n/g));
  }
  return extract;

}

function TitlesArray(x){

  //スピーチタイトルを配列で返す

  /*実際のHTML
    <a class=' ga-link' data-ga-context='talks' href='/talks/justin_baldoni_why_i_m_done_trying_to_be_man_enough?language=ja' lang='ja'>
    「男らしく」在らんとすることをやめた理由
    </a>
  */

  var step1 = x.match(/<a\sclass='\sga-link'\sdata-ga-context='talks'\shref='\/talks\/.*\?language=ja'\slang='ja'>[\w\W]*?<\/a>/g,"")
  var extract = []
  for (var i=0;i<=step1.length-1;i++){
    extract.push(step1[i]
    .replace(/<a\sclass='\sga-link'\sdata-ga-context='talks'\shref='\/talks\/.*\?language=ja'\slang='ja'>/g,'')
    .replace(/<\/a>/g,"")
    .replace(/\n/g,""));
  }
  return extract;
}

function DateArray(x){

  //日付を配列で返す

  /*実際のHTML
    <span class='meta__val'>Dec 2017</span>
  */

  var step1 = x.match(/<span\sclass='meta__val'>\n*[A-z]{3}\s\d{4}\n*<\/span>/g,"")
  var extract = []
  for (var i=0;i<=step1.length-1;i++){
    extract.push(step1[i]
    .replace(/<span\sclass='meta__val'>/g,"")
    .replace(/<\/span>/g,"")
    .replace(/\n/g,""))
  }
  return extract;
}


実行すると、スプレッドシートにデータがすべてスクレイピングされ、スプレッドシートに反映されるようになります。ただし、私の環境ではメモリ不足になり確認できなかったので、ほかのタイミングで再現してみたいと思います。

関連資料


UrlFetchApp.fetch()
https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app

getContentText() : Gets the content of an HTTP response encoded as a string.
https://developers.google.com/apps-script/reference/url-fetch/http-response

match(): 正規表現を取得するメソッド
https://tonari-it.com/gas-regular-expression/

Math.max.apply:配列の最大値を取得するメソッド
https://qiita.com/YusukeHirao/items/e848f5de40beaa52e002










注目の投稿

めちゃくちゃ久しぶりにこのブログ書いたw 更新3年ぶりw > 多様性というゲームは尊厳と自由を勝ち取るゲームなのかもしれないな。  もともとツイッターでツイートした内容なんだけど、ちょっと深ぼる。 ----- 自分は男 x 30代x 二児の父 x 経営者 x 都心(共働き世...