この記事はおさむん家 Advent Calender 2049 の記事であると同時に、「アドベントカレンダーの執筆状況を定期的にDiscordへポストする」への便乗記事です。
といっても新API対応版 lsoac の副産物なので、ほとんど違いはありません。
- advent_notifier (https://twitter.com/advent_notifier)
もともとは sasairc_yasuna の検証で使っていたアカウントです。今 twitter に登録するには携帯電話が必要なんですね・・・苦肉?の策。
最新記事の番号を標準入出力で扱っている理由は 手抜き だからです。
#!/usr/bin/perl
#
# Copyright (c) 2018 sasairc
# Released under the MIT license.
# see https://github.com/sasairc/lsoac/blob/master/LICENSE
#
use strict;
use warnings;
use utf8;
use Encode;
use JSON;
use YAML::Tiny;
use LWP::UserAgent;
use Net::Twitter::Lite::WithAPIv1_1;
my $url = "https://script.google.com/macros/s/AKfycbzNeGkemsTOvDs80HnIvNRx_PYq9Sh58BA9dSur_iLbjZNTVuY/exec";
sub do_tweet
{
my $sender;
$sender = Net::Twitter::Lite::WithAPIv1_1->new (
consumer_key => '',
consumer_secret => '',
access_token => '',
access_token_secret => '',
ssl => 1,
);
return $sender->update(decode_utf8($_[0]));
}
sub main()
{
my ($day, $ua, $res, $data, @data_arr);
$day = <>; # 標準入力から前回の day を読み込む 現時点での最新記事は 1430
$ua = LWP::UserAgent->new; # UA を初期化
$res = $ua->get($url, "accept" => "application/json"); # はちよんさん謹製の API を利用 (便利)
$data = JSON->new()->utf8(0)->decode($res->content); # JSON 形式なのでパース
@data_arr = @{$data->{posts}}; # 記事構造は posts フィールドに格納されている
foreach (@data_arr) { # ぐるぐる回す
if ($_->{url} && $day < $_->{day}) {
#
# 記事の番号が新しかったらツイート その段階の day も保存しておく
#
$day = $_->{day};
do_tweet("$_->{title} by $_->{author}: $_->{url}\n");
}
}
# 最後の day を標準出力し終了
print $day;
}
main();
上記の理由により、 crontab がえらく長い。でも登録したら弄らないので平気。
*/10 * * * * sh -c "cd ~/advent-notifier-for-twitter && cat latest | ./advent-notifier-for-twitter > latest2 && mv latest2 latest"