Проблема с использованием Twitter REST API - PullRequest
0 голосов
/ 23 июня 2010

У меня есть список отображаемых имен в Twitter, и я хочу получить метаданные об их профиле в Twitter. Я использую Twitter REST API для того же. Метод users / show подходит для моей задачи. В документации API четко указано, что она не требует аутентификации. Вот код, который я написал для своей задачи:

package Twitter;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class TwitterAPI {

    private static String url = "http://api.twitter.com/1/users/show/";

    /*
     * Sends a HTTP GET request to a URL     
     * @return - The response from the end point
     */
    public static String sendGetRequest(String endpoint, String screen_name) {
        String result = null;


        if (endpoint.startsWith("http://")){
            //Send HTTP request to the servlet
            try {
                //Construct data
                StringBuffer data = new StringBuffer();

                //Send data
                String urlStr = endpoint ;  

                if(screen_name!=null && screen_name.length() > 0){
                    urlStr += screen_name + ".json";
                }
                System.out.println(screen_name.length());
                System.out.println("The URL call is: " + urlStr);
                URL url = new URL(urlStr);
                URLConnection conn = url.openConnection ();

                //Get the response
                BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                StringBuffer sb = new StringBuffer();
                String line;

                while((line = rd.readLine())!=null){
                    sb.append(line);
                }

                rd.close();
                result = sb.toString();

            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {

                //If API issue, collect screen names to write to API issue file             
                System.out.println("Twitter API issue :" + screen_name);

                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


        return result;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        String result = sendGetRequest(url, "denzil_correa");
        System.out.println(result);
    }

}

Однако при запуске того же самого я получаю следующее исключение:

13
The URL call is: http://api.twitter.com/1/users/show/denzil_correa.json
Twitter API issue :denzil_correa
java.net.ConnectException: Connection timed out: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:365)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:227)
null
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:214)
    at java.net.Socket.connect(Socket.java:531)
    at java.net.Socket.connect(Socket.java:481)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:233)
    at sun.net.www.http.HttpClient.New(HttpClient.java:306)
    at sun.net.www.http.HttpClient.New(HttpClient.java:323)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:783)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:724)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:649)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:972)
    at Twitter.TwitterAPI.sendGetRequest(TwitterAPI.java:43)
    at Twitter.TwitterAPI.main(TwitterAPI.java:76)

URL-адрес правильный, так как при попытке ввести URL-адрес: http://api.twitter.com/1/users/show/denzil_correa.json в браузере я получаю следующее:

{"time_zone":"Mumbai","description":"","lang":"en","profile_link_color":"1F98C7","status":{"coordinates":null,"contributors":null,"in_reply_to_screen_name":"shailaja","truncated":false,"in_reply_to_user_id":14089830,"in_reply_to_status_id":16789217674,"source":"web","created_at":"Tue Jun 22 19:43:46 +0000 2010","place":null,"geo":null,"favorited":false,"id":16793898396,"text":"@shailaja Harsh !"},"profile_background_image_url":"http://s.twimg.com/a/1276711174/images/themes/theme2/bg.gif","profile_sidebar_fill_color":"DAECF4","following":false,"profile_background_tile":false,"created_at":"Sun Jun 29 20:23:29 +0000 2008","statuses_count":1157,"profile_sidebar_border_color":"C6E2EE","profile_use_background_image":true,"followers_count":169,"contributors_enabled":false,"notifications":false,"friends_count":246,"protected":false,"url":"http://https://sites.google.com/a/iiitd.ac.in/denzilc/","profile_image_url":"http://a3.twimg.com/profile_images/643636081/Cofee_Mug_normal.jpg","geo_enabled":true,"profile_background_color":"C6E2EE","name":"Denzil Correa","favourites_count":3,"location":"India","screen_name":"denzil_correa","id":15273105,"verified":false,"utc_offset":19800,"profile_text_color":"663B12"}

в формате JSON, который я хочу.

Пожалуйста, дайте мне знать, если я делаю что-нибудь глупое здесь.

С уважением, --Denzil


Хэнк / Спликс, как я уже говорил, я пытался использовать Клиент компонентов HTTP . Вот мой модифицированный код:

 
package Twitter;</p>

<p>import java.io.IOException;</p>

<p>import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;</p>

<p>import org.apache.http.impl.client.DefaultHttpClient;</p>

<p>public class TwitterAPI {</p>

<pre><code>private static String url = "http://api.twitter.com/1/users/show/denzil_correa.json";


/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    HttpClient httpclient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet(url);

    try {
        HttpResponse response = httpclient.execute(httpget);
        System.out.println(response.toString());

    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

Вот ошибка, которую я получаю:

 <code>
org.apache.http.conn.HttpHostConnectException: Connection to <a href="http://api.twitter.com" rel="nofollow noreferrer">http://api.twitter.com</a> refused
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:127)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:147)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
    at Twitter.TwitterAPI.main(TwitterAPI.java:30)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:365)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:227)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:214)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:378)
    at java.net.Socket.connect(Socket.java:531)
    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:123)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:123)
    ... 7 more
Удивительно, но это также дает аналогичное исключение из кода, написанного для обработки HTTP-ответов вручную. Я понимаю, что ручная обработка ответов HTTP может быть неоптимальной, но в настоящее время я не смотрю на написание оптимального кода. Я хотел бы выполнить свою задачу, даже если это означает быть быстрым и грязным.

