やったこと

webサービスを作るときに考えたことを垂れ流します

ツイッターのストリーミングAPIが401エラーで使えない!

ツイッターの「ストリーミングAPI」を使ってつぶやきを採取する実験をしているんですが、いつも使えてるAPIがいきなり使用不能になってしまいました・・。

私は「Phirehose」というPHPのライブラリでAPIを利用しているのですが、以下のようなエラーが出て接続失敗していまいます・・。

Phirehose: HTTP failure 1 of 20 connecting to stream: HTTP ERROR 401: Authorization Required (<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\n<title>Error 401 Unauthorized</title></head><body><h2>HTTP ERROR: 401</h2><p>Problem accessing '/1.1/statuses/sample.json'. Reason:<pre>    Unauthorized</pre></body></html>). Sleeping for 10 seconds.

なんだかツイッターの認証が「401」のエラーで失敗してるみたいですね・・。

いろいろググってみたところ、どうやらこのエラーの原因、私のサーバー(CentOS6)の時刻が狂っているせいみたいです。

たしかに、サーバに入って以下のようにdateコマンドで時刻を表示してみると、時計が一時間くらい狂っていました(状態もINITというあやしげな表記になっています・・)

# date
Mon Jul  3 18:41:39 JST 2017

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
============================================================================== 
     hogege          .INIT.      16 u    - 1024    0    0.000    0.000   0.000


そこでntpdを再起動して時計の調整を試みます。

# service ntpd restart
Shutting down ntpd:                                        [  OK  ]
Starting ntpd:                                             [  OK  ]


しかし、ntpdを再起動しても時刻を調整してくれません、困りました・・。

ntpってなんだか難しいんですよね・・。
時刻が調整されるのにすごい時間がかかったり、時刻がズレすぎてると調整をしてくれなかったり、とっても複雑でよく分らない動きをするプロトコルみたいです・・。

# date
Mon Jul  3 18:42:40 JST 2017

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
    hogegege         1.1.1.1      2 u    3   64    3    8.212  4530468   0.071


仕方がないので手動で時刻を設定する作戦に打って出ます。

手元の時計を見計らって「えいっ!」とdateコマンドを押し込みます(ntpってこういうことしても大丈夫なんでしたっけ・・?)

# date -s "07/03 20:03 2017"
Mon Jul  3 20:03:00 JST 2017

# service ntpd restart
Shutting down ntpd:                                        [  OK  ]
Starting ntpd:                                             [  OK  ]

# date
Mon Jul  3 20:03:15 JST 2017

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
    hogegege         1.1.1.1     2 u   11   64    1    8.083  -96.873   0.000

上記のように手動で強引に時刻を修正したところ、無事にツイッターAPIが使えるようになりました。

NTPもとくエラーとか吐かずに無事に動いてくれている様子です。

たぶんこれでよかったんだと思います、たぶん・・。


※P.S.
先日、ntpとはまた別の理由で、ストリーミングAPIが使用不能になってしまいました・・。

原因がまだはっきり特定できていないのですが、おそらく私のツイッターアカウントのメールアドレスの設定を変えてしまったことによって、なにかエラーが発生してしまった可能性があります・・。

ツイッターって、ひょっとしてメールアドレスを変えると、認証のための「Access Token」や「Access Token Secret」の値が変更される仕様になっているんでしょうか?ツイッターの開発者ページにログインして確認したところ、以前使っていた値が新しく変更されてしまっている気がします・・。

新しく発行された「Access Token」や「Access Token Secret」の値を使用してアクセスしたところ、無事にAPIが使えるようになりました・・。

なんだかモヤモヤしますが、とりあえずはこれで良しとします・・。