MATLAB 태그가 달린 최신 소식을 게시하는 Twitter bot (Powered by ThingSpeak)

했던 일



MATLAB의 최신 기사 없는가~와 Qiita를 체크하는 횟수를 줄이기 위해서, MATLAB 태그가 붙은 기사를 자동으로 알려주는 bot 를 만들었으므로 코드 공개합니다.

계정은 여기 -> @Qiita_MATLAB


이 게시물의 포인트



시간대를 가미한 처리가 편한 datetime 형 변수의 TimeZone 속성이 볼거리입니다.

간단한 예라면,
t1 = datetime();
t1.TimeZone = 'Asia/Shanghai'
t2 = t1;
t2.TimeZone = 'Europe/London'

그리고 실행하면
t1 = 
  datetime
   2019/10/26 07:00:14
t2 = 
  datetime
   2019/10/26 00:00:14

라고 표시는 다릅니다만, 이하와 같이 시간 정보로서는 동치입니다.
>> isequal(t1,t2)
ans =
  logical
   1

관련 기사, 페이지



ThingSpeak 자체나, Twitter에서 중얼거리는데 필요한 설정이나 코드는 이하에서 소개하고 있으므로, 좋으면 참고로 해 주세요.

Qiita: ThingSpeak x MATLAB에서 Twitter bot 구현

실제 Channel은 여기에서 확인할 수 있습니다만, 일단 이하의 2개의 정보도 트랙하고 있습니다.

  • total_items: MATLAB 태그가 있는 총 기사 수

  • total_followers: MATLAB 태그의 팔로워 수

  • 주요 MATLAB Analysis



    코드 전문은 마지막으로 정리해 재게재하므로, 여기서는 요소만 해설합니다. ThingSpeak의 Time Control 설정에 따라 한 시간에 한 번 실행됩니다.
  • 최신 체크
  • 최신 정보를 Tweet

  • 하는 구조로 하고 있습니다.

    먼저 Qiita API를 사용하여 최신 20개의 목록을 만듭니다.
    
    % ここから新着記事のチェック(最新20個取ればOKでしょう・・)
    url = "https://qiita.com/api/v2/tags/matlab/items?page=1&per_page=20";
    tmp = webread(url,opts);
    
    % 投稿時刻をチェック(TimeZone は日本時間に設定)
    created_at = datetime(vertcat(tmp.created_at),...
        'InputFormat', "uuuu-MM-dd'T'HH:mm:ss'+09:00",'TimeZone','Asia/Tokyo');
    titles = string({tmp.title}');
    urls = string({tmp.url}');
    item_list = timetable(titles, urls, 'RowTimes', created_at,...
        'VariableNames',{'titles', 'urls'})
    



    이 때, 시간 정보는 TimeZone , Asia/Tokyo 로 설정해 timetable 형 변수: item_list 로서 정리합니다.

    현 시각으로부터 1시간 이내에 투고되고 있으면 그것은 신착 기사. 현시각으로부터 과거 1시간의 사이에 투고된 것만을, item_list 로부터 꺼냅니다.
    % 新着かどうかのチェック
    % このスクリプトは 1時間に1回実行する設定にします。(ThingSpeak の Time Control 設定)
    interval = duration(1,0,0);
    tnow = datetime;
    % ThingSpeak が動いているところでは TimeZone が UTC であるところに注意
    tnow.TimeZone = 'UTC'; 
    trange = timerange(tnow-interval,tnow) % 過去一時間以内の投稿だけを抽出
    newitem_list = item_list(trange,:);
    
    trange 변수에 대한 시간 정보는 TimeZone, UTC로 설정됩니다.

    요약



    ThingSpeak을 사용하여 @Qiita_MATLAB bot를 만들었습니다.
    ThingSpeak의 시간 설정은 UTC입니다.

    MATLAB 태그가 붙은 게시 빈도는 아직 높지 않기 때문에, bot로서는 조금 외롭네요. . 이런 것을 중얼거리면? 등 제안 있으면 뭐라고.

    MATLAB 코드 전문



    각 APIKey만 설정하면 그대로 기능할 것이다.
    % アクセストークン使用
    % accessToken = 'Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
    % opts = weboptions('HeaderFields',{'Authorization',accessToken});
    % アクセストークン使用しない場合
    opts = weboptions;
    
    
    % ThingSpeak ログ用:記事合計数、フォロワー数の取得
    url = "https://qiita.com/api/v2/tags/matlab";
    tmp = webread(url,opts);
    items_count = tmp.items_count;
    followers_count = tmp.followers_count;
    
    channelID = 890134;
    writeAPIKey = 'XXXXXXXXXXXXXXXX'; % それぞれの Channel に固有の APIKey
    readAPIKey = 'XXXXXXXXXXXXXXXX'; % それぞれの Channel に固有の APIKey
    % Fields:
    %       1: total_items
    %       2: total_followers
    
    % Channel に情報送信
    data = {items_count, followers_count};
    thingSpeakWrite(channelID, data , 'WriteKey', writeAPIKey);
    
    
    % ここから新着記事のチェック(最新20個取ればOKでしょう・・)
    url = "https://qiita.com/api/v2/tags/matlab/items?page=1&per_page=20";
    tmp = webread(url,opts);
    
    % 投稿時刻をチェック(TimeZone は日本時間に設定)
    created_at = datetime(vertcat(tmp.created_at),...
        'InputFormat', "uuuu-MM-dd'T'HH:mm:ss'+09:00",'TimeZone','Asia/Tokyo');
    titles = string({tmp.title}');
    urls = string({tmp.url}');
    item_list = timetable(titles, urls, 'RowTimes', created_at,...
        'VariableNames',{'titles', 'urls'})
    
    % 新着かどうかのチェック
    % このスクリプトは 1時間に1回実行する設定にします。(ThingSpeak の Time Control 設定)
    % なので、、現時刻から1時間以内に投稿されていればそれは新着記事とします。
    interval = duration(1,0,0);
    tnow = datetime;
    % ThingSpeak が動いているところでは TimeZone が UTC であるところに注意
    tnow.TimeZone = 'UTC'; 
    trange = timerange(tnow-interval,tnow) % 過去一時間以内の投稿だけを抽出
    newitem_list = item_list(trange,:);
    
    
    % ThingTweet 設定
    tturl='https://api.thingspeak.com/apps/thingtweet/1/statuses/update';
    api_key = 'XXXXXXXXXXXXXX'; % Twitterをリンクして APIKey を取得してください。
    options = weboptions('MediaType','application/x-www-form-urlencoded');
    options.Timeout = 10;
    
    tweetFlag = true;
    % 新着の数だけ呟きます(無ければ呟かない)
    for ii=1:height(newitem_list)
    
        % 投稿文
        status = "#Qiita #MATLAB" + newline;
        status = status + newitem_list.titles(ii);
        status = status + newitem_list.urls(ii);
        disp(status);
    
        if tweetFlag
            try
                webwrite(tturl, 'api_key', api_key, 'status', status, options);
            catch ME
                disp(ME)
            end
        end
    end
    

    좋은 웹페이지 즐겨찾기