Просто чтобы сообщить вам, я могу успешно вызвать API Graph Facebook , используя первый опубликованный код. Я получаю тот же ответ, что и при вставке URL в браузер.

Я также попробую еще раз использовать API Twitter4J и проверить, смогу ли я выполнить свою задачу. Буду держать вас в курсе.


Итак, вот код, использующий Twitter4J:


package Twitter;</p>

<p>import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;</p>

<p>public class TwitterAPI {</p>

<pre><code>/**
 * @param args
 */
public static void main(String[] args) {
    Twitter unauthenticatedTwitter = new TwitterFactory().getInstance();
    try {
        User user = unauthenticatedTwitter.showUser("denzil_correa");

        System.out.println(user.getLocation());
    } catch (TwitterException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

Довольно просто, как и ожидалось, используя API. Однако вот ошибка, которую я получаю:

<code>
Jun 23, 2010 7:12:10 PM twitter4j.internal.logging.CommonsLoggingLogger info
INFO: Using class twitter4j.internal.logging.CommonsLoggingLoggerFactory as logging factory.
Jun 23, 2010 7:12:11 PM twitter4j.internal.logging.CommonsLoggingLogger info
INFO: Use twitter4j.internal.http.HttpClientImpl as HttpClient implementation.
TwitterException{statusCode=-1, retryAfter=0, rateLimitStatus=null}
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:316)
    at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:68)
    at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:90)
    at twitter4j.Twitter.showUser(Twitter.java:538)
    at Twitter.TwitterAPI.main(TwitterAPI.java:17)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:365)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:227)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:214)
    at java.net.Socket.connect(Socket.java:531)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:152)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
    at com.ibm.net.ssl.www2.protocol.https.c.(c.java:166)
    at com.ibm.net.ssl.www2.protocol.https.c.a(c.java:9)
    at com.ibm.net.ssl.www2.protocol.https.d.getNewHttpClient(d.java:55)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:724)
    at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:20)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:972)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:385)
    at com.ibm.net.ssl.www2.protocol.https.b.getResponseCode(b.java:52)
    at twitter4j.internal.http.HttpResponseImpl.(HttpResponseImpl.java:42)
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:279)
    ... 4 more</p>

<p>

Опять же, я вижу, что ошибка по сути та же самая. Итак, все варианты перепробованы! Я уверен, что что-то здесь мне не хватает. Было бы здорово, если бы вы могли указать на то же самое.


Хэнк, к сожалению, то же самое не работает и в Python: - (

<code>
Traceback (most recent call last):
  File "", line 1, in 
    urllib.urlopen("<a href="http://api.twitter.com/1/users/show/denzil_correa.json" rel="nofollow noreferrer">http://api.twitter.com/1/users/show/denzil_correa.json</a>").read()
  File "C:\Python26\lib\urllib.py", line 86, in urlopen
    return opener.open(url)
  File "C:\Python26\lib\urllib.py", line 205, in open
    return getattr(self, name)(url)
  File "C:\Python26\lib\urllib.py", line 347, in open_http
    errcode, errmsg, headers = h.getreply()
  File "C:\Python26\lib\httplib.py", line 1060, in getreply
    response = self._conn.getresponse()
  File "C:\Python26\lib\httplib.py", line 986, in getresponse
    response.begin()
  File "C:\Python26\lib\httplib.py", line 391, in begin
    version, status, reason = self._read_status()
  File "C:\Python26\lib\httplib.py", line 349, in _read_status
    line = self.fp.readline()
  File "C:\Python26\lib\socket.py", line 397, in readline
    data = recv(1)
IOError: [Errno socket error] [Errno 10054] An existing connection was forcibly closed by the remote host

1 Ответ

1 голос
/ 23 июня 2010

Как упомянуто в комментариях @splix, использование только java.net является… неоптимальным.Я еще никогда не сталкивался с ситуацией, когда HttpClient не был лучшим вариантом.Событие лучше его предложение twitter4j;если вы не пытаетесь создать альтернативу, почти всегда лучше использовать подобную оболочку API, а не обрабатывать необработанные HTTP-взаимодействия самостоятельно.

ОБНОВЛЕНИЕ:

@ Дензил, странно, что выЯ получаю эту же ошибку даже с twitter4j (я не могу протестировать код, пока у меня не будет свободного времени, чтобы взять библиотеку и т. д.), поэтому я начинаю подозревать проблему в конце Twitter.Если у вас установлен Python, попробуйте следующее:

>>> import urllib
>>> urllib.urlopen("http://api.twitter.com/1/users/show/denzil_correa.json").read()

Это сработало для меня.

ОБНОВЛЕНИЕ 2:

Это определенно звучит так, как будто Твиттер намеренно отклоняет ваши запросы.Возможные причины могут включать: ваш IP-адрес находится в черном списке по какой-то причине, прокси-вуду или вещи, о которых я не задумывался.Разберемся с прокси-вуду: я не знаю, что именно он делает с вашими запросами, но, возможно, он добавляет заголовок или что-то, что не нравится API Twitter.Я бы порекомендовал обратиться в службу поддержки Twitter (если есть такая проблема для API) или опубликовать список рассылки .

Кстати, вот ветка из списка рассылки , в котором упоминаются способы проверить, внесены ли вы в черный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...