読者です 読者をやめる 読者になる 読者になる

ゲンゾウ用ポストイット

Java、Groovy、Linux関連の備忘録

facebookにGroovyでログイン

というのを必死でやろうとしているがうまくいかない。
とりあえず現時点でできているところまでアップする。


やりたいことは、facebookにOAuth2.0方式でアクセスするようなデスクトップアプリケーションを作りたいということ。
facebook内のデータにアクセスする方法は以下にかかれている。
Facebook Login - Facebook開発者

英語なので何分辛かったが、Client-side Flowのセクションにかかれている認証手順をブラウザなしで実現したい。
ログインしていない場合、初回のアクセスでパスワード入力画面に遷移するために、ユーザー名パスワードをPost方式で渡してみたがパスワードが不正と言われてしまう。



2011/10/28現在

以下のコードはhttpcomponentsの使い方として誤りが多いです。
以下のエントリで修正版を載せているのでそちらを参照してください。
facebookにGroovyでログイン(その2) - ゲンゾウ用ポストイット-new


#!/usr/bin/env groovy
@Grab("org.apache.httpcomponents:httpclient:4.1.2")
import org.apache.http.*
import org.apache.http.client.*
import org.apache.http.client.params.*
import org.apache.http.client.methods.*
import org.apache.http.impl.client.*

def urltext = "https://graph.facebook.com/oauth/authorize?" + [
                        "client_id=OAUTH2.0_APP_ID",
                        "redirect_uri=" + URLEncoder.encode("https://www.facebook.com/connect/login_success.html", "utf-8"),
                        "scope=" + URLEncoder.encode("email,read_stream,friends_about_me,user_about_me", "utf-8"),
                        "response_type=token",
                    ].join("&")


CookieStore cookieStore = new BasicCookieStore()
HttpClient client = null

client = new DefaultHttpClient(cookieStore:cookieStore)
HttpGet get1 = new HttpGet(urltext)

def response1 = client.execute(get1)
println "get1:" + response1.statusLine.statusCode
def nextAction =  response1.entity.content.text.replaceAll(/(?msi).+<form method="post".+?action="(.+?)"[^>]*>.+/, "\$1")
println nextAction
client.connectionManager.shutdown()


client = new DefaultHttpClient(cookieStore:cookieStore)
HttpPost post2 = new HttpPost(nextAction)

// ここが怪しい。addParameterを利用するのが正しい?
post2.addHeader("email", "XXXXX@gmail.com")
post2.addHeader("pass", "XXXXX")
def response2 = client.execute(post2)
println "post2:" + response2.statusLine.statusCode
println  response2.entity.content.text


client.connectionManager.shutdown()


続きは明日。

広告を非表示にする