gpt4 book ai didi

Java - 连接到亚马逊

转载 作者:行者123 更新时间:2023-11-30 11:38:57 27 4
gpt4 key购买 nike

我正在使用以下代码尝试通过 Amazon 连接到 associates 程序:

    public static Session login(final Account account) throws IOException{
final HashMap<String, String> info = new HashMap<String, String>();
final URL url = new URL("https://affiliate-program.amazon.com/");
final HttpURLConnection connection = (HttpURLConnection)(account.isProxySet() ? url.openConnection(account.getProxy()) : url.openConnection());
connection.setUseCaches(false);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setReadTimeout(timeout);
connection.setConnectTimeout(timeout);
connection.setRequestMethod("POST");
connection.addRequestProperty("User-Agent", account.getUserAgent());
connection.addRequestProperty("User-Content", "text/plain");
connection.setAllowUserInteraction(true);
final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
final Scanner reader = new Scanner(connection.getInputStream());
while(reader.hasNextLine()){
final String line = reader.nextLine().trim();
if(line.contains("<input type=\"hidden\"")){
final String[] split = line.split("\"");
info.put(split[3], split[5]);
}
}
String writable = "";
final Iterator<String> iterator = info.keySet().iterator();
while(iterator.hasNext()){
final String key = iterator.next();
writable += String.format("%s=%s", URLEncoder.encode(key, "UTF-8"), URLEncoder.encode(info.get(key), "UTF-8"));
if(iterator.hasNext()) writable += "&";
}
final String data = String.format("%s&email=%s&password=%s&submit=Sign In", writable, URLEncoder.encode(account.getEmail(), "UTF-8"), URLEncoder.encode(account.getPass(), "UTF-8"));
System.out.println(data);
writer.write(data);
writer.flush();
writer.close();
connection.getInputStream().read();
System.out.println(connection.getURL().toString());
return new Session(account);
}

Session 和 Account 类都是我的,但与我的问题无关。所以基本上我正在尝试连接到亚马逊网站,但我遇到了问题。每当它打印出它实际写入的数据时,它看起来就像它在网页源代码中的样子(写下正确的名称及其相关值)。但是,当它打印出新 URL 时,它与旧 URL 相同。

我想我确实知道原因;看起来你在写之前无法阅读(这就是为什么我在初始化扫描仪之前初始化 BufferedWriter 的原因,因为如果我不这样做,它会告诉我我不能在阅读后写并抛出 IOException)基本上如果你查看站点的页面源代码,您会看到一个名为“sessionId”的 ID,每次打开新连接时它都会更改。

所以我只能得出结论,唯一的解决方案是在写入之前找出某种方式来读取,这样 session ID 就不会改变。我得出这个结论是因为每次我创建一个新连接并打印出我正在编写的数据(在编码之前)时, session ID 都是不同的。有没有人对如何做到这一点有任何想法?任何想法将不胜感激。谢谢。

编辑:根据 ruakh 的回答修改了代码。

最佳答案

一个问题是:

    writer.write(URLEncoder.encode(data, "UTF-8"));

将用 URL 转义替换所有的符号和等号,所以不要发布这样的内容:

a=b&c=d&e=f

您正在发布这样的内容:

a%3Db%26c%3Dd%26e%3Df

这实际上是垃圾。

您需要分别对各个组件执行 URL 编码,然后使用 =& 组合结果。

关于Java - 连接到亚马逊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13482785/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com