見出し画像

【GAS×NoteAPI】特定ユーザーのゲーム考察記事・GASのノウハウ記事を自動収集する仕組みづくり

まえがき

効率化部隊の越柴です。

私は某アイドル育成ゲームをこよなく愛しており、学生時代から1プロデューサーとして様々なアイドルキャラ達をステージに立たせてきました。

大学生のころは「絵がかわいい!⇒音楽かっこいい⇒ライブ泣いた...」みたいな感じで脳死でコンテンツを楽しんでいたのですが、この作品のの醍醐味である読み物系に触れることがあまりできていませんでした。
熟練P達のより深い考察を効率よく集めていくため、Noteの考察系記事も参考にしながらコンテンツの理解を深める仕組みづくりをしてみました。
今回はGASとNoteAPIを使って考察記事の取得を行います。





1.取得結果

早速ですが、取得結果をお見せします。
(一部情報を伏せております。ご了承ください)

【取得結果】

Noteで考察の頻度が高い・スキ数が多い人のユーザーIDを収集対象一覧に設定しておき、「記事タイトル」「URL」「投稿日」「スニペット(見出し200文字程度)」「記事本文」を取得しています。
今後は定期実行で取得するため、プログラム実行日とブログ投稿日が一致する記事だけ新たに追加されていくようになっています。

【収集対象一覧】

プログラム上で使用しているのは「ユーザーID」「ハッシュタグ」のみです。
ハッシュタグを基に、不必要な情報は取得しないように分岐処理を入れています。

ちなみにGAS関連の情報を発信している人のリストを作って、業務系の情報収集も行っています。(ゲーム用のコードをコピペして作りました)


2.ソースコード説明

function idolgameidolgame_note_api() {
  const INPUTSHEETNAME="【ゲーム】収集対象一覧";
  const OUTPUTSHEETNAME="ゲーム";
  const ACCESSPOINT="https://note.com/api/v2/creators/";
  const DETAILACCESSPOINT="https://note.com/api/v3/notes/"
  const page_count=1;
  let hashtag_flg=false;

  let nowdate=Utilities.formatDate(new Date,"JST","yyyy年MM月dd日");
  let full_data_list=[];
  

  /* 
  取得候補のユーザーを取得
  */
  let user_data=get_user_info(INPUTSHEETNAME);

  //ユーザーの数だけループ処理
  for(var i=0;i<user_data.length;i++){
    var id=user_data[i][1];
    var user_hashtag=user_data[i][2];
    var url=ACCESSPOINT+id+"/contents?kind=note&page"+String(page_count);
    
    //ユーザーデータ取得
    var json_data=JSON.parse(UrlFetchApp.fetch(url).getContentText("UTF-8"));
    var user_total_post_data=json_data["data"]["contents"];
    
    //データ加工
    for(var j=0;j<user_total_post_data.length;j++){
      //特定ユーザーの記事を一つ一つ取得する
      var title =user_total_post_data[j]["name"];
      var key=user_total_post_data[j]["key"];
      var postday=Utilities.parseDate(user_total_post_data[j]["publishAt"].split("T")[0],"JST","yyyy-MM-dd");
      postday=Utilities.formatDate(postday,"JST","yyyy年MM月dd日");
      var hashtags=user_total_post_data[j]["hashtags"]; //ハッシュタグ一覧
      for(hash_i=0;hash_i<hashtags.length;hash_i++){
        var hashtag=hashtags[hash_i]["hashtag"]["name"];
        
        //ハッシュタグが取得候補一覧に登録されていればtrue
        if(hashtag==user_hashtag){
          hashtag_flg=true;
          break;
        }
      }

      
      //ハッシュタグの一致確認
      var body=user_total_post_data[j]["body"];
      var page_url="https://note.com/"+id+"/n/"+key;

      //console.log(postday);
      //実行日==日付のデータだけ取得(23:00に動作するように実行)
      if(nowdate!=postday){
        //日付が一致するデータだけ取得
        continue;
      }

      //ハッシュタグフラグがfalseなら中断
      if(hashtag_flg==false){
        continue;
      }

      //continueしない場合のみ詳細情報取得
      var url=DETAILACCESSPOINT+key;
      var json_data=JSON.parse(UrlFetchApp.fetch(url).getContentText("UTF-8"));
      var detail=json_data["data"]["body"];
      var plaindetail=detail.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,'');

      //配列格納
      var once_data_list=[];
      once_data_list.push(user_data[i][0]);
      once_data_list.push(title);
      once_data_list.push(postday);
      once_data_list.push(page_url);
      once_data_list.push(body);
      once_data_list.push(plaindetail);

      full_data_list.push(once_data_list);
      hashtag_flg=false; //判定用にフラグを戻す
    }
  }
  //データが入ってれば出力
  if(0!=full_data_list.length){
    post_data(full_data_list,OUTPUTSHEETNAME);
  }
}

【プログラムの流れ】

① 収集対象一覧からユーザーIDとハッシュタグ情報を取得
② ACCESSPOINTにユーザーIDと取得条件を組み合わせたURLを作成
③ ユーザーの投稿情報の一覧を取得
④ 一覧の1つの記事に対し、条件に合致するか確認
 ・収集対象一覧に登録されているハッシュタグが、取得対象の記事に設定されているか
  (hashtag==user_hashtagの部分)
 ・取得記事がプログラム実行日の日付か
  (nowdate!=postdayの部分)
⑤ ④の条件すべてに合致する場合、
 DETAILACCESSPOINTにユーザーIDを組み合わせたURLを作成
⑥ 記事の詳細情報を取得
⑦ 情報を配列として保持
⑧ 1人のユーザーの次の記事へ移動し④~⑦の処理を実行
⑨ 1人のユーザーの処理が完了したら、次のユーザーの投稿一覧を取得
 (③に戻る⇒④~⑦のループ処理)
⑩ 取得結果をスプレッドシートに出力

※get_user_infoは収集対象一覧の情報を取得する定義関数(割愛)
※post_dataは取得結果を出力する定義関数(割愛)


3.厄介だった箇所

詳細情報を取得するDETAILACCESSPOINTで記事の本文を取得した際、htmlタグも合わせて拾ってきてしまう点が厄介でした。
正規表現で本文のみに加工していますが、この加工の仕方を知らなかった場合のことを考えるとぞっとします。


4.本当はこんな機能もほしかった

記事詳細の情報をChatGPTのアドオンで要約しようと思っていましたが、一記事だけで無料枠を使い切ってしまいました。
noteを開かないだけ便利かもしれませんが、要約機能は搭載したかったです。GASで実現できそうなアイデアが浮かんだら実践してみようと思います。




ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!
【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。
【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。
【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。
【SES】
SESサービスも行っております。


この記事が参加している募集

やってみた