サークル限定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();
}
}
}