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

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

PowerShell で Twitter API にアクセスする

PowerShell

さて、こっちが本題。 :p
最終的な目標は、 PowerShell で動作する Twitter クライアント作り。
とりあえず全部 PowerShell でやろうと思ったんだけど、匿名クラスが作れなかったので、データ格納クラスだけ C# で作った。
まずはそっちのソース。

  • TwitterData.cs
using System;
using System.Globalization;

namespace Jp.Mkns.Test {
  public class TwitterData {
    public string Name { get; set; }
    public string Text { get; set; }
    public DateTime? Date { get; set; }

    public TwitterData() {
      this.Name = String.Empty;
      this.Text = String.Empty;
      this.Date = null;
    }

    public void SetDateTime(string date) {
      IFormatProvider culture = new CultureInfo("en-US");
      this.Date = DateTime.ParseExact(date, "ddd MMM dd HH:mm:ss zzzz yyyy", culture);
    }
  }
}

Twitter API (XML) が返してくる日付データがミョーに変な形式になっているので難儀した。
何なんだろ、この形式。( DateTime.TryParse() は false だった)
んでこれを DLL 化しておく。( GAC への登録はしないでも OK の模様。やや無理やりだけど)

csc.exe /t:library TwitterData.cs

そして、 PowerShell スクリプト。(シンタックスハイライトはさすがに無理っぽいので単なるスーパー pre 記法で)

[Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq")
[Reflection.Assembly]::LoadFile($pwd.path + "\TwitterData.dll")
$client = New-Object Net.WebClient
$client.Credentials = New-Object Net.NetworkCredential("userid", "password")
$client.Encoding = [Text.Encoding]::UTF8
$xml = $client.DownloadString("http://twitter.com/statuses/friends_timeline/userid.xml")
$reader = New-Object IO.StringReader($xml)
$xdoc = [Xml.Linq.XDocument]::Load($reader)
$items = $xdoc.Root.Elements() | Where { $_.Name.LocalName.Equals("status") } | foreach {
  $d = new-object Jp.Mkns.Test.TwitterData
  $d.Name = $_.Element("user").Element("name").Value
  $d.Text = $_.Element("text").Value
  $d.SetDateTime($_.Element("created_at").Value)
  $d
}

さすがに LINQ のクエリ式をそのまま書けるわけじゃないのでちょっと手間取った。
ってか、これでもなんかムダがある様な気がする。
でも、とりあえず出来たから OK とする。 ^^;