ようへい
ラベル Twitter の投稿を表示しています。 すべての投稿を表示
ラベル Twitter の投稿を表示しています。 すべての投稿を表示

2020年1月7日火曜日

twit で Error: incorrect header check が発生する場合の対処法

Chrome Extension で twit を使い Twitter からデータを取得していたのだが、11月くらいから Error: incorrect header check が発生していた。 パケットを見るとデータの取得は出来ているようだったが、スタックトレースを見ると、以下のようなログが出ていた。
11:59:05.119 background.ts:298 Error: incorrect header check
    at Zlib._handle.onerror (index.js:352)
    at Zlib._error (binding.js:283)
    at Zlib._checkError (binding.js:254)
    at Zlib._after (binding.js:262)
    at eval (binding.js:126)
    at eval (process.js:5)
GitHub 側にも報告有り。
Error: data error: incorrect header check · Issue #520 · ttezel/twit · GitHub
https://github.com/ttezel/twit/issues/520 想像だが、11月から Twitter APIが乗っているサーバが変わったとかで、gzip 圧縮の仕様が変わり、 Accept-Encoding: gzip を付けてAPIをリクエストした場合、返された gzip データを解凍できなくなり発生しているんだと思う。
gzip 圧縮を許可させなければいいので、twit のソースを変更することで、対処できそう。
本当は pull request 出せればいいんですが、issue 見ても動きが無いし、プロジェクトはもう動いて無い感じ・・・。
そして twit よりよさげな Twitter API クライアントも無い。
なので、twit にモンキーパッチを当てて回避する。
モンキーパッチで対処するため、パラメタで On/Off とかも考えず、とりあえず gzip 圧縮を無効にする。 まず、twit にパッチを当てたいので、patch-package を入れることにする。
$ yarn add -D patch-package
package.json の scripts に "postinstall": "patch-package" を追加
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "build:report": "vue-cli-service build --report",
    "build:dev": "vue-cli-service build --mode development",
    "build-watch": "vue-cli-service build-watch",
    "build-watch:dev": "vue-cli-service build-watch --mode development",
    "postinstall": "patch-package"
  },
twit の twitter.js の L208 をコメントアウト
twit/twitter.js at master · ttezel/twit · GitHub
https://github.com/ttezel/twit/blob/master/lib/twitter.js#L208
diff --git a/node_modules/twit/lib/twitter.js b/node_modules/twit/lib/twitter.js
index 9540857..c6baae3 100644
--- a/node_modules/twit/lib/twitter.js
+++ b/node_modules/twit/lib/twitter.js
@@ -205,7 +205,7 @@ Twitter.prototype._buildReqOpts = function (method, path, params, isStreaming, c
       'Accept': '*/*',
       'User-Agent': 'twit-client'
     },
-    gzip: true,
+    // gzip: true,
     encoding: null,
   }
パッチ作成
$ npx patch-package twit
パッチが効いているか試すため twit を入れなおす。
$ yarn remove twit
$ yarn add -D twit
これで twitter.js の L208 がコメントアウトされていればOK。
あとは build して、Error: incorrect header check が発生しないことを確認する。
関連記事

2013年2月13日水曜日

[Twitter4J] Authentication credentials が発生する場合の対処

Twitter4JでTwitter APIを利用したアプリを作っていてハマったのでメモ

発端

