前回Pythonで動いたものをGASへ移行する
前回、ラズパイ上でのPython3で、ソーラーパネル稼働状況を出力させることができました。
ログインできない。
最初は、CSRFトークンが正常に取得できていないと思っていました。
セッションIDを維持したりしましたが、ログインできず。
var csrfToken; // グローバル変数としてCSRFトークンを保持
function loginAndFetchPage() {
var loginPageUrl = "https://ctrl.kp-net.com/settingcontrol/processLogin";
var targetPageUrl = "https://ctrl.kp-net.com/settingcontrol/remotevisualization/simplevisualization/enduser";
var username = "xxxxxxxxxxxx";
var password = "yyyyyyyyyyyy";
// 1. ログインページからCSRFトークンを取得
csrfToken = getCsrfToken(loginPageUrl);
// 2. ログイン情報とCSRFトークンを使用してログインリクエストを送信
var loggedIn = login(loginPageUrl, username, password);
if (loggedIn) {
// 3. ログインが成功した場合、目的のページのHTMLを取得
var targetPageHtml = getPageHtml(targetPageUrl);
Logger.log(targetPageHtml);
} else {
Logger.log("Login failed.");
}
}
function getCsrfToken(url) {
var response = UrlFetchApp.fetch(url);
var html = response.getContentText();
// 正規表現を使用してmetaタグからCSRFトークンを取得
var match = /<meta[^>]+name=["']_csrf["'][^>]+content=["']([^"']+)["'][^>]*>/i.exec(html);
return match ? match[1] : null;
}
function login(url, username, password) {
var payload = {
_csrf: csrfToken,
loginid: username,
loginpassword: password
// 他のログインフォームのフィールドも必要に応じて追加
};
var options = {
method: 'post',
contentType: 'application/x-www-form-urlencoded',
payload: payload,
followRedirects: false
};
var response = UrlFetchApp.fetch(url, options);
// ログイン成功時に新しいCSRFトークンを取得
if (response.getResponseCode() === 302) {
csrfToken = getCsrfToken(response.getHeaders()['Location']);
return true;
}
return false;
}
function getPageHtml(url) {
// 各リクエストで同一のCSRFトークンを使用
var payload = {
_csrf: csrfToken
// 他のリクエストパラメータも必要に応じて追加
};
var options = {
method: 'get',
payload: payload
};
var response = UrlFetchApp.fetch(url, options);
return response.getContentText();
}
UrlFetchAppは実行毎に違うIPアドレスを使う
UrlFetchAppの実行毎に、CSRFトークンが変化しているようでした。
このため、上記の、セッションID維持を試みたりしていました。
ですが、どうやら、UrlFetchAppは実行毎に違うIPアドレスを使うようです。
これなら、各種情報を維持しようがログインできなかったことに合点がいきます。
IPアドレス固定方法の模索
レンタルサーバーを借りてそちらで実行されている方もおいででした。
断念されている方もおいででした。
いずれかのサーバーを経由させる必要があるようです。