感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

seleniumを使ってアメブロに記事を自動投稿する

スポンサーリンク

アメブロやライブドアにプログラムで投稿するにはATOM APIを使わなければいけないっぽい。
http://yohei-y.blogspot.jp/2005/04/java-atomapi.html
http://ameblo.jp/af-tools/entry-11049151940.html

ATOMのフォーマットはこちら。
http://www.witha.jp/Atom/Chapter-2_The_Atom_Syndication_Format.html
wikipediaにもある。
http://en.wikipedia.org/wiki/Atom_(standard)

■ここでATOMとは何か、まとめてみる。
・AtomはRSSが進化したもののようなイメージ。

・ほとんどのXMLベースのRESTfulアプリケーションはHATEOASを実装するための手段としてAtom配信フォーマットの構文を用いる。

・Atomは「フィード」と呼ばれる関連情報のリストを記述したXMLベースのドキュメントフォーマットである。

・フィードは「エントリ」と呼ばれる複数の項目から構成される。

(参考にした本)

JavaによるRESTfulシステム構築

JavaによるRESTfulシステム構築

その他の方法として、ブラウザの自動起動を行う「selenium」を使う方法。
このAPIを使えば、プログラムを起動するとブラウザが勝手に動いて、入力とかをやってくれる。
ブラウザがちょこちょこと動いている様子は見ていて面白い。
seleniumのJavadocはこちら。
http://selenium.googlecode.com/svn/trunk/docs/api/java/index.html

で、ページのソースを見ながら要素を特定していくのだけれど、参考になるのがこちら。
http://oss.infoscience.co.jp/seleniumhq/docs/04_selenese_commands.html

FireFoxで動くサンプルを作っても、最後、記事の本文(body)を書く部分でエラーが生じる。

Exception in thread "main" org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with
Command duration or timeout: 10.11 seconds

以下を参考にJavaScriptを書いてみてもダメ
http://stackoverflow.com/questions/11858366/how-to-type-some-text-in-hidden-field-in-webdriver

じゃあChromeでやるとどうなんだろう。
http://kenichiro22.hatenablog.com/entry/20110825/1314280671

Chromeだとうまくいった。
FireFoxとの相性が悪かったのかな。
本文だけ書けなかったのは。

以下がseleniumを使ってアメブロに自動投稿するサンプル(Java)

package blog;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class PostToAmeba {
	
	public static void main(String[] args) {
		writeBlog("TEST_TITLE3","TEST_BODY3");
	}
	static void writeBlog(String title, String body) {
		String strURL = "http://ameblo.jp/";
		String strId = "userid";
		String strPassword = "password";
		
		System.out.println("test1");
		System.setProperty("webdriver.chrome.driver","C:\\temp\\chromedriver_win_26.0.1383.0\\chromedriver.exe");
		WebDriver driver = new ChromeDriver();
		JavascriptExecutor jse = (JavascriptExecutor)driver;
		
		System.out.println("test2");
		driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
		driver.get(strURL);
		
		//mypageBtnクラスを取得して、その中のリンクをクリックする。
		WebElement loginClass = driver.findElement(By.className("mypageBtn"));
		loginClass.findElement(By.linkText("")).click();
		System.out.println("マイページ行きまーす");
		
		//アメーバIDを入力する
		WebElement loginId = driver.findElement(By.name("amebaId"));
		loginId.sendKeys(strId);
		//パスワードを入力する
		WebElement loginPass = driver.findElement(By.name("password"));
		loginPass.sendKeys(strPassword);
		//submit要素をクリックする
		WebElement loginSubmit = driver.findElement(By.name("Submit"));
		loginSubmit.click();
		
		WebElement writeLink = driver.findElement(By.id("globalTabBlog"));
		writeLink.click();
		
		WebElement titleInput = driver.findElement(By.name("entry_title"));
		titleInput.sendKeys(title);
		System.out.println("タイトル書いた");
		try {
			Thread.sleep(3000);
		} catch(InterruptedException e) {
			
		}
		
		/* JavaScriptでうまくいかなかった記録として残しておくw
		jse.executeScript("document = this.page().getDocument();" +
		"document.getElementById('entryTextArea').innerHTML = \"BODY\";");
		jse.executeScript("var textareas = document.getElementsByTagName('textarea');" +
				"for(var i = 0; i < textareas.length; i++) {" +
				"   textareas[i].type = 'BODY';" +
				"}");
		*/
		WebElement textarea = driver.findElement(By.tagName("textarea"));
		textarea.sendKeys(body);
		System.out.println("記事を書いた");
		
		WebElement okClick = driver.findElement(By.xpath("//input[@value='全員に公開']"));
		okClick.click();
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
		driver.close();
		System.out.println("完了");
	}
}

IDとパスワードを入れて実行すると記事が自動で投稿される。