0

私はlist/members/create_alllist/members / destroy_allを使用していますが、どちらも呼び出しごとに100ユーザーの制限を主張しています。通話を90ユーザーに制限していますが、それでも断続的にToo many terms specified in queryエラーが発生します...通話を40ユーザー以下に制限すると、断続的にこのエラーが発生することもあります。

代わりに電話をかける特定のユーザーにのみ適用されるようです。90ユーザーの制限で問題なく反復できるユーザーもいますが、反復するユーザーの中にはToo many terms specified in query、呼び出しを厳しく制限しない限りエラーが発生するものがあります。 (たとえば、一度に10人のユーザー)...しかし、その厳しい制限は別の問題を提示します-ユーザーに非常に多くの小さな電話をかけようとすると、レート制限に達します。

データベース内の各ユーザーをで繰り返し処理し、User.all.each do |u|そのブロック内の各ユーザーのTwitterへの接続を次のように作成しています。

  client = Twitter::Client.new(
    :consumer_key => TWITTER_CONSUMER_KEY,
    :consumer_secret => TWITTER_CONSUMER_SECRET,
    :oauth_token => u.twitter_token,
    :oauth_token_secret => u.twitter_secret
  )

これは、リストからユーザーを削除するために使用するコードです。

  removing_from_list.each_slice(90) do |remove_ids|
    client.list_remove_members(list_id, remove_ids)
    sleep 2
  end

ユーザーをリストに追加するためのこのコード:

  adding_to_list.each_slice(90) do |adding_ids|
    client.list_add_members(list_id, adding_ids)
    sleep 2
  end

この問題は、Twitter gemの使用と、Rested(Mac RESTクライアント)を使用してTwitterAPIに直接アクセスすることの両方で発生しました。

4

1 に答える 1

0

この質問は、 REST API v1.1開発者ディスカッションにも投稿しました。そこでlist_add_membersは、問題の一部について提案を受けました。その提案は、リストが500を超えないようにし、ユーザーが20以上のリストを持っていないことを確認することでした。私が見つけたものを考えると、それがどれほど関連性があるかはわかりませんが、それでも確かに良いアドバイスです。

この問題を解決する方法は、エラーが発生した場合にリスト自体を削除して再作成することでした。

  removing_from_list.each_slice(99) do |remove_ids|
    begin
      client.list_remove_members(list_id, remove_ids)
      sleep 2
    rescue => error
      if error == "Too many terms specified in query"
        client.list_destroy(list_id)
        client.list_create('ListName', :description => 'List Description')
        list_id = client.list('ListName').id
      end
    end
  end

これが行われた後、リストは期待どおりに動作しました。また、リストを何度も削除/再作成する必要はありませんでした。したがって、リスト自体の問題か、リストが削除/再作成される前にたまたまリストに存在していたユーザーのいずれかであると宣言することにかなり自信があります。

于 2013-01-16T20:34:09.040 に答える