Скрыть JS HTTP POST в версию Java - PullRequest
0 голосов
/ 29 марта 2019

Я хочу почистить своих подписчиков в Instagram и нашел этот сайт: https://webrobots.io/scrape-instagram-followers/.

На сайте браузера есть способ выбрать подписчиков, используя AJAX вызов.

Требуется, чтобы пользователь сначала вошел в систему, чтобы он мог иметь cookie. У меня есть программа для входа в систему Instagram с использованием селена, и я извлек cookie для пользователя, и я подтвердил, что в следующий раз я смогу использовать cookie для непосредственного входа в систему (имя пользователя и пароль не требуются).

Я хочу подойти к этому с помощью Java и иметь следующий код (обратите внимание, что я зарегистрировал cookie):

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Set;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.Cookie;

@Slf4j
public class HttpPost {

    private static HttpURLConnection con;

    public static void main(String[] args) throws MalformedURLException,
        ProtocolException, IOException, DataAccessException {

        CustomerDaoImpl customerDao = new CustomerDaoImpl();
        Customer customer1 = customerDao.get(Customer.class, "loggedinuser");
        Set<Cookie> cookies = customer1.obtainCookies();

        StringBuilder stringBuffer = new StringBuilder();
        cookies.stream().forEach(c -> {
            final String cookieLine;
            if (stringBuffer.toString().equals("")) {
                cookieLine = String.format("%s=%s;", c.getName(), c.getValue());
            } else {
                cookieLine = String.format(" %s=%s;", c.getName(), c.getValue());
            }
            stringBuffer.append(cookieLine);
        });

        String cookieInOneLine = stringBuffer.toString().substring(0, stringBuffer.toString().length() - 1);

        log.info("Cookie is {}", cookieInOneLine);

        String user_id = "insusername";

        String request = "q=ig_user(" + user_id + ")+%7B%0A++followed_by.first(20)" +
                         "+%7B%0A++++count%2C%0A++++page_info+%7B%0A++++++end_cursor%2C%0A++++++has_next_page%0A" +
                         "++++%7D%2C%0A++++nodes+%7B%0A++++++id%2C%0A++++++is_verified%2C%0A++++++followed_by_viewer" +
                         "%2C%0A++++++requested_by_viewer%2C%0A++++++full_name%2C%0A++++++profile_pic_url%2C%0A" +
                         "++++++username%0A++++%7D%0A++%7D%0A%7D%0A&amp;amp;amp;ref=relationships%3A%3Afollow_list";


        String url = "https://www.instagram.com/query/";
        //String urlParameters = "name=Jack&occupation=programmer";
        byte[] postData = request.getBytes(StandardCharsets.UTF_8);

        try {

            URL myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();

            con.setDoOutput(true);
            con.setRequestMethod("POST");
//            con.setRequestProperty("User-Agent", "Java client");
            con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            con.setRequestProperty("x-csrftoken", "faHW1D3nRMmnL72Ilu7bMPuHSrG1dyUS");
            con.setRequestProperty("x-instagram-ajax", "1");
            con.setRequestProperty("Cookie", cookieInOneLine);

            try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }

            StringBuilder content;

            try (BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()))) {

                String line;
                content = new StringBuilder();

                while ((line = in.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }

            System.out.println(content.toString());

        } finally {

            con.disconnect();
        }
    }
}

Но я получил HTTP 405, похоже, мне не разрешено выполнять этот POST запрос? Это потому, что я не настроил header или cookie должным образом?

Я получил следующий вывод из Java:

2019-03-29 13:58:43.452 [main] INFO  test.HttpPost - Cookie is urlgen="{\"72.21.196.67\": 16509}:1h5jBQ:8TQTlVwg7SszekH_d0e2U5-pfso"; ds_user_id=10083971860; mid=XI8T1gAEAAFdXjl7c-veIodiYANe; shbts=1552880603.6637821; sessionid=10083971860%3A38gLQoQB6TLaGB%3A5; csrftoken=faHW1D3nRMmnL72Ilu7bMPuHSrG1dyUS; shbid=717; rur=PRN

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 405 for URL: https://www.instagram.com/query/
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)
    at insbot.HttpPost.main(HttpPost.java:81)
...