スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[GAE] クォータ情報の取得&メール送信

会社で作ったGAEアプリで、毎日JST16:00にリセットされる資源(クォータ)が
毎日どのくらい使われてるのか知りたいんやけど、
都度、GAEのダッシュボードで確認しないとあかんのかねー?(;´Д`)
などとぼやいたら、ウチのスーパータカさんが素敵なURLフェッチソースを書いてくれました(・ω・)キラッ

タカさん掲載了承の元、元ソースのカスタムに四苦八苦(;´Д`)
まだちゃんとテストしてないですが、とりあえず動くし~ま、いっか。

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Logger;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.Source;
import com.google.appengine.api.utils.SystemProperty;

public class QuotaStatusServlet extends HttpServlet
{
private static final Logger logger = Logger.getLogger(QuotaStatusServlet.class.getName());
private static final String Email = "== Your Account Here =="; // dashboardにアクセスできるアカウント
private static final String Passwd = "== Your Password Here ==";
private static final String sendTo = "== Send Address =="; // 結果を送信するメルアド

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
// dashboardのURLに接続する
String dbUrl = "https://appengine.google.com/dashboard?&app_id=" + SystemProperty.applicationId.get();
URL url = new URL(dbUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

// ヘッダ情報からクッキーを取得
Map> headers = conn.getHeaderFields();
List cookies = headers.get("set-cookie");

// コンテンツの内容を読み込み
String contents = this.getContentsStr(conn);
Source source = new Source(contents);
Element form = source.getFirstElement("form");
String actionUrl = form.getAttributeValue("action").trim();

if (!actionUrl.equals("/dashboad"))
{
// コンテンツ中のinputタグの内容を全てマップにつめ直す
Map paramMap = new HashMap();
List inputList = source.getAllElements("input");
for (Element input : inputList)
{
String name = input.getAttributeValue("name");
String value = input.getAttributeValue("value");
paramMap.put(name, value);
}

// 更にアカウント情報もマップに詰める
paramMap.put("Email", Email);
paramMap.put("Passwd", Passwd);
paramMap.put("PersistentCookie", "false");

// GAEのウェルカムページに接続
url = new URL(actionUrl);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
conn.setRequestMethod("post");
conn.setDoOutput(true);
conn.setInstanceFollowRedirects(false); // リダイレクトしない
conn.addRequestProperty("cookie", this.getCookieStr(cookies));

StringBuffer bufValue = new StringBuffer();
for(String key : paramMap.keySet())
{
bufValue.append(key + "=" + paramMap.get(key) + "&");
}
bufValue.substring(0, bufValue.length() - 1);

// レスポンスを取得
OutputStream os = conn.getOutputStream();
PrintWriter out = new PrintWriter(os);
out.print(bufValue.toString());
out.close();

while (true)
{
// ヘッダ情報からクッキーを取得
headers = conn.getHeaderFields();
cookies = headers.get("set-cookie");
String cookie = this.getCookieStr(cookies);

// リダイレクト先のURLを取得
String location = conn.getHeaderField("location").trim();
if (location.startsWith("https://appengine.google.com/dashboard")) location = dbUrl;

// リダイレクト先に接続
url = new URL(location);
conn = (HttpURLConnection) url.openConnection();
conn.setInstanceFollowRedirects(false); // リダイレクトしない
if (null != cookie) conn.addRequestProperty("cookie", cookie);

// 200で終了
if (200 == conn.getResponseCode()) break;
}
}

// コンテンツの内容を読み込み
contents = this.getContentsStr(conn);
source = new Source(contents);

// クォータ情報を取得
Map quotaMap = new HashMap();
List divList = source.getAllElements("div");
for (Element div : divList)
{
String id = div.getAttributeValue("id");
if (!"ae-dash-quota".equals(id)) continue;

List tbodyList = div.getAllElements("tbody");
for (Element tbody : tbodyList)
{
List trList = tbody.getAllElements("tr");
for (Element tr : trList)
{
String key = null;
String value = null;
List tdList = tr.getAllElements("td");
for (Element td : tdList)
{
if (td.getAttributeValue("scope") != null)
{
key = td.getContent().toString().trim().replaceAll("\n", "");
}

Element span = td.getFirstElement("span");
if (span != null)
{
value = span.getContent().toString().trim().replaceAll("\n", "");
}
}
if (null != key)
{
quotaMap.put(key, value);
}
}
}
}

// メールの送信
if (quotaMap.size() > 0)
{
// 本文の生成
String msgBody = "";
for (String key : quotaMap.keySet())
msgBody += key + " " + quotaMap.get(key) + "\n";

// メールの送信
try
{
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(Email));
msg.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress(sendTo));
msg.setSubject("クォータ情報", "ISO-2022-JP");
msg.setText(msgBody);
Transport.send(msg);
}
catch (AddressException e)
{
logger.info(e.getMessage());
}
catch (MessagingException e)
{
logger.info(e.getMessage());
}
}
}

private String getContentsStr(HttpURLConnection conn) throws IOException
{
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] b = new byte[100000];
int count = 0;
while ((count = bis.read(b, 0, b.length)) > 0)
{
baos.write(b, 0, count);
}
bis.close();
is.close();

String contents = new String(baos.toByteArray(), "UTF-8");
baos.close();

return contents;
}

private String getCookieStr(List cookies)
{
if (cookies == null) return null;

StringBuffer bufCookie = new StringBuffer();
for (String cookie : cookies)
{
String c = cookie.split(";")[0];
if (c.indexOf("=") == -1) continue;
else bufCookie.append(c + ";");
}
bufCookie.substring(0, bufCookie.length() - 1);

return bufCookie.toString();
}
}

このサーブレットをCronで毎時16:00ちょい前くらいに実行すれば、
毎日どのくらいCPU時間食ってるのかとか、一々ダッシュボードまで見に行かなくても確認できるから便利~♪
タカさん、ありが㌧ございましたー(´ω`)
関連記事
スポンサーサイト

Pagination

Trackback

Trackback URL

http://morado106.blog106.fc2.com/tb.php/85-d6d1ad98

Comment

Post Your Comment

コメント登録フォーム
公開設定

Utility

プロフィール

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。