質問編集履歴

1

説明が不十分だったため加筆しました。

2018/10/12 14:16

投稿

hasshy
hasshy

スコア102

test CHANGED
@@ -1 +1 @@
1
- 【Twitter】OAuthでログインしたユーザの代わりに自動投稿する方法はないでしょうか?
1
+ 【Twitter】OAuthでログインしたユーザの代わりに投稿する方法はないでしょうか?
test CHANGED
@@ -2,14 +2,472 @@
2
2
 
3
3
 
4
4
 
5
- OAuthでログインしてユーザー情報(account/verify_credentials)得る事はきたのでが、ユーザーの代わりに投稿する方法がわかりません
6
-
7
- 投稿者の代わりに投稿するにどうたら良いでしょうか?
8
-
9
-
10
-
11
- ## 使用しているライブラリ
12
-
13
- TwitterOAuth
14
-
15
- https://github.com/abraham/twitteroauth
5
+ サーバーサイドでログイン、および投稿行う想定です。
6
+
7
+ 言語PHPを使用
8
+
9
+ Twitter周りの処理は[TwitterOAuth](https://github.com/abraham/twitteroauth)というライブラリを使用します。
10
+
11
+
12
+
13
+ ## 手順
14
+
15
+ ログイン処理と、投稿は一連の流れではありません。
16
+
17
+ ログイン処理完了後、任意のタイミングで投稿処理を行います。
18
+
19
+
20
+
21
+ ### ログイン処理
22
+
23
+ 1. OAuth認証遷移ページ(login.php)にアクセスしリクエストトークンを取得
24
+
25
+ その際に、oauth_tokenと、oauth_token_secretをセッションに退避する
26
+
27
+ 2. OAuth認証遷移ページからTwitterのOAuthログイン画面に遷移
28
+
29
+ 3. ログインに成功したらコールバック用ページ(callback.php)に戻って、oauth_verifierとoauth_tokenからアクセストークンを取得
30
+
31
+
32
+
33
+ ### 投稿処理
34
+
35
+ ここがまだ解決できていません。
36
+
37
+ 想定している手順は、下記です。
38
+
39
+
40
+
41
+ 1. ログイン時に取得した情報からアクセストークンを取得
42
+
43
+ oauth_tokenとoauth_token_secretで個人の情報を取得、
44
+
45
+ コールバック時に取得したoauth_verifierと組み合わせて、
46
+
47
+
48
+
49
+ 2. アクセストークンからユーザーの接続情報を取得
50
+
51
+ 3. ユーザー情報を元にTweetを投稿
52
+
53
+
54
+
55
+ ## 困っていること
56
+
57
+ 前項でふれましたが、ログインした後に任意のタイミングで投稿することができません。
58
+
59
+ アクセストークンを取得する時に必要な、oauth_verifierとoauth_tokenは、セッションで管理しているので、取り出して使うことができるのですが、
60
+
61
+ その情報で実行すると次のようなエラーが表示されます。
62
+
63
+
64
+
65
+ > atal error: Uncaught Abraham\TwitterOAuth\TwitterOAuthException: 現在この機能は一時的にご利用いただけません
66
+
67
+
68
+
69
+ ## ソース
70
+
71
+ 下記の構成にしています。
72
+
73
+ まず、login.phpにアクセス、OAuth認証が終わったら、post.htmlに遷移します。
74
+
75
+
76
+
77
+ - login.php:OAuth認証に必要な情報を取得して、認証画面に遷移させる
78
+
79
+ - callback.php:OAuth認証で接続した時の情報を元に、接続したユーザーの情報を取得、セッションに保持する
80
+
81
+ - post.html: 自動投稿用のボタン(リンク)を設置したページ
82
+
83
+ - autopost.php: post.htmlでボタンが押されたら、決められた内容をPostする。
84
+
85
+
86
+
87
+ ### login.php
88
+
89
+ ``` php
90
+
91
+ <?php
92
+
93
+
94
+
95
+ // セッションを作る
96
+
97
+ session_start();
98
+
99
+
100
+
101
+ // ライブラリ読み込み
102
+
103
+ require "vendor/autoload.php";
104
+
105
+ use Abraham\TwitterOAuth\TwitterOAuth;
106
+
107
+
108
+
109
+ $consumerKey = "***";
110
+
111
+ $consumerSecrect = "***";
112
+
113
+ $callback = "http://localhost:8000/callback.php";
114
+
115
+
116
+
117
+ $twitterConnect = new TwitterOAuth(
118
+
119
+ $consumerKey,
120
+
121
+ $consumerSecrect
122
+
123
+ );
124
+
125
+
126
+
127
+ $requestToken = $twitterConnect->oauth(
128
+
129
+ 'oauth/request_token',
130
+
131
+ array('oauth_callback' => $callback)
132
+
133
+ );
134
+
135
+
136
+
137
+ // 取得した情報をセッションに保存
138
+
139
+ $_SESSION['oauth_token'] = $requestToken['oauth_token'];
140
+
141
+ $_SESSION['oauth_token_secret'] = $requestToken['oauth_token_secret'];
142
+
143
+
144
+
145
+ // twitterの認証画面へリダイレクトURLを取得
146
+
147
+ $url = $twitterConnect->url(
148
+
149
+ 'oauth/authorize',
150
+
151
+ array(
152
+
153
+ 'oauth_token' => $requestToken['oauth_token']
154
+
155
+ )
156
+
157
+ );
158
+
159
+
160
+
161
+ // twitter認証画面へリダイレクト
162
+
163
+ header('Location:' . $url);
164
+
165
+ exit;
166
+
167
+
168
+
169
+ ?>
170
+
171
+ ```
172
+
173
+
174
+
175
+ ### callback.php
176
+
177
+ ``` php
178
+
179
+ <?php
180
+
181
+
182
+
183
+ // セッションを作る
184
+
185
+ session_start();
186
+
187
+
188
+
189
+ // 読み込み
190
+
191
+ require "vendor/autoload.php";
192
+
193
+ use Abraham\TwitterOAuth\TwitterOAuth;
194
+
195
+
196
+
197
+ $consumerKey = "***";
198
+
199
+ $consumerSecrect = "***";
200
+
201
+
202
+
203
+ // セッション退避
204
+
205
+ $oauthToken = $_SESSION['oauth_token'];
206
+
207
+ $oauthTokenSecret = $_SESSION['oauth_token_secret'];
208
+
209
+
210
+
211
+ // ログインしたユーザで自動投稿を行う
212
+
213
+ $twitterConnect = new TwitterOAuth(
214
+
215
+ $consumerKey,
216
+
217
+ $consumerSecrect,
218
+
219
+ $oauthToken,
220
+
221
+ $oauthTokenSecret
222
+
223
+ );
224
+
225
+
226
+
227
+ // アクセストークンを取得
228
+
229
+ $accessToken = $twitterConnect->oauth(
230
+
231
+ 'oauth/access_token',
232
+
233
+ array(
234
+
235
+ 'oauth_verifier' => $_GET['oauth_verifier'],
236
+
237
+ 'oauth_token'=> $_GET['oauth_token']
238
+
239
+ )
240
+
241
+ );
242
+
243
+
244
+
245
+ // 任意のタイミングでポストしたいので、アクセストークの取得に必要な値を退避
246
+
247
+ $_SESSION['oauth_verifier'] = $_GET['oauth_verifier'];
248
+
249
+
250
+
251
+ // アクセストークンからユーザー情報を取得
252
+
253
+ $userConnect = new TwitterOAuth(
254
+
255
+ $consumerKey,
256
+
257
+ $consumerSecrect,
258
+
259
+ $accessToken['oauth_token'],
260
+
261
+ $accessToken['oauth_token_secret']
262
+
263
+ );
264
+
265
+
266
+
267
+ //アカウントの有効性を確認するためのエンドポイントを取得
268
+
269
+ $userInfo = $userConnect->get('account/verify_credentials');
270
+
271
+
272
+
273
+ if(isset($userInfo->id_str)){
274
+
275
+
276
+
277
+ // tweetの内容設定
278
+
279
+      // 検証のために、ログインしたユーザーで投稿
280
+
281
+ // こちらは問題なく投降できました。
282
+
283
+ $params = [
284
+
285
+ 'status' => 'ログイン成功',
286
+
287
+ ];
288
+
289
+
290
+
291
+ // ツイートする
292
+
293
+ $result = $userConnect->post(
294
+
295
+ 'statuses/update',
296
+
297
+ $params
298
+
299
+ );
300
+
301
+
302
+
303
+
304
+
305
+ $_SESSION['user_info'] = $userInfo;
306
+
307
+ header("Location:index.php");
308
+
309
+ exit;
310
+
311
+ }
312
+
313
+ else
314
+
315
+ {
316
+
317
+ header("Location:error.html");
318
+
319
+ exit;
320
+
321
+ }
322
+
323
+ ?>
324
+
325
+
326
+
327
+ ```
328
+
329
+
330
+
331
+ ### post.html
332
+
333
+ ```
334
+
335
+ <!DOCTYPE html>
336
+
337
+ <html lang="en" dir="ltr">
338
+
339
+ <head>
340
+
341
+ <meta charset="utf-8">
342
+
343
+ <title>投降ページ</title>
344
+
345
+ </head>
346
+
347
+ <body>
348
+
349
+ <h1>投降ページ</h1>
350
+
351
+ <a href="autopost.php">メッセージ投稿</p>
352
+
353
+ </body>
354
+
355
+ </html>
356
+
357
+
358
+
359
+ ```
360
+
361
+
362
+
363
+ ### autopost.php
364
+
365
+ ここが解決できていません。
366
+
367
+
368
+
369
+ ``` php
370
+
371
+ <?php
372
+
373
+ session_start();
374
+
375
+
376
+
377
+ require "vendor/autoload.php";
378
+
379
+ use Abraham\TwitterOAuth\TwitterOAuth;
380
+
381
+
382
+
383
+ $consumerKey = "***";
384
+
385
+ $consumerSecrect = "***";
386
+
387
+
388
+
389
+ $twitterConnect = new TwitterOAuth(
390
+
391
+ $consumerKey,
392
+
393
+ $consumerSecrect,
394
+
395
+ $_SESSION['oauth_token'],
396
+
397
+ $_SESSION['oauth_token_secret']
398
+
399
+ );
400
+
401
+
402
+
403
+ // アクセストークン取得
404
+
405
+ $accessToken = $twitterConnect->oauth(
406
+
407
+ 'oauth/access_token',
408
+
409
+ [
410
+
411
+ 'oauth_verifier' => $_SESSION['oauth_verifier'],
412
+
413
+ 'oauth_token' => $_SESSION['oauth_token']
414
+
415
+ ]
416
+
417
+ );
418
+
419
+
420
+
421
+ // アクセストークンを元にユーザー情報を取得
422
+
423
+ $userConnect = new TwitterOAuth(
424
+
425
+ $consumerKey,
426
+
427
+ $consumerSecrect,
428
+
429
+ $accessToken['oauth_token'],
430
+
431
+ $accessToken['oauth_token_secret']
432
+
433
+ );
434
+
435
+
436
+
437
+
438
+
439
+ // tweetの内容設定
440
+
441
+ $params = [
442
+
443
+ 'status' => 'テスト',
444
+
445
+ ];
446
+
447
+
448
+
449
+ // ツイートする
450
+
451
+ $result = $userConnect->post('statuses/update', $params);
452
+
453
+ header('Location: index.html');
454
+
455
+ exit();
456
+
457
+
458
+
459
+
460
+
461
+ ?>
462
+
463
+ ```
464
+
465
+
466
+
467
+ ## 出来る事
468
+
469
+ - OAuthでログインして、OAuthトークンを取得、セッションに管理することが出来る
470
+
471
+ - ログイン処理完了後ではなく、投稿時に一緒にログインして投稿する場合は成功します。
472
+
473
+ $_GET['oauth_verifier']で取得したoauth_verifierを使えるので投稿できます。