これまでいくつもTwitter4Jを利用したアプリは作っていたので、今回もTwitterのAccess tokenを取得したり、プログラムを作るところはすんなり進んだ。
テストのため、Twitter4Jからつぶやいてみた。
しかし、以下のエラーが発生し、つぶやかれない。
Error: 401:Authentication credentials (https://dev.twitter.com/pages/auth) were missing or incorrect. Ensure that you have set valid consumer key/secret, access token/secret, and the system clock is in sync. message - Error processing your OAuth request: Read-only application cannot POST code - 89 Relevant discussions can be found on the Internet at: http://www.google.co.jp/search?q=******** or http://www.google.co.jp/search?q=******** TwitterException{exceptionCode=[********-********], statusCode=401, message=Error processing your OAuth request: Read-only application cannot POST, code=89, retryAfter=-1, rateLimitStatus=null, version=3.0.3}
access token作った時、Access levelRead and writeにしたよなぁ・・・と思い、My applicationsでYour access tokenのAccess levelを確認したところ、Read-onlyになってました。
access token作った際の手順を思い出してみました。
おそらく、Access levelがRead-onlyの状態でaccess tokenを作って、その後Read and writeに設定したと思われます。

Twitterアプリ作成時の手順

失敗を繰り返さないように、備忘録として手順を整理します。
  1. SettingsでAccess levelRead and writeに設定
  2. access tokenの発行
  3. Detailsで、Your access tokenのAccess levelRead and writeであることを確認
関連記事

2012年9月24日月曜日

Firefox 向け 検索エンジン

Firefox向け 検索エンジンです。
ボタンをクリックする事で検索エンジンを追加することが出来ます。
Firefox 16 beta 4に更新したら突然検索エンジンがTwitterとWikipediaのみになってしまったので自作。
インストールすると以下のように表示されます。
Firefox 向け 検索エンジン
Google 日本語 (google.co.jp) にて検索を行います。
Google Play (play.google.com) にて日本語を対象とした検索を行います。
Twitter (twitter.com) にて日本語を対象とした検索を行います。
参考
Creating OpenSearch plugins for Firefox | MDN
https://developer.mozilla.org/en-US/docs/Creating_OpenSearch_plugins_for_Firefox
GET search | Twitter Developers
https://dev.twitter.com/docs/api/1/get/search
関連記事

2012年5月15日火曜日

Twitter APIで レスポンスコード 400 が返る場合の対処

400 Bad Requestが返される

このブログにもTwitterのWidgetを配置していますが、このWidgetの中ではTwitterのAPIが呼ばれています。
しかし、このAPIには、リクエストの制限が施されており、未認証状態でAPIをリクエストする場合は1時間あたり150リクエストまで、認証状態でリクエストする場合は、1時間あたり350リクエストまでとなっている。
Rate Limiting | Twitter Developers
https://dev.twitter.com/docs/rate-limiting たまたまFirebugのコンソールを眺めていたら、400 Bad RequestというエラーがTwitter APIで発生していた。
Twitter APIを利用している部分はtry/catchで囲んでいたのだが、どうやらエラーハンドリングができていないらしい。
使用していたコードは以下。
try{
  $(document).ready(function() {
    new TWTR.Widget({
      //必要に合わせパラメタを指定
    }).render().setUser('TwitterのID').start();
  });
} catch (e){}
エラーが発生したことで、Javascriptが中断され、後続の処理が実行されていない。
という事で解決策を調べてみた。

リクエスト可能な残数を調べる

Twitter APIのページを眺めていたら、APIをリクエスト可能な残数を調べることができるという事がわかった。
GET account/rate_limit_status | Twitter Developers
https://dev.twitter.com/docs/api/1/get/account/rate_limit_status これによると、http://api.twitter.com/1/account/rate_limit_status.format (formatはjson/xmlのいずれかを指定)をリクエストする事により、リクエスト可能な残数を取得できるとの事。
以下のリンクをクリックすると、リクエスト可能な残数(remaining_hits)を含めたJSONを参照できます。
https://api.twitter.com/1/account/rate_limit_status.json
という事で、Twitter APIによるウィジェットをリクエストする前に、あらかじめ上記のURLからJSONを取得し、リクエスト可能な残数を調べ、リクエスト可能であればウィジェットをリクエストするという処理にすれば良さそう。

対処したコード

前提条件
  • jQuery (1.5以上のバージョン) を読み込んでいる事
  • http://widgets.twimg.com/j/2/widget.jsを読み込んでいる事
try{
  $(document).ready(function() {
    $.getJSON('http://api.twitter.com/1/account/rate_limit_status.json?callback=?', {}, function(json){
      if(json.remaining_hits != "0"){
        new TWTR.Widget({
          //必要に合わせパラメタを指定
        }).render().setUser('TwitterのID').start();
      }
    });
  });
} catch (e){}

TWTR.Widgetのパラメタ

基本的には以下で自動生成できるので、それを使う。
Twitter / プロフィールウィジェット
http://twitter.com/about/resources/widgets/widget_profile
Twitter / 検索ウィジェット
https://twitter.com/about/resources/widgets/widget_search
Twitter / お気に入りウィジェット
https://twitter.com/about/resources/widgets/widget_faves
Twitter / リストウィジェット
https://twitter.com/about/resources/widgets/widget_list パラメタについて自分で調べてみた。
パラメタ 説明
id Widgetを挿入するエレメントのID
version Widgetのバージョン
type Widgetの種類
プロフィール/検索/お気に入り/一覧 のいずれかを指定
(profile|search|faves|favs|list|lists)
search 検索キーワード
typeにsearchを指定した場合必須
rpp 表示するツイート数
subject ウィジェットに表示するキャプション
typeにsearch,faves,favs,list,listsを指定した場合のみ有効
title ウィジェットに表示するタイトル
typeにsearch,faves,favs,list,listsを指定した場合のみ有効
footer フッタに表示するタイトル
creator 開発者モード(true|false)
trueにした場合、/stylesheets/widgets/widget.cssのCSSがリクエストされます。
このCSSはあらかじめ用意しておく必要があります。
interval ツイートを更新する間隔(msec)
features/loopをtrueにしている場合は、ループ間隔
width ウィジェットの幅(px)
height ウィジェットの高さ(px)
theme Widgetのスタイル
theme/shell Widget外側のスタイル
theme/tweets Widget内側(Tweet部分)のスタイル
features Widgetの機能を指定
features/scrollbar スクロールバーの表示/非表示(true|false)
features/loop ループ表示するか(true|false)
features/live 最新のデータを読み込むか(true|false)
features/behavior すべてのツイートを読み込むか(default|all)
関連記事