Typetalkに証券コードを書いたら株価を返すbotを作ってみたに書いたようなbotを作ってみたのですが、前日比も一緒にかえってきてくれた方が便利な事に気付きました。
ということで、Google Apps Script(GAS)のコードに、Yahooファイナンスから前日比を取得(スクレイピング)してくる部分を追記してみました。
職業プログラマーではないので、適当なコードですが、とりあえず動いているので、参考までに公開してみたいと思います。
動作イメージ
Google Apps Script(GAS)のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
function createReplyMessage(message) { var stockCode = message; var response = UrlFetchApp.fetch("http://stocks.finance.yahoo.co.jp/stocks/detail/?code=" + stockCode); var myRegexp = /<td class="stoksPrice">([\s\S]*?)<\/td>/i; var match = myRegexp.exec(response.getContentText()); var amount = match[1]; var myRegexp = /<h1>([\s\S]*?)<\/h1>/i; var match = myRegexp.exec(response.getContentText()); var title = match[1]; var myRegexp = /<td class="change">([\s\S]*?)<\/td>/i; var match = myRegexp.exec(response.getContentText()); var str = match[1]; var change = str.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,'') //htmlタグを削除 var rtn = title + '(' + stockCode + ')は' + amount + '円です。\n' + change + 'です。'; return rtn; } var Typetalk = { getMessage: function (e) { var data = e.postData && JSON.parse(e.postData.getDataAsString()); return data && data.post; }, composeReplyMessage: function (message, postId) { var response = { "message" : message, "replyTo" : postId }; return ContentService.createTextOutput(JSON.stringify(response)) .setMimeType(ContentService.MimeType.JSON); } } function doPost(e) { try { var post = Typetalk.getMessage(e); if (post) { var message = createReplyMessage(post.message); if (message) { return Typetalk.composeReplyMessage(message, post.id); } } } catch(ex) { return Typetalk.composeReplyMessage(ex.toString(), null); } } |
追加したのは、10行目から13行目の部分です。
<td class=”change”></td>の中の部分が前日比だったので引っ張ってきたのですが、単純にこのままただ出力すると、余計なhtmlタグも結果に含まれてしまうようでした。
ということで、JavaScriptでHTMLタグを削除する正規表現を参考に、13行目に取得したデータからhtmlタグを削除する処理も追加してみました。これでいい感じになりました。
最後に14行目の出力フォーマットに前日比を加え、完成といった感じですね。
最後に
このコード、4桁の存在する証券コードを打ち込めば望んだ結果がかえってきますが、文字列など打ち込むとエラーがかえってきます。
あまり書き込まないトピックなので良いかとは思っていますが、存在する証券コード以外だと無視するような感じにした方が使い勝手は良いと思うので、また気が向いたら修正するかもしれません。
追記
Yahooファイナンスからのスクレイピングはどうも禁止されているようです。
なので、この手法はやっちゃだめなものですね。
代替手段考えます。
スクレイピング先を株探に変えればいけると思うので多分そうします。
コメント