鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

YAPC::Asia 2014 Talks 総選挙

皆様お元気でしょうか。YAPCトークに応募された方々は 日々一喜一憂していると思います。 そんな、あなたのためにツイッターランキング作ってみました。 なんとトップは2倍以上の得票を得ているんですwwww

そして、YAPCに参加する方々、自分の推しスピーカーが登壇しない 危機にあるかもしれません。ぜひ応援してあげてください。 CD買わなくても投票できます。

YAPC 2014 Talks Social Ranking

私のMojoliciousトークは81位という微妙な位置におります。 気になる方がいらっしゃりましたら、ソーシャルボタンを押してください。

参考資料

http://memememomo.hatenablog.com/entry/20100828/1282989622 http://dqn.sakusakutto.jp/2010/06/perlhtml.html

追記

フェイスブックとハテブに対応しました。

ソース

use strict;
use warnings;
use Mojo::Template;
use LWP::UserAgent;
use HTML::TreeBuilder;
use HTML::TreeBuilder::XPath;
use HTML::Selector::XPath 'selector_to_xpath';
use WebService::Simple;
use Data::Dumper;

$|=1;

my $url = 'http://yapcasia.org/2014/talk/list';

my $user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)";

my $ua = LWP::UserAgent->new('agent' => $user_agent);

#my $http_proxy = "http://your_proxy_host:8080/";

# proxyメソッドを使う場合
#$ua->proxy([qw(http https)], $http_proxy);

my $res = $ua->get($url);
my $html = $res->content;

my $tree = HTML::TreeBuilder::XPath->new;
$tree->parse($html);
my @htmls = $tree->findnodes(selector_to_xpath('div.title div a'));
my @speakers = $tree->findnodes(selector_to_xpath('p.name a'));

my $ws_t = WebService::Simple->new(
    base_url        => 'http://urls.api.twitter.com/1/urls/count.json',
   response_parser => 'JSON'
);

my $ws_f = WebService::Simple->new(
    base_url        => 'https://api.facebook.com/method/fql.query',
);

my @talks = ();
for $html(@htmls){

  my $url = "http://yapcasia.org" . $html->attr('href');
  my $json_t = $ws_t->get( { url => $url } )->parse_response;
  my $xml_f = $ws_f->get( { query => "select  like_count from link_stat where url='" . $url . "'"  } )->parse_response;

   my $res = $ua->get('http://api.b.st-hatena.com/entry.count?url=' . $url );
   my $hatebu = $res->content;
   my $hatebu_c = ($hatebu eq "") ? 0 : $hatebu;

  
  my $speaker = shift @speakers;

  my $talk = {
    name  => $html->as_text,
    url   => $url,
    count =>  $json_t->{count} + $xml_f->{link_stat}->{like_count} + $hatebu_c,
    speaker => $speaker->as_text,
  };
  push (@talks, $talk);
}

my @sorted_talks = sort { $b->{count} <=> $a->{count} } @talks;

my $mt = Mojo::Template->new;

my $output = $mt->render(<<'EOF', @sorted_talks);
% my (@talks) = @_;
% my $i = 1;
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Talks Social Ranking - YAPC::Asia Tokyo 2014 </title>
</head>
<body>
  <table>
    <th>
      <td>Rank</td>
      <td>Name</td>
      <td>Speker</td>
      <td>Tweeted</td>
    </th>
    % for my $talk (@talks) {
    <tr>
      <td <%= ($i>50)? 'style="color: #ee22bb; "' : '' %>><%= $i %></td>
      <td><a href ="<%= $talk->{url} %>"><%= $talk->{name} %></td>
      <td><%= $talk->{speaker} %></td>
      <td><%= $talk->{count} %></td>
    </tr>
    % $i++;
    % }
  </table>
  <footer><a href="http://dokechin.hatenablog.com">@dokechin</a> update <%= localtime %></footer>
</body>
</html>
EOF

print $output;