postman 我如何通过编程方式检查我在USCIS的申请状态?

d7v8vwbk  于 2022-12-18  发布在  Postman
关注(0)|答案(3)|浏览(148)

每天,我都需要在USCIS网站(https://egov.uscis.gov/casestatus/landing.do)上查看我的签证申请状态。由于手动操作很麻烦,我在UIPath中创建了自动化功能,每隔几个小时运行一次,如果状态发生变化,就给我发电子邮件。但是,它仍然需要打开浏览器,导航到页面,阅读结果等。
有没有更好的解决办法?
我试着寻找移民局是否有任何API,我可以编程调用,但似乎没有任何.我看了看页面,发现收据号码的文本框有以下HTML:

<input id="receipt_number" name="appReceiptNum" type="text" class="form-control textbox" maxlength="13"/>

因此,我尝试从Postman发出一个GET请求:

GET https://egov.uscis.gov/casestatus/landing.do?receipt_number=XXXXXXXX

其中XXXXXXXX是我的实际申请号。但是这不起作用,它只返回了主页。我尝试将其切换到POST,但也不起作用,返回了相同的结果。在进一步检查时,我意识到实际的结果页面有一个不同的URL,所以我在结果URL上尝试了GET和POST:

GET https://egov.uscis.gov/casestatus/mycasestatus.do?receipt_number=XXXXXXXX


这会得到一个页面,告诉我有验证错误,他们没有识别。
返回到手动过程,看看我是否遗漏了什么。结果页面URL的格式为

https://egov.uscis.gov/casestatus/mycasestatus.do?JSESSIONID=ZZZZZZZZZ

其中ZZZZZZZ是在登录页面期间设置的JSESSIONID cookie的值。因此,我将我的流程更改为:
1.向登录页发送GET请求(https://egov.uscis.gov/casestatus/landing.do
1.从响应中复制JSESSIONID cookie的值,并将其设置为结果页面(https://egov.uscis.gov/casestatus/mycasestatus.do)请求中的查询参数,同时将receipt_number作为POST请求中的有效负载发送
我的最终目标是编写Python或Java代码(因为这是我熟悉的两种代码)来获得结果,但我想如果我不能从Postman中获得手动请求,那么从代码中获得请求就是白日做梦了。

kyks70gy

kyks70gy1#

您不需要session标记,只需将 Postman 请求中的param name更改为appReceivNum即可:https://egov.uscis.gov/casestatus/mycasestatus.do?appReceiptNum=LINXXXXXXXXXX

yx2lnoni

yx2lnoni2#

@阿洛克
您需要的是术语“headless browser / scraper”,只是创建了一个快速示例(但在node.js中)

const today = formatYmd(new Date()) 
    const browser = await puppeteer.launch()
    const page = await browser.newPage()
    console.log("going to URL")
    await page.goto(url)
    await page.$eval('#receipt_number', (el,receipt) => el.value = `${receipt}`, process.env.RECEIPT_NUMBER)
    await page.click('input[type="submit"]')
    console.log("waiting for submission to be completed.")
    await page.waitForSelector('div.current-status-sec').catch(t => console.log("Not able to load status screen"))
    const status = removeTags(await page.$eval('.current-status-sec', el => el.innerText))
    console.log(`${today}: ${status}`)
    await page.screenshot({path: `./screenshot/${today}_screenshot.png`})
    browser.close()

您可以在此处找到完整的存储库。https://github.com/Parthashah/uscis-status-check
代码将提供返回屏幕截图和状态x1c 0d1x

nfzehxib

nfzehxib3#

我刚刚创建了一个简单的移民局网页爬虫刮刀Spring Boot 应用程序使用HtmlUnit .唯一的事情是我的爬虫忽略了错误的案例编号.但正在工作. github链接在这里:https://github.com/somych1/USCISCaseStatusWebScraper

public ResponseDTO getStatus(String caseId){
    ResponseDTO responseDTO = new ResponseDTO();

    //browser setup
    WebClient webClient = new WebClient(BrowserVersion.CHROME);
    webClient.getOptions().setUseInsecureSSL(true);
    webClient.getOptions().setRedirectEnabled(true);
    webClient.getOptions().setJavaScriptEnabled(false);
    webClient.getOptions().setCssEnabled(false);
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    webClient.getCookieManager().setCookiesEnabled(false);
    webClient.getOptions().setTimeout(8000);
    webClient.getOptions().setDownloadImages(false);
    webClient.getOptions().setGeolocationEnabled(false);
    webClient.getOptions().setAppletEnabled(false);

    try{
        // loading the HTML to a Document Object
        HtmlPage page = webClient.getPage(url);

        // case lookup
        HtmlInput input = page.getHtmlElementById("receipt_number");
        input.setValueAttribute(caseId);
        HtmlInput button = page.getElementByName("initCaseSearch");
        HtmlPage pageAfterClick = button.click();

        // new page after click
        HtmlHeading1 h1 = pageAfterClick.getFirstByXPath("//div/h1");
        HtmlParagraph paragraph = pageAfterClick.getFirstByXPath("//div/p");

        //setting response object
        responseDTO.setCaseId(caseId);
        responseDTO.setStatus(status);
        responseDTO.setDescription(description);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return responseDTO;
}

相关问题