2011年11月22日火曜日

非公式APIをJAVAに移植してみた その2

サークル限定POSTをできるようにしました

ライセンス形式はTakehiro Takahashi版に準拠し、NYSLとなります



package jp.kaientai.gplus;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.NameValuePair;
import org.apache.http.protocol.HTTP;

public class Gplus {

static final String USER_AGENT = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)";

private String _sendid;
private String _userid;
private DefaultHttpClient http;

private String getMatchString(String patern, String target) {
Pattern pattern = Pattern.compile(patern);
Matcher matcher = pattern.matcher(target);
boolean blnMatch = matcher.find();
if (blnMatch) {
if (matcher.groupCount() == 1) {
return matcher.group(1);
} else {
return null;
}
} else {
return null;
}

}

public Gplus(String user, String pass) throws Exception {
http = new DefaultHttpClient();
Google_AccountLogin(user, pass);
}

/**
* ログイン処理
*
* @param _mailaddress
* @param _password
* @throws Exception
*/
private void Google_AccountLogin(String _mailaddress, String _password)
throws Exception {
String b;
String c;
String d;
HttpResponse execute;
InputStream is;
InputStreamReader isr;
StringWriter sw;
BufferedReader buf;

HttpGet get = new HttpGet("https://accounts.google.com/login");

try {
execute = http.execute(get);

is = execute.getEntity().getContent();
isr = new InputStreamReader(is);
sw = new StringWriter();
buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
b = sw.toString();

} catch (Exception ex) {
throw new Exception(ex);
}
c = getMatchString("name=\"dsh\" id=\"dsh\" value=\"([-0-9]+)\"", b);

d = getMatchString("name=\"GALX\"[ \t\n]+value=\"([-_a-zA-Z0-9]+)\"><",
b);

HttpPost post = new HttpPost(
"https://accounts.google.com/ServiceLoginAuth");
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
final List<NameValuePair> params = new ArrayList<NameValuePair>();

params.add(new BasicNameValuePair("dsh", c));
params.add(new BasicNameValuePair("GALX", d));
params.add(new BasicNameValuePair("pstMsg", "1"));
params.add(new BasicNameValuePair("dnConn",
"https%3A%2F%2Faccounts.youtube.com"));
params.add(new BasicNameValuePair("timeStmp", ""));
params.add(new BasicNameValuePair("secTok", ""));
params.add(new BasicNameValuePair("Email", _mailaddress));
params.add(new BasicNameValuePair("Passwd", _password));
params.add(new BasicNameValuePair("signIn",
"%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3"));
params.add(new BasicNameValuePair("PersistentCookie", "yes"));
params.add(new BasicNameValuePair("rmShown", "1"));
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
try {
execute = http.execute(post);

is = execute.getEntity().getContent();
isr = new InputStreamReader(is);
sw = new StringWriter();
buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}

} catch (Exception e) {
throw new Exception(e);
}
return;
}

/**
* @param _pageid
*/
private void PlusGetData(String _pageid) {
HttpGet get = new HttpGet("https://plus.google.com/");
try {
get.setHeader("User-Agent", Gplus.USER_AGENT);

HttpResponse execute = http.execute(get);

InputStream is = execute.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is);
StringWriter sw = new StringWriter();
BufferedReader buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
String b = sw.toString();

_sendid = getMatchString("\"(AObGSA.*:[0-9]*)\"", b);

_userid = getMatchString("key: '2', data:[ ]\\[\"([0-9]*)", b);

} catch (Exception e) {
e.printStackTrace();
}
}

//
/**
* 一般公開でPOST
*
* @param _message
*            POSTの本文
* @param _id
*            G+ページの場合G+のID(G+ページでない場合はnullを指定)
* @param _lock
*            ロックする場合は true 、しない場合は false
* @return
*/
public int Google_Plus_Post(String _message, String _id, boolean _lock) {
return Google_Plus_Post(_message, _id, null, _lock);
}

