【问题标题】:How do I programmatically check my application status on USCIS?如何以编程方式检查我在 USCIS 的申请状态?
【发布时间】:2020-10-23 13:16:30
【问题描述】:

每天,我都需要在 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),同时在 POST 请求中发送receipt_number 作为有效负载

这也不起作用。我的最终目标是编写 Python 或 Java 代码(因为这两个是我熟悉的)来获得结果,但我想如果我不能让 Postman 的手动请求工作,让它通过代码工作是白日梦。

【问题讨论】:

    标签: api automation webforms postman


    【解决方案1】:

    @阿洛克

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

    您可以在此处找到完整的 repo。 https://github.com/Parthashah/uscis-status-check

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-04-10
        • 1970-01-01
        • 2016-11-16
        • 1970-01-01
        • 2020-09-07
        • 2010-12-24
        • 2014-01-13
        • 2021-09-12
        • 1970-01-01
        相关资源
        最近更新 更多