| | 109 | sub channel_recent { |
| | 110 | my $self = shift; |
| | 111 | $self->_login unless $self->{_logged_in}; |
| | 112 | |
| | 113 | # <li> |
| | 114 | # <a href="http://woremacx.nowa.jp/" title="woremacx"> |
| | 115 | # <img src="http://image.nowa.jp/icon/0000003bceb4da8eb19ca8ee838060c92294026b25fab89-s.png" width="16" height="16" alt="" /> |
| | 116 | # </a> |
| | 117 | # <a href="http://woremacx.nowa.jp/" class="blue-cms"> |
| | 118 | # woremacx |
| | 119 | # </a> |
| | 120 | # <span class="body"> |
| | 121 | # ヴ |
| | 122 | # <a href='http://nowa.jp/ch/vavava/' class='blue-cms'>#vavava</a> |
| | 123 | # </span> |
| | 124 | # <span class="time">(<a href="http://woremacx.nowa.jp/status/177736" class="blue-cms">36分前</a>)</span> |
| | 125 | # </li> |
| | 126 | my $s = scraper { |
| | 127 | process 'ul#article-list > li', 'msgs[]' => scraper { |
| | 128 | process_first 'a.blue-cms', |
| | 129 | 'user', 'TEXT', |
| | 130 | 'userlink', '@href'; |
| | 131 | process 'span.body', |
| | 132 | 'body', 'TEXT'; |
| | 133 | process 'span.body > a', |
| | 134 | 'channel', 'TEXT', |
| | 135 | 'channellink', '@href'; |
| | 136 | process 'span.time > a', |
| | 137 | 'permalink', '@href'; |
| | 138 | }; |
| | 139 | }; |
| | 140 | my $res = $self->scrape($s, URI->new('http://my.nowa.jp/channel/recent')); |
| | 141 | my @data; |
| | 142 | for my $msg (@{ $res->{msgs} }) { |
| | 143 | next unless $msg->{permalink}; |
| | 144 | |
| | 145 | my $user = ($msg->{userlink} =~ m!^http://([^\.]+)\.nowa\.jp/!)[0]; |
| | 146 | my $body = $msg->{body}; |
| | 147 | $body =~ s/\s+#\w+$//; |
| | 148 | |
| | 149 | push(@data, +{ |
| | 150 | body => Encode::encode('utf-8', $body), |
| | 151 | user => $user, |
| | 152 | permalink => $msg->{permalink}->as_string, |
| | 153 | channel => $msg->{channel}, |
| | 154 | }); |
| | 155 | } |
| | 156 | return wantarray ? @data : \@data; |
| | 157 | } |
| | 158 | |
| | 170 | sub _internal_api { |
| | 171 | my $self = shift; |
| | 172 | my $method = shift; |
| | 173 | |
| | 174 | my $uri = URI->new_abs($method, NOWA_HOME); |
| | 175 | |
| | 176 | my($sec, $fsec) = time() =~ /^(\d+)(?:\.(\d+))?$/; |
| | 177 | $fsec = substr($fsec, 0, 3); |
| | 178 | $fsec .= '0' while length $fsec < 3; |
| | 179 | my $uniqid = sprintf('%d%d', $sec, $fsec); |
| | 180 | |
| | 181 | $uri->query_form( |
| | 182 | rkey => $self->{rkey}, |
| | 183 | uniqid => $uniqid, |
| | 184 | ); |
| | 185 | |
| | 186 | $self->{mech}->get($uri->as_string); |
| | 187 | my $res = JSON::Syck::Load($self->{mech}->content); |
| | 188 | croak "fetch recent failed." if ref($res) eq 'HASH' and $res->{result} eq 'fail'; |
| | 189 | $res; |
| | 190 | } |
| | 191 | |