/**
* サークル指定でPOST
*
* @param _message
*            POSTの本文
* @param _id
*            G+ページの場合G+のID(G+ページでない場合はnullを指定)
* @param _circle
*            公開先のサークルID
* @param _lock
*            ロックする場合は true 、しない場合は false
* @return
*/
public int Google_Plus_Post(String _message, String _id, String _circle,
boolean _lock) {
String e;
String f;
String g;
String circleid;
String scopeType;

try {

e = _message.replaceAll("\n", "\\\\n");
} catch (Exception ex) {
ex.printStackTrace();
return 0;
}
PlusGetData(_id);

if (_lock) {
f = "true";
} else {
f = "false";
}

if (_circle == null) {
circleid = "anyone";
scopeType = "anyone";
} else {
circleid = _userid + "." + _circle;
scopeType = "focusGroup";

}
// JSON
g = "[\""
+ e
+ "\",\"oz:"
+ _userid
+ "."
+ String.valueOf(System.currentTimeMillis() / 1000)
+ ".0\",null,null,null,null,\"[]\",null,\"{\\\"aclEntries\\\":[{\\\"scope\\\":{\\\"scopeType\\\":\\\""
+ scopeType
+ "\\\",\\\"name\\\":\\\"\\\\u5168\\\\u54e1\\\",\\\"id\\\":\\\""
+ circleid
+ "\\\",\\\"me\\\":true,\\\"requiresKey\\\":false},\\\"role\\\":20},{\\\"scope\\\":{\\\"scopeType\\\":\\\""
+ scopeType
+ "\\\",\\\"name\\\":\\\"\\\\u5168\\\\u54e1\\\",\\\"id\\\":\\\""
+ circleid
+ "\\\",\\\"me\\\":true,\\\"requiresKey\\\":false},\\\"role\\\":60}]}\",true,[],false,false,null,[],false,false,null,null,null,null,null,null,null,null,null,null,"
+ f + ",false,false]";

String url;
if (_id.equals("")) {
url = "https://plus.google.com/_/sharebox/post/";
} else {
url = "https://plus.google.com/b/" + _id + "/_/sharebox/post/";
}
HttpPost post = new HttpPost(url);
final List<NameValuePair> params = new ArrayList<NameValuePair>();

// randomize
Random rnd = new Random();
try {
params.add(new BasicNameValuePair("spam", "20"));
params.add(new BasicNameValuePair("reqid", String.valueOf(rnd
.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))));
params.add(new BasicNameValuePair("rt", "j"));
params.add(new BasicNameValuePair("spar", g));
params.add(new BasicNameValuePair("at", _sendid));

post.setHeader("X-Same-Domain", "1");
post.setHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");
post.setHeader("Pragma", "no-cache");
post.setHeader("Cache-Control", "no-cache");
post.setHeader("User-Agent", Gplus.USER_AGENT);
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse execute = http.execute(post);

if (execute == null)
{
return 0;
}
InputStream is = execute.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is);
StringWriter sw = new StringWriter();
BufferedReader buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
System.out.println(sw.toString());

} catch (Exception ex) {
ex.printStackTrace();
return 0;
}
return 1;
}

/**
* Google+の指定のポストを編集
*
* @param _postid
*            POSTのID
* @param _message
*            編集後の本文
* @param _id
*            G+ページの場合G+のID(G+ページでない場合はnullを指定)
* @return
*/
public int Google_Plus_Edit(String _postid, String _message, String _id) {
String e;
String url;

e = _message.replaceAll("\n", "\\\n"); //編集の時はなぜかエスケープの\が3つ
PlusGetData(_id);

if (_id.equals("")) {
url = "https://plus.google.com/_/stream/edit/";
} else {
url = "https://plus.google.com/b/" + _id + "/_/stream/edit/";
}
HttpPost post = new HttpPost(url);
final List<NameValuePair> params = new ArrayList<NameValuePair>();

Random rnd = new Random();
try {
params.add(new BasicNameValuePair("spam", "20"));
params.add(new BasicNameValuePair("reqid", String.valueOf(rnd
.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))));
params.add(new BasicNameValuePair("rt", "j"));
params.add(new BasicNameValuePair("spt", e));
params.add(new BasicNameValuePair("sei", _postid));
params.add(new BasicNameValuePair("sml", "[]"));
params.add(new BasicNameValuePair("madl", "true"));
params.add(new BasicNameValuePair("at", _sendid));

post.setHeader("X-Same-Domain", "1");
post.setHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");
post.setHeader("Pragma", "no-cache");
post.setHeader("Cache-Control", "no-cache");
post.setHeader("User-Agent", Gplus.USER_AGENT);
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse execute = http.execute(post);

if (execute == null) {
return 0;
}

InputStream is = execute.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is);
StringWriter sw = new StringWriter();
BufferedReader buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
System.out.println(sw.toString());

} catch (Exception ex) {
ex.printStackTrace();
return 0;
}
return 1;
}

public static void main(String[] args) {

try {
Gplus g = new Gplus("アカウント", "パスワード");
g.Google_Plus_Post("てすと\n改行", "", "サークルID", false);
g.Google_Plus_Edit("POSTのID","編集は\n甘え","G+ページID");
} catch (Exception e) {
e.printStackTrace();
}
}
}


0 件のコメント:

コメントを投稿