#LINE Notifyを使ってMENSAの試験に申し込む
そのまんまです。
##概要
合格するよりも、申し込む方が難しい、と言われるMENSAの試験。(→HUNTER×HUNTER?)
現代風にプログラミングで解決する方法が、幾つかあるけど、
今回は、Line NotifyとPHPとcrontabを使う方法を紹介します。
ただし、コロナの影響で試験自体が無いので、下記の方法が実践的に使えるかは不明です。
ご了承をお願いします。
##全体の流れ
(1)PHPで該当ページをウェブスクレイピング
(2)更新されたら、Line Notifyで通知
(3)crontabで(1)と(2)を定期的に実行
##(1)PHPで該当ページをウェブスクレイピング
PHPで該当ページ https://mensa.jp/exam/ をスクレイピングします。
色々と方法があるんだろうけど、大まかな方法として、
①デスクトップなどに、ウェブスクレイピングしたページを保存しておく
②保存したページと新しくスクレイピングしたページを比較する
③保存したページとスクレイピングしたページが
→一致したらそのままにする。
→一致しないなら、Lineに通知する
こんな感じです。
<?php
$url = 'https://mensa.jp/exam/';
$filename = '/home/pi/Desktop/Mensa-exam-judge.txt';
$input = file_get_contents($url);
$prv = file_get_contents($filename);
$match1 = mb_strstr($input, '関東地方</h3>');
$match1 = str_replace(array(" ", " "), "", $match1);
$match1_1 = mb_strstr($match1, '</p>', true);
//var_dump($match1_1);
$match2 = mb_strstr($prv, '関東地方</h3> ');
$match2 = str_replace(array(" ", " "), "", $match2);
$match2_1 = mb_strstr($match2, '</p>', true);
//var_dump($match2_1);
if($match1_1 != $match2_1){
echo "NO";
$fp = fopen($filename, 'w');
fwrite($fp, $input);
fclose($fp);
}else {
echo "YES";
}
?>
###解説
あらかじめデスクトップにMensa-exam-judge.txtを作成しておきます。
読み込んだページから、関東地方の所を読み出します。
次に保存したページから、関東地方の所を読み出し、一致するかどうかを調べます。
一致したら、何もしません。
一致しないなら、動作を開始します。完成形は、最後の方のソースコードになります。
###ハマり所
何度やっても保存したページと読み込んだページが一致しないことになり続けました。
どうも空白が悪さしているみたいだったので、空白を削除する羽目に。。。
##(2)更新されたら、Line Notifyで通知
更新されたら、Line Notifyで通知します。
↓のページを参考にします。それだけです。
[超簡単]LINE notify を使ってみる
https://qiita.com/iitenkida7/items/576a8226ba6584864d95
##(3)crontabで(1)と(2)を定期的に実行
15分間隔などに適宜設定して、スクレイピングを実行します。(サーバーの負荷になりすぎないように注意をお願いします。)
↓のページを参考にします。私の場合は、ラズベリーパイで動作確認しました。
RaspberryPi3で初めてcrontabを使う前に
https://qiita.com/Higemal/items/5a579b2701ef7c473062
##全体のソースコード
***の部分にLine tokenを入れてください。
<?php
$url = 'https://mensa.jp/exam/';
$filename = '/home/pi/Desktop/Mensa-exam-judge.txt';
$input = file_get_contents($url);
$prv = file_get_contents($filename);
$match1 = mb_strstr($input, '関東地方</h3>');
$match1 = str_replace(array(" ", " "), "", $match1);
$match1_1 = mb_strstr($match1, '</p>', true);
//var_dump($match1_1);
$match2 = mb_strstr($prv, '関東地方</h3> ');
$match2 = str_replace(array(" ", " "), "", $match2);
$match2_1 = mb_strstr($match2, '</p>', true);
//var_dump($match2_1);
if($match1_1 != $match2_1){
echo "NO";
define('LINE_API_URL' ,'https://notify-api.line.me/api/notify');
define('LINE_API_TOKEN','***');
function post_message($message){
$data = http_build_query( [ 'message' => $message ], '', '&');
$options = [
'http'=> [
'method'=>'POST',
'header'=>'Authorization: Bearer ' . LINE_API_TOKEN . "\r\n"
. "Content-Type: application/x-www-form-urlencoded\r\n"
. 'Content-Length: ' . strlen($data) . "\r\n" ,
'content' => $data,
]
];
$context = stream_context_create($options);
$resultJson = file_get_contents(LINE_API_URL, false, $context);
$resultArray = json_decode($resultJson, true);
if($resultArray['status'] != 200) {
return false;
}
return true;
}
post_message("Mensa Exam!+ ${url}");
$fp = fopen($filename, 'w');
fwrite($fp, $input);
fclose($fp);
}else {
echo "YES";
}
?>
##感想
このソースコード作るのに、2-3週間かかってしまった。
そして、私はすでに会員なので、自分にとってあまり意味の無いプログラミングではあった。
でもPHPは作ってて楽しい言語ですねー。
##参考リンクまとめ
MENSAの試験ページ
https://mensa.jp/exam/
[超簡単]LINE notify を使ってみる
https://qiita.com/iitenkida7/items/576a8226ba6584864d95
RaspberryPi3で初めてcrontabを使う前に
https://qiita.com/Higemal/items/5a579b2701ef7c473062
Python+AWS Cloud9で自動スクレイピング→LINEに更新通知でMENSAの入会テストに申し込んだ話
https://qiita.com/ochomaki/items/700f64dcc49ee9fbc25b
ジャパン・メンサは試験問題よりも試験に申し込むことの方が難しいという問題から考察する。
https://lscharlie.exblog.jp/31158199/