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

问题描述 投票:0回答:4

每天,我都需要在 USCIS 网站上查看我的签证申请状态(https://egov.uscis.gov/casestatus/landing.do)。由于手动执行此操作很麻烦,因此我在 UIPath 中创建了自动化,每隔几个小时运行一次,并在状态发生变化时向我发送电子邮件。不过,它仍然需要打开浏览器,导航到页面,读取结果等

有没有更好的方法来解决这个问题?

我尝试查找 USCIS 是否有任何可以通过编程方式调用的 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

其中 ZZZZZZZZZ 是登陆页面期间设置的 JSESSIONID cookie 的值。所以我将流程更改为:

  1. 向登陆页面发送 GET 请求 (https://egov.uscis.gov/casestatus/landing.do)
  2. 从响应中复制 JSESSIONID cookie 的值,并将其设置为结果页面请求中的查询参数 (https://egov.uscis.gov/casestatus/mycasestatus.do),同时发送receipt_number 作为负载在 POST 请求中

这也不起作用。我的最终目标是编写 Python 或 Java 代码(因为这是我熟悉的两个代码)来获得结果,但我想如果我无法从 Postman 获得手动请求,那就从代码中得到它是一个白日梦。

api automation webforms postman
4个回答
3
投票

您不需要会话标签,只需将邮递员请求中的参数名称更改为 appReceiptNum 即可工作:https://egov.uscis.gov/casestatus/mycasestatus.do?appReceiptNum=LINXXXXXXXXXX


2
投票

@阿洛克

您需要的是术语“无头浏览器/抓取工具” 刚刚创建了一个快速示例(但在 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

代码将提供返回屏幕截图和状态


0
投票

我刚刚使用 HtmlUnit 创建了一个简单的 USCIS 网络爬虫 Spring Boot 应用程序。 唯一的问题是我的爬虫忽略了错误的案例编号。但正在工作。 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;
}

0
投票

最近有人这样做过吗?它在最新的网站上不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.