Java 使用TwitterRESTAPI的问题

Java 使用TwitterRESTAPI的问题,java,twitter,Java,Twitter,我在Twitter上有一个屏幕名称列表,我希望获得关于他们Twitter档案的元数据。我也在使用Twitter。这种方法适合我的任务。API文档明确说明它不需要身份验证。以下是我为任务编写的代码: package Twitter; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; i

我在Twitter上有一个屏幕名称列表,我希望获得关于他们Twitter档案的元数据。我也在使用Twitter。这种方法适合我的任务。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)
这是我想要的JSON格式

如果我在这里做什么蠢事,请告诉我

问候,, --丹齐尔


Hank/Splix告诉我我试过使用。这是我修改过的代码:

package Twitter;

import java.io.IOException;

import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

public class TwitterAPI {

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();
    }
}
}

以下是我收到的错误:

package Twitter;

import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.User;

public class TwitterAPI {

/**
 * @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();
    }
}
>>> import urllib
>>> urllib.urlopen("http://api.twitter.com/1/users/show/denzil_correa.json").read()
}

使用API时非常简单。但是,我收到的错误如下:

package Twitter;

import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.User;

public class TwitterAPI {

/**
 * @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();
    }
}
>>> import urllib
>>> urllib.urlopen("http://api.twitter.com/1/users/show/denzil_correa.json").read()

2010年6月23日下午7:12:10 twitter4j.internal.logging.CommonLoggingLogger信息
信息:使用类twitter4j.internal.logging.commonLoggingLoggerFactory作为日志工厂。
2010年6月23日下午7:12:11 twitter4j.internal.logging.CommonLoggingLogger信息
信息:使用twitter4j.internal.http.HttpClientImpl作为HttpClient实现。
TwitterException{statusCode=-1,retryAfter=0,rateLimitStatus=null}
在twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:316)处
位于twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:68)
位于twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:90)
位于twitter4j.Twitter.showUser(Twitter.java:538)
位于Twitter.TwitterAPI.main(TwitterAPI.java:17)
原因:java.net.ConnectException:连接被拒绝:连接
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:365)
位于java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:227)
位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:214)
位于java.net.Socket.connect(Socket.java:531)
位于sun.net.NetworkClient.doConnect(NetworkClient.java:152)
位于sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
位于sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
在com.ibm.net.ssl.www2.protocol.https.c.(c.java:166)
位于com.ibm.net.ssl.www2.protocol.https.c.a(c.java:9)
位于com.ibm.net.ssl.www2.protocol.https.d.getNewHttpClient(d.java:55)
位于sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:724)
位于com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:20)
位于sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:972)
位于java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:385)
位于com.ibm.net.ssl.www2.protocol.https.b.getResponseCode(b.java:52)
位于twitter4j.internal.http.HttpResponseImpl.(HttpResponseImpl.java:42)
在twitter4j.internal.http.httpclientmpl.request(httpclientmpl.java:279)处
... 4更多

同样,我发现错误本质上是相同的。所以,所有的选择都试过了!我肯定这里有我遗漏的东西。如果你能指出同样的问题,那就太好了


Hank,不幸的是,同样的方法在Python中也不起作用:-(


回溯(最近一次呼叫最后一次):
文件“”,第1行,在
urllib.urlopen(“”.read()
urlopen中第86行的文件“C:\Python26\lib\urllib.py”
返回opener.open(url)
文件“C:\Python26\lib\urllib.py”,第205行,打开
返回getattr(self,name)(url)
文件“C:\Python26\lib\urllib.py”,第347行,在OpenHTTP中
errcode,errmsg,headers=h.getreply()
getreply中第1060行的文件“C:\Python26\lib\httplib.py”
response=self.\u conn.getresponse()
getresponse中第986行的文件“C:\Python26\lib\httplib.py”
response.begin()
文件“C:\Python26\lib\httplib.py”,第391行,在begin中
版本、状态、原因=self.\u读取\u状态()
文件“C:\Python26\lib\httplib.py”,第349行,处于读取状态
line=self.fp.readline()
文件“C:\Python26\lib\socket.py”,第397行,在readline中
数据=recv(1)
IOError:[Errno socket error][Errno 10054]远程主机已强制关闭现有连接

正如@splix在评论中提到的那样,仅使用
java.net
进行此操作是…次优的。我从未遇到过没有更好选项的情况。事件更好是他的建议;除非您尝试创建替代方案,否则使用这样的API包装器几乎总是比处理原始HTTP更好你自己

更新:

@Denzil奇怪的是,即使使用
twitter4j
,您也会遇到同样的错误(在我有空闲时间获取库之前,我无法测试代码,等等),因此我开始怀疑Twitter端有问题。如果您安装了Python,请尝试以下操作:

{"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"}
这对我有用

更新2:

这听起来确实像是Twitter故意拒绝你的请求。可能的原因包括:你的IP因为某种原因被列入黑名单,代理巫毒,或是我没有想到的事情。要详细说明代理巫毒:我不知道它对你的请求做了什么,但可能是添加了一个标题或是其他什么TwitterAPI不喜欢。我建议联系Twitter支持(如果有API问题的话)或发布到


顺便说一句,这里有一个例子提到了查看您是否被列入黑名单的方法。

为什么不使用
twitter4j
或者至少使用
commons-httpclient
?@splix您应该将此转化为一个答案,这样我就可以对其进行投票。谢谢splix!我从来都不知道存在http组件客户端。从今以后,我将使用相同的方法处理http请求/响应目的。我尝试过使用相同的工具,但没有解决我的问题。在我的原始帖子的编辑中有更多说明。Hanx/Splix,请检查我的最新编辑。我也尝试了Twitter4J。没有帮助解决问题。如果你能指出问题,那将很好。谢谢:-)也许你正在浏览器中使用代理,不是吗?您是否尝试打开与其他站点的连接以验证连接?Hank/Splix,谢谢您的帮助
>>> import urllib
>>> urllib.urlopen("http://api.twitter.com/1/users/show/denzil_correa.json").read()