2019/06/05(水)【雨量観測】XRAINのスクリーンショットを会社Slackに投稿するPerlスクリプト

天気情報が流れるチャンネルが会社のSlackにあるのですが、XRAINのスクリーンショットも流れてきてほしくなったので作りました。

ちなみに大学生の頃は大学院の研究室訪問や大学院試験の費用を稼ぐために気象会社でアルバイトしていました。

SlackのtokenとチャンネルIDの取得情報はググってください。

$logo は会社のロゴと矢印が描かれた画像で、矢印の先にオフィスがあるという具合になっています。適当な画像を用意して置き換えてください。

CPANモジュール以外は何か特別にインストール必要なものはありませんでした。

#!/usr/bin/evn perl

use strict;
use warnings;
use utf8;
use Log::Log4perl qw(:easy);
use WWW::Mechanize::Chrome;
use File::Spec;
use File::Basename 'dirname';
use HTTP::Request::Common qw//;
use Encode;
use Furl qw//;
use JSON;
use Imager;
use DDP;

# TODO:
#  * 会社付近の色を取得して雨が降っているか判定

my $dirname = File::Spec->rel2abs(dirname($0));
my $rain_url = 'http://www.river.go.jp/x/krd0207010.php?lon=139.50406730175018&lat=35.674031853779084&opa=0.4&zoom=8&leg=0&intvl=5&ext=0';
my $fn= $dirname . "/xrain.png";
my $logo = $dirname . '/logo_and_arrow.png';

Log::Log4perl->easy_init($ERROR);
my $mech = WWW::Mechanize::Chrome->new(headless => 1);
$mech->viewport_size({ width => 760, height => 780 });
$mech->get($rain_url);
my $png = $mech->content_as_png;

open(my $fh, '>', $fn) or die $!;
binmode($fh);
print {$fh} $png;
close $fh;

my $img = Imager->new;
$img->read(file => $fn) or die $img->errstr;

$img->rubthrough(
  src  => do {
    my $tmp = Imager->new;
    $tmp->read(file => $logo) or die $tmp->errstr;
    $tmp;
  },
  tx => 460,
  ty => 527,
);

$img->rubthrough(
  src  => do {
    my $tmp = Imager->new;
    $tmp->read(file => $logo) or die $tmp->errstr;
    $tmp;
  },
  tx => 1203,
  ty => 527,
);

$img->rubthrough(
  src  => do {
  my $tmp = Imager->new;
    $tmp->read(file => $logo) or die $tmp->errstr;
    $tmp;
  },
  tx => 460,
  ty => 1170,
);
$img->rubthrough(
  src  => do {
    my $tmp = Imager->new;
    $tmp->read(file => $logo) or die $tmp->errstr;
    $tmp;
  },
  tx => 1203,
  ty => 1170,
);

$img->write(file => $fn) or die $img->errstr;

my $req = HTTP::Request::Common::POST('https://slack.com/api/files.upload',
  Content_Type => 'multipart/form-data',
  Content => [
    token    => 'xxxx',
    channels => 'xxxx',
    file     => [$fn],
    title    => Encode::encode_utf8('XRAIN自動投稿'),
    initial_comment => $rain_url,
  ]
);

my $res = Furl->new->request($req);
my $json = Encode::decode_json($res->content);

#p $json;

うまくいけば↓のように投稿されます。cronで定期実行させています。

スクリーンショット_2019-06-05_21_19_07.png