This repository has been archived by the owner on Apr 14, 2023. It is now read-only.
forked from walkure/KCBr
/
SpreadSheetWrapper.cs
291 lines (253 loc) · 9.29 KB
/
SpreadSheetWrapper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using Google.GData.Client;
using Google.GData.Spreadsheets;
using System.Net;
namespace KCB2.GSpread
{
public class SpreadSheetWrapper
{
const string _app_name = "SpreadSheetWrapper";
OAuth2Parameters _parameters = new OAuth2Parameters();
SpreadsheetsService _service = null;
GOAuth2RequestFactory _requestFactory = null;
public SpreadSheetWrapper()
{
_parameters.ClientId = "471934575594.apps.googleusercontent.com";
_parameters.ClientSecret = "Gr_MKJfuzKLYqnHCyl4m6aSP";
_parameters.RedirectUri = "urn:ietf:wg:oauth:2.0:oob";
/* 本来はGoogleDocs(Drive API)へのアクセス権限はいらないはず
* スプレッドシートの作成は出来ると権限要求の説明には書いてある。
*
* しかし、出来ない。Drive APIで作れとドキュメントにある。うそつき。
*/
// parameters.Scope = "https://spreadsheets.google.com/feeds";
_parameters.Scope = "https://spreadsheets.google.com/feeds https://www.googleapis.com/auth/drive.file";
_requestFactory = new GOAuth2RequestFactory(null, _app_name,_parameters);
}
/// <summary>
/// サービス取得。必要に応じて生成
/// </summary>
SpreadsheetsService Service
{
get
{
if (_service == null)
{
_service = new SpreadsheetsService(_app_name);
_service.RequestFactory = _requestFactory;
}
return _service;
}
}
/// <summary>
/// 認証URLの取得
/// </summary>
public string AuthorizationURL
{
get
{
return OAuthUtil.CreateOAuth2AuthorizationUrl(_parameters);
}
}
/// <summary>
/// アクセストークン
/// </summary>
public string AccessToken
{
get
{
return _parameters.AccessToken;
}
}
/// <summary>
/// 更新トークン
/// </summary>
public string RefreshToken
{
get
{
return _parameters.RefreshToken;
}
}
/// <summary>
/// トークン更新日時
/// </summary>
public DateTime TokenExpiry
{
get
{
return _parameters.TokenExpiry;
}
}
/// <summary>
/// ネットワークアクセスプロキシ
/// </summary>
public System.Net.IWebProxy Proxy
{
get { return _requestFactory.Proxy; }
set { _requestFactory.Proxy = OAuthUtil.Proxy = value; }
}
/// <summary>
/// 認証
/// </summary>
/// <param name="authCode"></param>
/// <returns></returns>
public bool Autorize(string authCode)
{
Properties.Settings.Default.GSRefreshToken = "";
_parameters.AccessCode = authCode;
try
{
OAuthUtil.GetAccessToken(_parameters);
}
catch (System.Net.WebException ex)
{
//認証失敗だお
System.Diagnostics.Debug.WriteLine("Authorize ex:" + ex.ToString());
return false;
}
Properties.Settings.Default.GSRefreshToken = _parameters.RefreshToken;
return true;
}
/// <summary>
/// トークン更新
/// </summary>
/// <returns></returns>
public bool Refresh()
{
Debug.WriteLine("Refresh AccessToken");
_parameters.RefreshToken = Properties.Settings.Default.GSRefreshToken;
try
{
OAuthUtil.RefreshAccessToken(_parameters);
}
catch (Exception ex)
{
//認証失敗だお
System.Diagnostics.Debug.WriteLine("Refresh ex:" + ex.ToString());
return false;
}
Debug.WriteLine("AccessToken Refreshed Expiry:" + _parameters.TokenExpiry.ToString());
return true;
}
public SpreadsheetFeed SheetFeed
{
get
{
Debug.WriteLine("Try SpreadsheetQuery");
SpreadsheetQuery query = new SpreadsheetQuery();
return Service.Query(query);
}
}
public ListEntry Insert(ListFeed listFeed, ListEntry listEntry)
{
Debug.WriteLine("Try ListInsert");
return Service.Insert(listFeed, listEntry);
/*
ListEntry retVal = null;
try
{
retVal = Service.Insert(listFeed, listEntry);
}
catch (Google.GData.Client.GDataRequestException ex)
{
Debug.WriteLine("ListEntry.Insert fail:" + ex.ToString());
return null;
}
return retVal;*/
}
public WorksheetEntry Insert(WorksheetFeed wsFeed, WorksheetEntry wsEntry)
{
Debug.WriteLine("Try WorksheetInsert");
return Service.Insert(wsFeed, wsEntry);
}
public ListFeed Query(WorksheetEntry wsEntry)
{
Debug.WriteLine("Try WorksheetQuery");
AtomLink listFeedLink = wsEntry.Links.FindService(GDataSpreadsheetsNameTable.ListRel, null);
ListQuery listQuery = new ListQuery(listFeedLink.HRef.ToString());
return Service.Query(listQuery);
}
public CellFeed Query(CellQuery cellQuery)
{
Debug.WriteLine("Try CellQuery");
return Service.Query(cellQuery);
}
/// <summary>
/// スプレッドシートを作成する。同じ名前の場合でも気にせず作成される。
/// </summary>
/// <param name="spreadSheetName">スプレッドシート名</param>
/// <returns>失敗したらfalse</returns>
public bool CreateSpreadsheet(string spreadSheetName)
{
// https://developers.google.com/drive/web/mime-types
string req_json = string.Format("{{\"title\": \"{0}\",\"mimeType\": \"application/vnd.google-apps.spreadsheet\"}}", spreadSheetName);
Debug.WriteLine("Trying to create spreadsheet:" + spreadSheetName);
// AccessTokenが切れてるかもしれないので更新
Refresh();
/*
* https://developers.google.com/drive/v2/reference/files/insert
* metadataを送るだけなのでエンドポイントは https://www.googleapis.com/drive/v2/files
*/
HttpWebRequest req = WebRequest.Create("https://www.googleapis.com/drive/v2/files")
as HttpWebRequest;
if (req == null)
return false;
req.ContentType = "application/json; charset=UTF-8";
req.Method = "POST";
req.Proxy = _requestFactory.Proxy;
req.Headers.Add("Authorization", string.Format("Bearer {0}",_parameters.AccessToken));
var req_by = Encoding.UTF8.GetBytes(req_json);
req.ContentLength = req_by.Length;
var rs = req.GetRequestStream();
rs.Write(req_by, 0, req_by.Length);
rs.Close();
try
{
HttpWebResponse res = req.GetResponse() as HttpWebResponse;
/*
* 追加したらSpreadsheetsService を作りなおさないとだめ。
* SpreadsheetFeedの再QueryではWorksheetFeedが取得できず例外が飛ぶ
*/
_service = null;
}
catch (WebException wex)
{
System.Diagnostics.Debug.WriteLine("CreateSpreadsheet Ex:" + wex.ToString());
if (wex != null)
{
using (var sr = new System.IO.StreamReader(wex.Response.GetResponseStream()))
{
Debug.WriteLine("wex:" + sr.ReadToEnd());
}
}
return false;
}
Debug.WriteLine("Spreadsheet created");
return true;
}
/// <summary>
/// 指定した名前のスプレッドシートを拾ってくる
/// </summary>
/// <param name="spreadSheetName">スプレッドシート名</param>
/// <returns>該当するスプレッドシートが持つワークシートオブジェクト</returns>
public WorksheetFeed GetSpreadsheet(string spreadSheetName)
{
Debug.WriteLine("Search Spreadsheet named:" + spreadSheetName);
foreach (SpreadsheetEntry it in SheetFeed.Entries)
{
if (it.Title.Text == spreadSheetName)
{
Debug.WriteLine("Spreadsheet found");
return it.Worksheets;
}
}
Debug.WriteLine("Spreadsheet not found");
return null;
}
}
}