かずきち。の日記

サーバサイドエンジニアのつぶやき

【図解】スプレッドシートの名前を変えるGoogleAppsScript【GAS】

スプレッドシートの名前をGASで変えたいという相談がありましたので、解説します

まずはいつもどおりアクセスしてください。
script.google.com
引用:
https://script.google.com/

ここまでは余裕ですね?

スクリプトエディタに進む

f:id:kazukichi_0914:20210714172527g:plain

スプシを開いたら、ツール⇢ススクリプトエディタと進みます。
騙されたと思って

function myFunction() {
  // 現在アクティブなスプレッドシートを取得
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // そのスプレッドシートの名前を"新しい名前のスプレッドシート"としてリネーム
  ss.rename("名前が変わりました!"); 
}

f:id:kazukichi_0914:20210714172915g:plain

コードを書いたら、▶ボタンを押して実行です。
「名前が変わりました」というシートに変わっていたら、大成功です。

気になる結果は?

f:id:kazukichi_0914:20210714173214g:plain

スクリプト通り、「名前が変わりました」に変更できました。
使い方は以上です。

GoogleAdSenseのCTR/CPC/収益などを記録するスクリプトをさくっと書いてみました

インターネット収益を自動で集計したい

毎日、広告収益が上がってきます。
その数値をいちいちサイトにアクセスしていては大変です。
自動で収益を記録しましょう。

本サイトでのグラフはAdSense規約に乗っ取り、ページビューや収益の具体的数値は除いて掲載しています。
値の公表はポリシー違反になりますので、ご了承ください。

さっそくですが完成体

f:id:kazukichi_0914:20210706213340g:plain

最終目標はこのようなグラフを自動生成して、サイト別の収益率の計測に使います。
その日のクリック単価や収益を計測することができます。
これを追っていれば、ブログの収益率をトレースができます。
詳細な値などは今回は非掲載です。

下準備はAdSenseManagementAPIをオンにする

f:id:kazukichi_0914:20210706215056g:plain

GASのAPIのうち、プログラムからAdSenseを利用するライブラリをオンにしてください。
ここは詳しくは解説したいのでリンクを貼っておきます。

note.com
引用:
https://note.com/mangapostjapan/n/n96223145a99d


