2 using System.Collections.Generic;
5 using System.Text.RegularExpressions;
8 namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
10 public class HatenaDiary
12 private string userName;
13 private string password;
15 public HatenaDiary(string userName, string password)
17 this.userName = userName;
18 this.password = password;
21 public Tuple<string, IEnumerable<BlogEntry>> GetEntrys(int page = 1)
23 var xdoc = WsseAtomConnection.Get(
24 string.Format("http://d.hatena.ne.jp/{0}/atom/blog?page={1}", this.userName, page),
27 var title = xdoc.Root.Element(XmlNamespaces.Atom + "title").Value;
28 var entrys = xdoc.Root.Elements(XmlNamespaces.Atom + "entry").Select(_ => new BlogEntry(_));
29 return Tuple.Create(title, entrys);
32 private static XDocument CreatePostEntryXml(string title, string content, DateTime? updated)
34 var elm = new XElement(XmlNamespaces.Atom02Spec + "entry",
35 new XElement(XmlNamespaces.Atom02Spec + "title", title),
36 new XElement(XmlNamespaces.Atom02Spec + "content", new XAttribute("type", "text/plain"), content));
38 elm.Add(new XElement(XmlNamespaces.Atom02Spec + "updated", updated.Value.ToString("o")));
39 return new XDocument(elm);
42 public BlogEntry PostEntry(string title, string content, DateTime? updated = null)
44 var reXml = WsseAtomConnection.Post(
45 string.Format("http://d.hatena.ne.jp/{0}/atom/blog", this.userName),
46 CreatePostEntryXml(title, content, updated),
49 return new BlogEntry(reXml.Root)
51 HatenaSyntax = content
55 public BlogEntry GetEntry(string dateId)
57 var xdoc = WsseAtomConnection.Get(
58 string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.userName, dateId),
61 return new BlogEntry(xdoc.Root);
64 public BlogEntry EditEntry(string dateId, string title, string content, DateTime? updated = null)
66 var reXml = WsseAtomConnection.Put(
67 string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.userName, dateId),
68 CreatePostEntryXml(title, content, updated),
71 return new BlogEntry(reXml.Root)
73 HatenaSyntax = content
77 public void DeleteEntry(string dateId)
79 WsseAtomConnection.Delete(
80 string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.userName, dateId),
85 public Tuple<string, IEnumerable<BlogEntry>> GetDrafts(int page = 1)
87 var xdoc = WsseAtomConnection.Get(
88 string.Format("http://d.hatena.ne.jp/{0}/atom/draft?page={1}", this.userName, page),
91 var title = xdoc.Root.Element(XmlNamespaces.Atom + "title").Value;
92 var entrys = xdoc.Root.Elements(XmlNamespaces.Atom + "entry").Select(_ => new BlogEntry(_));
93 return Tuple.Create(title, entrys);
96 public BlogEntry PostDraft(string title, string content, DateTime? updated = null)
98 var reXml = WsseAtomConnection.Post(
99 string.Format("http://d.hatena.ne.jp/{0}/atom/draft", this.userName),
100 CreatePostEntryXml(title, content, updated),
103 return new BlogEntry(reXml.Root)
105 HatenaSyntax = content
109 public BlogEntry GetDraft(string id)
111 var xdoc = WsseAtomConnection.Get(
112 string.Format("http://d.hatena.ne.jp/{0}/atom/draft/{1}", this.userName, id),
115 return new BlogEntry(xdoc.Root);
118 public BlogEntry EditDraft(string id, string title, string content, DateTime? updated = null)
120 var reXml = WsseAtomConnection.Put(
121 string.Format("http://d.hatena.ne.jp/{0}/atom/draft/{1}", this.userName, id),
122 CreatePostEntryXml(title, content, updated),
125 return new BlogEntry(reXml.Root)
127 HatenaSyntax = content
131 public void DeleteDraft(string id)
133 WsseAtomConnection.Delete(
134 string.Format("http://d.hatena.ne.jp/{0}/atom/draft/{1}", this.userName, id),
139 public string PublishDraft(string id)
141 var req = (HttpWebRequest)WebRequest.Create(string.Format(
142 "http://d.hatena.ne.jp/{0}/atom/draft/{1}",
146 req.AllowAutoRedirect = false;
147 req.Headers.Add(WsseAtomConnection.CreateHeader(this.userName, this.password));
148 req.Headers.Add("X-HATENA-PUBLISH: 1");
149 using (var res = req.GetResponse())
151 res.Headers[HttpResponseHeader.Location],