コマンドラインからSharePoint Online(Office 365)へファイルをアップロード

現時点でMicrosoft Online Services モジュールを使ったSharePoint関連の管理はできなさそうだし、でもMicrosoftWEBサービスを一からスクレイピングするのは相当骨が折れるし、っていうか絶対無理、クッキーに一個だけBase64エンコードされた値があって、それをデコードしたらアスキー圏外って、、、

なので以下がおそらく現時点でのベスト解。SeleniumIEドライバ(IEDriverServer.exe)を使えばもっと簡単にPythonで書けたんですが、プラットフォームに縛られたくない諸事情によりJythonとHtmlUnitDriverの組み合わせにしました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# All right reserved Youhei Sakurai(sakurai_youhei).
# You can use this script under the MIT license.

"""
This script runs on Jython(Java) with Selenium which HtmlUnit is replaced to 2.10.

Jython: http://www.jython.org/ (PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2)
Selenium: http://seleniumhq.org/ (Apache 2.0 License)
HtmlUnit: http://htmlunit.sourceforge.net/ (Apache 2.0 License)

e.g.
C:\>"C:\Program Files\Java\jre7\bin\java.exe" -cp C:\selenium-2.25.0\selenium-ja
va-2.25.0.jar;C:\selenium-2.25.0\libs\*;C:\jython.jar org.python.util.jython C:\
upload_to_sharepoint_online.py
"""

# These should be "username@domain.onmicrosoft.com"
domain="yourdomain"
username="yourlogin"
password="yourpassword"

filename=r"C:\test2.txt" # Must be absolute path.

try:
  import java.lang.Thread
  import org.openqa.selenium.htmlunit.HtmlUnitDriver
  import com.gargoylesoftware.htmlunit.BrowserVersion
  driver = org.openqa.selenium.htmlunit.HtmlUnitDriver(
    com.gargoylesoftware.htmlunit.BrowserVersion.FIREFOX_10
  )
  driver.setJavascriptEnabled(True)

  from java.util import logging
  from org.apache.commons.logging import LogFactory
  logger = LogFactory.getLog('com.gargoylesoftware.htmlunit')
  logger.getLogger().setLevel(logging.Level.OFF)

  print "Accessing to TeamSite...",
  driver.get("http://%s.sharepoint.com/TeamSite"%domain)
  java.lang.Thread.sleep(500)
  print "Done."

  print "Logging in...",
  driver.findElementByName("login").sendKeys("%s@%s.onmicrosoft.com"%(username,domain))
  driver.findElementByName("passwd").sendKeys(password)
  driver.findElementByName("SI").click()
  java.lang.Thread.sleep(500)
  print "Done."

  print "Opening new document page...",
  driver.get(driver.findElementById("idHomePageNewDocument").getAttribute("href"))
  java.lang.Thread.sleep(500)
  print "Done."

  print "Uploading file...",
  driver.findElementByName("ctl00$PlaceHolderMain$ctl01$ctl05$InputFile").sendKeys(filename)
  driver.findElementByName("ctl00$PlaceHolderMain$ctl00$RptControls$btnOK").click()
  java.lang.Thread.sleep(500)
  print "Done."

  print "Logging out...",
  driver.get(driver.findElementById("Shell-Header-SignOut").getAttribute("href"))

  java.lang.Thread.sleep(500)
  driver.close()
  print "Done."

except ImportError:
  print "maybe missing some jar(s) in CLASSPATH"
except AttributeError:
  print "maybe old HtmlUnit, requires 2.10 or above."

アディオス!