コード解説
function myFunction(){   
  //昨日の日の収益を移動
  // 現在アクティブなシートを取得
  var sheet = SpreadsheetApp.openById(ご自身のスプレッドシートID);

  //先日のAdSenseデータの移動
  sheet.getRange("A2:J1000").moveTo(sheet.getRange("A3"));

  // 今日の日付を格納
  var date = new Date();
  Logger.log(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd'));
  var today = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd')-2;
  sheet.getRange("A2").setValue(today);

  //一週間前を取得
  var date = new Date(); //現在日時のDateオブジェクトを作る
  var today = Utilities.formatDate(date, 'JST', 'yyyy-MM-dd');
  
  //現在の「日」を取得
  var day = date.getDate();
  Logger.log(day); //5
  
  //前日日付にしたいので-1する
  date.setDate(day-7);
  Logger.log(date); //Wed Sep 04 19:33:33 GMT+09:00 2019
  
  //日付の表示形式を整形する
  var lastweek = Utilities.formatDate(date, 'JST', 'yyyy-MM-dd');
  Logger.log(lastweek); //2019/09/04
  
  var adClientId = 'ca-pub-自身のID';
  var startDate = lastweek;
  var endDate = today;
  var metrics = ['PAGE_VIEWS', 'CLICKS', 'PAGE_VIEWS_CTR', 'COST_PER_CLICK', 'PAGE_VIEWS_RPM','EARNINGS'];
  var args = {'metric': metrics,
 'dimension': ['WEEK'],
 'filter': ['AD_CLIENT_ID==' + adClientId],
  };

  var report = AdSense.Reports.generate(startDate, endDate, args).getRows();
  Logger.log(report[1]);
  Logger.log(report[1][1]);
  sheet.getRange("A2").setValue(report[1][0]);
  sheet.getRange("B2").setValue(report[1][1]);
  sheet.getRange("C2").setValue(report[1][2]);
  sheet.getRange("D2").setValue(report[1][3]);
  sheet.getRange("E2").setValue(report[1][4]);
  sheet.getRange("F2").setValue(report[1][5]);
  sheet.getRange("G2").setValue(report[1][6]);

  //pv取得
  var pv =sheet.getRange("B2");
  var pv2 = pv.getValue();

  //クリック数取得
  var click =sheet.getRange("C2");
  var click2 = click.getValue();

  //CTR取得
  var ctr =sheet.getRange("D2");
  var ctr2 = ctr.getValue();+"\nCTR:"+ctr2

  //CPC取得
  var cpc =sheet.getRange("E2");
  var cpc2 = ctr.getValue();
  
  //RPM取得
  var rpm =sheet.getRange("F2");
  var rpm2 = ctr.getValue();

  //収益取得
  var earn =sheet.getRange("G2");
  var earn2 = ctr.getValue();

  //総収益
  var all =sheet.getRange("J1");
  var all2 = ctr.getValue();

  var messageText = "\n"+today+"\nPV数:"+pv2+"\nクリック数:"+click2+"\nCPC:"+cpc2+"\nRPM:"+rpm2+"\nEARN:"+earn2+"\n\n総収益"+all2;

  // LINEから取得したトークン
  let token = "QpjE3wuAyu0uuGHB5LLfoxBcb5nET9GlYhe4JrlVTWY"
  let options = {
   "method" : "post",
   "headers" : {
     "Authorization" : "Bearer "+ token
   },
   "payload" : {
     "message" : messageText
   }
 }

 const FValues = sheet.getRange('A:A').getValues();  //A列の値を全て取得
 var lastrow = FValues.filter(String).length;  //空白の要素を除いた長さを取得

 let url  = "https://notify-api.line.me/api/notify"
 if(sheet.getRange("C"+lastrow).getValue() !== ""){
 UrlFetchApp.fetch(url, options)
 }
}

このコードで完動します。
約60行ほどのコードですが、収益の記録を行ってくれるコードになります。
コードの設置もサポートいたしますので、その際はご相談ください。
有償でサポートいたします。

オンラインのデータを自動更新で可視化します 毎日の定形業務から開放されませんか?

何の記事ではてなスターを獲得したかを自動記録したい!記事別はてなスター獲得推移を記録するGASを書きました!

昨年の10月にはてなブログのスター数をカウントするスクリプトを書いてみました!

kazukichi0914.hatenablog.com
引用:
https://kazukichi0914.hatenablog.com/entry/2020/10/10/100251

その当時は毎日なんスターが付いているかトレースできたので満足でした。
毎日はてなスターの獲得を確認したいなと思っていました。
せっかくなら記事別にスターの獲得数を知りたいです。

完成体は、

f:id:kazukichi_0914:20210704163518g:plain

こんな具合にはてなスターの推移が見られます。
でも一つの疑問が浮かびました。

このはてなスターはどこの記事に付与されているんだろう?

なので、もうちょっとプログラムを改修してはてなスターのついている記事を特定します。

材料ははてなから定期的に送られてくるメール

f:id:kazukichi_0914:20210704164054g:plain

こんなメールが毎日日次ではてなから送られてきます。
このメールを解析してカレンダーに書きましょう!という算段です。

このメール本文を見れば、

先日公開されたYOASOBI「夜に駆ける」のEnglishバージョンがかっこいい!に
少納言 (id:syounagon) ☆
めるママっくす (id:merumamax) ☆☆☆
ひーろ (id:hirochanna) ☆☆☆
ダイス (id:daiskun) ☆☆☆
もう少しでシングル (id:lowhandicapper) ☆☆☆
金井戸 隆 (id:kaneido) ☆☆☆☆☆
りょうさん (id:ryousankunchan) ☆☆☆
AIBOパパ (id:daiki-em) ☆☆☆
お母ちゃん (id:suoaei) ☆☆☆☆☆☆

レモネード専門店「レモニカ」が爆誕!夏も冬もいろんな味のレモネードを楽しめる!
https://kazukichi0914.hatenablog.com/entry/2021/07/03/200000
rieco (id:sora-umi-inu-watashi) ☆☆☆☆☆☆
もう少しでシングル (id:lowhandicapper) ☆☆
金井戸 隆 (id:kaneido) ☆☆☆☆☆
お母ちゃん (id:suoaei) ☆☆☆
AIBOパパ (id:daiki-em) ☆☆☆
sato (id:pirorikin-58) ☆☆☆

という詳細がわかります。
このデータを使います。

function HatenaBlog() { 
  //最新の☆レポートを取得します
  const query = 'You have new messages.';
  const start = 0;
  const max = 1;
 
  const threads = GmailApp.search(query, start, max);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
  
  for(const messages of messagesForThreads){
    //)を微調整
    hatenastar = messages[0].getPlainBody().split("☆")[3] + ")";
    //console.log(hatenastar);
    
    var count = messages[0].getPlainBody().split("■").length;
    console.log("スターが付いた記事数は"+(count-2)+"記事");   

    for(var i=1;i<=count-2;i++){
      //ブログ一記事あたりのスター
      //console.log("記事URL");
      //console.log(messages[0].getPlainBody().split("■")[i].split("¥n")[0].split("¥n")[0]);
      //☆で切る
      console.log("記事タイトル");
      console.log(messages[0].getPlainBody().split("■")[i].split("¥n")[0].split("¥n")[0].split("¥n")[0].split("¥n")[0].split("¥n")[0].split("~ ☆(はてなスター)とは? ~")[0]);
    }
  }
}

これが改修後のスクリプトです。
短いですが、完動します。
もはや、力技でメール本文をパースしていますが、split関数を使いまくります。

コード本体
function HatenaBlog() { 
  //最新の☆レポートを取得します
  const query = 'You have new messages.';
  const start = 0;
  const max = 1;
 
  const threads = GmailApp.search(query, start, max);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
  
  for(const messages of messagesForThreads){
    //)を微調整
    hatenastar = messages[0].getPlainBody().split("☆")[3] + ")";
    //console.log(hatenastar);
    
    var count = messages[0].getPlainBody().split("■").length;
    console.log("スターが付いた記事数は"+(count-2)+"記事");   

    for(var i=1;i<=count-2;i++){
      //ブログ一記事あたりのスター
      //console.log("記事URL");
      //console.log(messages[0].getPlainBody().split("■")[i].split("¥n")[0].split("¥n")[0]);
      //☆で切る
      console.log("記事タイトル");
      console.log(messages[0].getPlainBody().split("■")[i].split("¥n")[0].split("¥n")[0].split("¥n")[0].split("¥n")[0].split("¥n")[0].split("~ ☆(はてなスター)とは? ~")[0]);
    }
  }
}

こちらの27行のコードで、

ブログの詳細データをGoogleカレンダーにこんなアウトプットを死ぬまでしてくれます。
こんなことが27行のコードでできてしまうんですねーGoogleさんさすがです。
split関数を使いまくって文字列を整形しています。

実行結果はこちら

f:id:kazukichi_0914:20210704165112g:plain

誰がなんの記事にブックマークや☆をくれたのか記録をしていきます。
ブログ運営をする上でなんの記事がPVを増やしてくれているのか解析することは大事です。
なので、さくっとはてなスターの習得の詳細をカレンダーに書き込むスクリプトを書いてみました。

ついたはてなスター・はてブの数を毎日自動記録します はてなブログの頑張りを記録して、モチベーションに

プログラミングなんてできないよーという方も上記サービスで設置までサポートいたします。
一度本サービスを購入いただければGoogleが稼働している限り動作いたしますので、リーズナブルかと思います。
買い切りです。

ブログ記事についたはてなブックマーク数をGoogleカレンダーに自動で書き込む

背景

f:id:kazukichi_0914:20210630134931g:plain

ブログに登録されているはてなブックマーク数をGoogleカレンダーでトレースしたい。

kazukichi0914.hatenablog.com

以前、はてなスターGoogleカレンダーに書き込むスクリプトを書いたのでそのスクリプトを応用します。
21行のコードで蹴りを付けます。

function myFunction() {
  var url = 'https://bookmark.hatenaapis.com/count/entry?url=http%3A%2F%2Fkazukichi0914.hatenablog.com%2F';
  var data = UrlFetchApp.fetch(url).getContentText();
  Logger.log(data)
  
  
  //2k08jhfss282b0q1ukmthp3fnc@group.calendar.google.comのカレンダーに書き込みます
  //登録するカレンダーIDを呼び出してeventへ格納
  var calendar = CalendarApp.getCalendarById('自分のカレンダーID@group.calendar.google.com');
    
  //イベントのタイトルをtitleへ格納
  //Logger.log(title);
    
  var date = new Date();
  // 今日の日付を表示
  Logger.log(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd'));
  Logger.log(date);
     
  //createAllDayEventでカレンダーへイベントを登録
  calendar.createAllDayEvent("B! "+data,date);
}

めっちゃ早いです。

上記スクリプトを書いたら…

f:id:kazukichi_0914:20210630140100g:plain

トリガーの設置です。
毎日23:00~24:00を目安にはてぶ数を取得して、カレンダーに書き込みます。

できたカレンダーはこちらになります。
あとは死ぬまで自動実行です。

スクリプトは以上ですが、初期設定から運用までを行ってほしい方は

ついたはてなスター・はてブの数を毎日自動記録します はてなブログの頑張りを記録して、モチベーションに

上記サービスをご購入ください。
貴方のはてなブログの実績を自動記録いたします。

なお競合他社のはてぶ数などをトレースしたいなどの要望にもお答えします。
A社やB社についたブックマーク数もトレースします。

AdSenseの推定収益額のメール配信を設定して、収益の確認してGASでカレンダーに書き込む

Google AdSenseではリアルタイム収益を足出してくれる。

f:id:kazukichi_0914:20210614210456g:plain

全サイトレポートを出すのは簡単だが、こんなグラフを毎週見ているようではめんどくさい。
毎日、運営サイトの収益を効率よく確認するためにはメール通知設定がある。

f:id:kazukichi_0914:20210614211222g:plain

歯車下の「︙」を押すと収益のメール設定が行えるのである。
毎週、毎月AdSenseサイトレポートを配信する。

f:id:kazukichi_0914:20210614212110g:plain

そうすると毎月レポートがGoogleから届く。
今月の施策はうまくいったなどの確認ができる。
ぜひ広告収益を増やしたい人は設定したい操作である。
ここを見ながら考えるわけである。

月間ページビューが30万を超えるとスペシャリストがつく

f:id:kazukichi_0914:20210614212507g:plain

基本的にインターネットは世界中の人全員が同じ風景を見られるわけではない。
パスワードを知っている人しか見られないページ、特定の条件を満たさないと見られないページが存在する。
より収益化をするためのスペシャリストがついてくれるのである、
YouTuberにそのような仕組みがあるのかは不明だが、AdSenseの秘密のリソースにアクセスすることができるのである。

もはや収益を確認するのがめんどくさすぎて、コードを書く

f:id:kazukichi_0914:20210614213013g:plain

GoogleではもはやプログラムからAdSenseにアクセスできる仕組みが用意されていて
AdSense Management APIをオンにすると使用できる。

function myFunction(){   
  //昨日の日の収益を移動
  // 現在アクティブなシートを取得
  var sheet = SpreadsheetApp.openById('1*********************************************');

  //先日のAdSenseデータの移動
  sheet.getRange("A2:J1000").moveTo(sheet.getRange("A3"));

  // 今日の日付を格納
  var date = new Date();
  Logger.log(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd'));
  var today = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd')-2;
  sheet.getRange("A2").setValue(today);

  //一週間前を取得
  var date = new Date(); //現在日時のDateオブジェクトを作る
  var today = Utilities.formatDate(date, 'JST', 'yyyy-MM-dd');
  
  //現在の「日」を取得
  var day = date.getDate();
  Logger.log(day); //5
  
  //前日日付にしたいので-1する
  date.setDate(day-7);
  Logger.log(date); //Wed Sep 04 19:33:33 GMT+09:00 2019
  
  //日付の表示形式を整形する
  var lastweek = Utilities.formatDate(date, 'JST', 'yyyy-MM-dd');
  Logger.log(lastweek); //2019/09/04
  
  var adClientId = 'ca-pub-3647961026085475';
  var startDate = lastweek;
  var endDate = today;
  var metrics = ['PAGE_VIEWS', 'CLICKS', 'PAGE_VIEWS_CTR', 'COST_PER_CLICK', 'PAGE_VIEWS_RPM','EARNINGS'];
  var args = {'metric': metrics,
 'dimension': ['WEEK'],
 'filter': ['AD_CLIENT_ID==' + adClientId],
  };

  var report = AdSense.Reports.generate(startDate, endDate, args).getRows();
  Logger.log(report[1]);
  Logger.log(report[1][1]);
  sheet.getRange("A2").setValue(report[1][0]);
  sheet.getRange("B2").setValue(report[1][1]);
  sheet.getRange("C2").setValue(report[1][2]);
  sheet.getRange("D2").setValue(report[1][3]);
  sheet.getRange("E2").setValue(report[1][4]);
  sheet.getRange("F2").setValue(report[1][5]);
  sheet.getRange("G2").setValue(report[1][6]);

  //pv取得
  var pv =sheet.getRange("B2");
  var pv2 = pv.getValue();

  //クリック数取得
  var click =sheet.getRange("C2");
  var click2 = click.getValue();

  //CTR取得
  var ctr =sheet.getRange("D2");
  var ctr2 = ctr.getValue();+"\nCTR:"+ctr2

  //CPC取得
  var cpc =sheet.getRange("E2");
  var cpc2 = ctr.getValue();
  
  //RPM取得
  var rpm =sheet.getRange("F2");
  var rpm2 = ctr.getValue();

  //収益取得
  var earn =sheet.getRange("G2");
  var earn2 = ctr.getValue();

  //総収益
  var all =sheet.getRange("J1");
  var all2 = ctr.getValue();

  var messageText = "\n"+today+"\nPV数:"+pv2+"\nクリック数:"+click2+"\nCPC:"+cpc2+"\nRPM:"+rpm2+"\nEARN:"+earn2+"\n\n総収益"+all2;

  // LINEから取得したトークン
  let token = "QpjE3wuAyu0uuGHB5LLfoxBcb5nET9GlYhe4JrlVTWY"
  let options = {
   "method" : "post",
   "headers" : {
     "Authorization" : "Bearer "+ token
   },
   "payload" : {
     "message" : messageText
   }
 }

 const FValues = sheet.getRange('A:A').getValues();  //A列の値を全て取得
 var lastrow = FValues.filter(String).length;  //空白の要素を除いた長さを取得

 let url  = "https://notify-api.line.me/api/notify"
 if(sheet.getRange("C"+lastrow).getValue() !== ""){
 UrlFetchApp.fetch(url, options)
 }

  var date = new Date();
  //今日の日付を表示
  Logger.log(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyyMMdd'));
  Logger.log(date);

  var calender = CalendarApp.getCalendarById("*******************@group.calendar.google.com");
  
    calender.createAllDayEvent(
    "収益:¥"+earn2
  , new Date(date) 
   );

}

このソースで収益をカレンダーに記録する。

f:id:kazukichi_0914:20210614213425g:plain


週末金曜日に収益をカレンダーに書き込んでくれるので自身で確認する必要はない。
以下のサービスを購入していただければ、AdSenseバージョン専用カレンダーを作成いたします。
毎月カレンダーに先月の給与明細のようにAdSense収益が上がってくるのでブログを書くやる気が出る。

はてなブログについたスターの数を毎日自動記録します はてなブログの頑張りを記録して、モチベーションに

興味ある方はご購入ください。

リモートワークなら自動で対応しよう!今週の業務処理件数を自動で報告するスクリプトを書く

背景

f:id:kazukichi_0914:20210612183643g:plain

コロナ禍の部下の労務管理は上司にとって大変です。
部下がどんな仕事をしているのか遠隔から見守らないといけないですからね。
とはいえ、上司に「今日はこんな件数の処理を行いました」と
手作業でメールを送ってリモートで報告するのはめんどくさいです。
ぜひ自動化しましょう。
プログラミングを使えば毎週金曜日17:30に上司に報告するなんてことは朝飯前です。
本言語はGoogleAppsScriptで書かれていますので、誰でも

script.google.com
引用:
https://script.google.com/home

にアクセスすれば使えます。

さて、いきなりですがソースです。

コード
function getUserLabelsSample() {
  //日付けオブジェクトを作る
  var date = new Date();
  
  //スプレッドシートのkeyを指定して取得
  var spreadsheet = SpreadsheetApp.openById('自分のスプレッドシートid');

  const start = 0;
  const max = 100;
  
  var date = new Date(); //現在日時のDateオブジェクトを作る
  var today = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd');
  Logger.log(today); //2019/09/05
  
  //現在の「日」を取得
  var day = date.getDate();
  //Logger.log(day); //今日の日付
  
  //前週日付にしたいので-1する
  date.setDate(day-7);
  //Logger.log(date); //Wed Sep 04 19:33:33 GMT+09:00 2019
  var startday = date;
  
  //日付の表示形式を整形する
  var lastweek = Utilities.formatDate(startday, 'JST', 'yyyy/MM/dd');
  //Logger.log(lastweek); //2019/09/04
 
  Logger.log("label:Google after:"+lastweek);
  
  const threads = GmailApp.search("label:Google after:"+lastweek);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
  Logger.log("Google件数"+messagesForThreads.length);
  
  for(const messages of messagesForThreads){
    Logger.log(messages[0].getSubject());
  }
  
   const recipient = 'xxxxxxxxxxxx@gmail.com'; //送信先のメールアドレス
   const subject = '今週の処理件数';

  const recipientName = 'テスト';
  const body = messagesForThreads.length+'件';
  
  const options = {name: 'かずきち。'};
  
  GmailApp.sendEmail(recipient, subject, body, options);
}

このソースをコピペしてもらえれば、先週から今日にかけて「Google」というラベルが付いているメール件数をxxxxxxxxxxxx@gmail.comに報告するソースです。
使用用途はリモートワークで部下の労務管理を行いたい上司に「今週の業務報告」を送りつけるスクリプトです。

f:id:kazukichi_0914:20210613205831g:plain

こんなメールが上司に送られるわけです。

あとはこのスクリプト実行を毎週金曜日の業務終了定時に送ればOKです

あともう一息です。

「編集」⇢「プロジェクトのトリガー」を設定します

f:id:kazukichi_0914:20210612185201g:plain

トリガー追加を押し、

f:id:kazukichi_0914:20210612185302g:plain

毎週金曜日の17:00~18:00を狙って上司に報告しましょう。
プログラムが自動で今週受信したGmailのサマリーを作成して報告してくれるという優れものです。

pythonをうっかり2.x系から3.x系にアップデートして、完全にプログラムが動かなくなった

うっかりアップデートしてしまった

解決したのでいいんですが、完全に忘れていた。

プログラミングの言語の一つにPythonがある。
そして、Python2.7とかPython3.9のように同じ言語でも仕様が違う。

f:id:kazukichi_0914:20210606232545g:plain

同じPythonでも似ているようで全く違う。
江戸時代の日本語と令和の日本語くらい違う。
バージョンアップしたら、完全にパソコン動かなくなったレベルなので3時間悩んでいた。
でも解決したので良かった。

sudo apt install 2to3
<<

python2.x系で書いたスクリプトを3.x系に直すには「2 to 3」があるが不便すぎるので、
余裕でpythonのージョンを下げた。
ただ今後はバージョンが3.xが主流になると思うので、パソコンを買い替えたら3.xにしようと思います。

[https://www.youtube.com/watch?v=stJIdgMTmVk:title]
引用:
[https://www.youtube.com/watch?v=stJIdgMTmVk]

python×selenium!つい勢いでbenefit stationの自動ログインスクリプトを作ってしまった!

benefit stationとは?

知っている方も多いと思いますが、企業が導入している福利厚生サイトです。
飲食店やレジャー施設の割引情報が掲載されている。
がしかし、ログインが必要なのである。

f:id:kazukichi_0914:20210607143247g:plain
引用:https://bs.benefit-one.co.jp/bs/pages/bs/top/top.faces

こんなインターフェースでトップ画面にログイン画面がある。

人間がIDとパスワードを入力しないといけないわけだ。

大問題である。
ここのログインを突破して、中の福利厚生情報を全部抜きたい。
このログイン、スクリプトで突破しましょう。

使ったライブラリなどは

import time                            # スリープを使うために必要
from selenium import webdriver         # Webブラウザを自動操作する(python -m pip install selenium)
import chromedriver_binary             # パスを通すためのコード
from selenium.webdriver.common.keys import Keys #タイピング操作
from selenium.webdriver.common.action_chains import ActionChains
import time

です。
コード自体は20行くらいで、benefitstationをハックします。

完成コード
#ChromeDriverのパスを引数に指定しChromeを起動
driver = webdriver.Chrome() 
#指定したURLに遷移する
driver.get("https://bs.benefit-one.co.jp/bs/pages/bs/top/top.faces")

actions = ActionChains(driver)
actions.perform()

driver.find_element_by_id("cmnHederForm:textfield").send_keys("ログインID\tログインパスワード\n")
actions = ActionChains(driver)
actions.perform()

time.sleep(5000)

動作している場面はYouTubeに上げましたのでのちほど。
その前に簡単に解説をします。
webdriver.Chrome()はpythonからGoogleChromeを立ち上げるために使います。


driver.find_element_by_id("cmnHederForm:textfield").send_keys("ログインID\tログインパスワード\n")
actions = ActionChains(driver)
actions.perform()

ここが肝心要のログインを突破する部分です。
詳しく解説していきますね。

ここでやっていることは「cmnHederForm:textfield」というテキストフィールドをブラウザ上から探して、値記入をしているわけです。
で、cmnHederForm:textfieldっていう謎な文字列はどこからでてきたんだ?っていう疑問です。

使うのはGoogleChromeデベロッパーツールです。
f:id:kazukichi_0914:20210607144542g:plain

ウェブページの構成要素を洗い出してくれます。
Google Chrome⇢「右上︙」⇢その他のツール⇢デベロッパーツールを立ち上げます。
普通の人は使わない開発者向け機能です。

f:id:kazukichi_0914:20210607144918g:plain

このページを開くとウェブページの構成やXPATHなどの情報が抜けるんです。f:id:kazukichi_0914:20210607145428g:plain


この画像の矢印で囲んである「□」ボタンを押してください。

そうするとウェブページの構成idやPATHが全部抜けるんです。

ここから「cmnHederForm:textfield」というフィールドがID名を入力するボックスのXPathを示していることがわかります。

フィールドを特定したら、そこに文字を入力したいので…

driver.find_element_by_id("cmnHederForm:textfield").send_keys("アカウント名\tパスワード\n")
actions = ActionChains(driver)
actions.perform()

を書くだけです。めっちゃ短いですよね。アカウントとパスワードには自分のログイン情報を使ってください。
\tはタブキーのエスケープシーケンスです。
プログラムから特殊文字を入力するためのテクニックです。
エスケープシーケンスは言語ごとに異なっていて、

エスケープ シーケンス 文字名
\’ 単一引用符(「’」)
\” 二重引用符(「”」)
\\ 円記号(「\」)
¥0 null文字
\a アラート音(警告)
\b バックスペース
\f 改ページ(フォームフィード)
\n 改行(ラインフィード)
\r 復帰(キャリッジリターン)
\t 水平タブ
\v 垂直タブ

引用:https://ict119.com/escapesequence/

自分がC言語を使っているの、pythonを使っているのかによって異なります。
今回はbenefitstationに特化してログインスクリプトを書きましたが、

celeniumでブラウザ操作を自動化します 毎日の提携作業のブラウザ操作やログイン情報入力にも対応

¥15,000〜コードを書くのでソシャゲーの経験値上げを自動化したい、チケットの購入サイトアクセスを自動化したいなど要望にお答えします。
使用言語はpythonになります。

GoogleChromeの操作をSeleniumで自動化しよう!pipからコマンドの自動化まで!

自動化時代の幕開け

昨今は様々な自動化が世の中にあるわけです。

www.selenium.dev
引用:
https://www.selenium.dev/documentation/ja/

1990年代の改札は駅員が手作業で切符を切っている時代もありました。
まさに「ALWAYS 三丁目の夕日」です。

しかし今は多くのものが自動化され、医療から運転、様々のものが自動化されています。
その中にブラウザ操作の自動化があります。

www.selenium.dev
引用:
https://www.selenium.dev/documentation/ja/

Seleniumブラウザ自動化プロジェクトがあります。
W3C WebDriver仕様のインフラが使えるわけです。
有志貢献者の何千時間に及ぶ個々の時間を費やした事とソースコード自由に利用可能を誰にでも利用、楽しめ、そして改良できることによって実現しました。
とにかく自動化を使いこなしたいのには必要不可欠と言ってはないでしょうか?

まずselenium webdriver をインストール

pip install selenium

でまずはpythonパッケージを取りに行きましょう。

apt-get
homebrew
pip

コマンドで取りに行きます。

pip install selenium

を叩けば入ると思います。

次はpythonのコードを書きましょう

import time                            # スリープを使うために必要
from selenium import webdriver         # Webブラウザを自動操作する(python -m pip install selenium)
import chromedriver_binary             # パスを通すためのコード
 
driver = webdriver.Chrome()            # Chromeを準備
driver.get('https://www.google.com/')  # Googleを開く
time.sleep(5)                          # 5秒間待機
driver.get('https://www.yahoo.co.jp/')  # Yahooを開く
time.sleep(5)                          # 5秒間待機
driver.quit() 

コードを書いたら、「F5」でRunしましょう。
めっちゃ簡単ですね。

詰みポイントはブラウザの文字入力です。

まず前提として、プログラミングで文字を入力するのは単純に「a」をタイプしてではだめなんです。

重要なのは、どこに文字を入力するかプログラム上で指定しないといけないわけです。

文字を打ちたいけど、どこのフォームをしていするのは「Xpath」という概念です。
これがGoogleChrome上でどこのボックスに文字を入力するかの番地です。

f:id:kazukichi_0914:20210607123939g:plain

ディベロッパーツール「…⇢Copy⇢Copy XPath」でそこのボックスへの道順をコピーできます。

/html/body/ntp-app//div[1]/ntp-realbox//div/input

こんなPATHがそこのテキストボックスへのXPathになります。

driver.find_element_by_id("loginInner_u").send_keys("kazukichi_0914")

loginInner_uにkazukichi_0914という文字列をプログラム上から入力しましょうっていうことを表しています。

GoogleYahoo!を言ったり来たりしていると思います。
情報に簡単にブラウザ操作の自動化ができました。
人間は何もしていませんよ。
seleniumスクリプトも書きます。

seleniumでブラウザ操作を自動化します 毎日の提携作業のブラウザ操作やログイン情報入力にも対応

GASで外為で四分位数を自動計算するチャートを作ってみた

最近のセンター試験の数学は「四部位数」が出題範囲らしい

2019年の大学入試センター試験「統計・データ分析」が導入された。
データ分析なんかコンピュータにやらせればいいじゃないか?という気もしますが、

f:id:kazukichi_0914:20210602104815g:plain
引用:
https://asakura.chiba.jp/archives/8818

こんな問題が2019年に出題されたらしい。

「四分位数(しぶんいすう)」とはデータを小さい順に並び替えたときに、データの数で4等分した時の区切り値のことです。4等分すると3つの区切りの値が得られ、小さいほうから「25パーセンタイル(第一四分位数)」、「50パーセンタイル(中央値)」、「75パーセンタイル(第三四分位数)」とよびます。

そんなの知らんわって感じですが、どうやら今のセンター試験の範囲なようです。

f:id:kazukichi_0914:20210602105503g:plain

特定のデータセットを4区間に分けるらしいです。
で四部位数なんてどうせ日本でしか通用しない分野なんじゃないの?という感じです。
渋井さんが作った関数レベルです。

英語では

quartile

と言うそうです。
英訳があるなんてことは世界中で使われている概念そうです。
 なるほどと、これは勉強する価値がありそうだ。
もしも四部位数が日本だけの概念なら知らなくてもいい気もします。

前回LINEbotを作成したので、

f:id:kazukichi_0914:20210529213858j:plain

こんな形で通知が来るbotを作りました。
ここに四部位数項目を加えておこうと思います。

グラフを作ってみた感想としては「平均」「最大値」「最小値」を見るだけではなく、データセットの真ん中を取ることで「最頻値」を取ってこれるので、「平均値」とは違う指標になって使い勝手がよさそうです。

四部位範囲 = Q3-Q1
四部位偏差 = 四部位範囲/2

データ活用方法をもう少し解説してくれるとうれしい。

kazukichi0914.hatenablog.com
引用:
https://kazukichi0914.hatenablog.com/entry/2021/05/29/200000

LINEメッセージにBlobして送信するようにします。