通过国会API和JavaScript通过SMS提取国会数据
#javascript #教程 #serverless #twilio

国会最近提出了官方的API,因此公众可以“从gongress.gov上可用的收藏中查看,检索和重复使用机器可读数据!”继续阅读以了解如何使用Congress APITwilio FunctionsTwilio Serverless Toolkit读取国会数据。

文本“票据”,“修订”或“摘要”到 +12029337044 接收有关随机账单或修订的数据!
sms example

先决条件

  1. 一个Twilio帐户-sign up for a free one here
  2. 带有短信功能的Twilio电话号码-configure one here
  3. A Congress.gov API Key – get one here
  4. Postman(您可以从命令行中提出卷曲请求)
  5. 安装node.js -download it here

提出国会。gov请求

您可以查看different Congress API endpoints offered here。为了获取某人的个人资料信息,URL看起来像[https://api.congress.gov/v3/bill/117/s/4693/summaries](https://api.congress.gov/v3/bill/117/s/4693/summaries),其中117是[国会numberhttps://en.wikipedia.org/wiki/117th_United_States_Congress,“ s”是账单的类型,“ 4693”是账单号。打开邮递员并将该URL粘贴到URL栏中。

在参数下添加您的API键:keyapi_keyvalue是您的国会API键。

单击Send,用get请求击中它,以查看返回以下数据:
congress API data returned in Postman
同样,您可以看到more Congress API endpoints here you can play around with

开始使用Twilio无服务器工具包

无服务器工具包是CLI工具,可帮助您在本地开发并部署到Twilio Functions & Assets。使用无服务器工具包的最佳方法是通过Twilio CLI。如果您还没有安装Twilio CLI,请在命令行上运行以下命令以安装它和无服务器工具包:

npm install twilio-cli -g
twilio login
twilio plugins:install @twilio-labs/plugin-serverless

之后,创建您的新项目并安装我们的唯一需求[undici](https://github.com/nodejs/undici),以通过运行:
在node.js中提出HTTP请求

twilio serverless:init congress-api-sms –template=blank
cd congress-api-sms
npm install -s undici

功能和资产团队建议使用undici与您的功能。

设置具有Twilio功能和资产的环境变量

在Root Directory中为您的函数项目打开您的.env文件,并添加以下行:

CONGRESS_API_KEY=YOUR-CONGRESS-API-KEY

现在,如果您想在代码中使用context.CONGRESS_API_KEY

,可以访问此API密钥。

使用JavaScript发挥Twilio功能

/functions目录中制作一个新文件,称为 congress.js 包含以下代码:

exports.handler = async (context, event, callback) => {
  const { request } = await import('undici');
  const inbMsg = event.Body.toLowerCase().trim();
  const twiml = new Twilio.twiml.MessagingResponse();
  if(inbMsg.includes("bill")) {
    const {
      body
    } = await request(`https://api.congress.gov/v3/bill?api_key=${context.CONGRESS_API_KEY}`);
    const data = await body.json();
    const billsLength = data.bills.length;
    const randNum = Math.floor(Math.random() * (billsLength - 1)) + 1;
    const bill = data.bills[randNum];
    const { latestAction, title, type, number, originChamber } = bill;

    const billMap = {
        HR: "house bill",
        S: "senate bill",
        HJRES: "house joint resolution",
        SJRES: "senate joint resolution",
        HCONRES: "house concurrent resolution",
        SCONRES: "senate concurrent resolution",
        HRES: "house simple resolution",
        SRES: "senate simple resolution"
    };
    twiml.message(`Bill: ${title}.\nType: ${billMap[type]}\nAssigned bill or resolution number:   ${number}\nIt originated in the ${originChamber} but the latest action was ${latestAction.text} on ${latestAction.actionDate}`);
  }
  else if(inbMsg.includes("amendment")) {
    const {
      body
    } = await request(`https://api.congress.gov/v3/amendment?api_key=${context.CONGRESS_API_KEY}`);
    const data = await body.json();
    const amendmentLength = data.amendments.length;
    const randNum = Math.floor(Math.random() * (amendmentLength - 1)) + 1;
    const amendment = data.amendments[randNum];
    const { latestAction, purpose, congress, number } = amendment;
    twiml.message(`Amendment purpose: ${purpose}\nAssigned amendment or resolution number:${number}\n Latest action was on ${latestAction.actionDate} to ${latestAction.text}.\n Congress: ${congress}.`);
  }
  else if(inbMsg.includes("summaries")) {
    const CURRENT_CONGRESS = 117;
    const {
      body
    } = await request(`https://api.congress.gov/v3/summaries/${CURRENT_CONGRESS}?api_key=${context.CONGRESS_API_KEY}`);
    const data = await body.json();
    const sumLength = data.summaries.length;
    const randNum = Math.floor(Math.random() * (sumLength - 1)) + 1;
    const summaries = data.summaries[randNum];
    const { bill, currentChamber, text, actionDate, actionDesc } = summaries;
    const regexToStripHtmlTags = /<(.|\n)*?>/g;
    const textWithoutHtmlTags = text.replace(regexToStripHtmlTags, '');
    const msg = `Summary title: ${bill.title}.\nStarted in: ${bill.originChamber} on ${actionDate}, currently in the ${currentChamber} chamber in Congress ${bill.congress} and it was ${actionDesc}\n${textWithoutHtmlTags}`; 
    twiml.message(msg);
  }
  else {
    twiml.message(`Send "bill", "amendment", or "summaries"`);
  }
  callback(null, twiml);
};

此代码导入undici,制作了一个Twilio Messaging Response object,从入站文本消息用户中创建一个可变的inbMsg,并检查该消息输入是否包含billamendmentsummaries(国会API的三个端点)。然后,该代码基于从国会API返回的随机账单或修正案的总数生成一个随机数,将其从该给定端点(如上所述所看到的邮递员所看到的)解析为变量,例如修正案的类型或比尔,最近的日期采取了一些行动,还有更多!

如果某人不发送包含“账单”,“摘要”或“修正案”(他们可以学习的三个主题)的消息,我们会返回一条消息。否则,我们解析了国会对象返回的信息,例如对法案采取的最新诉讼,账单类型,给定随机修正案的目的,法案的原始商会等。我们返回包含该数据的短信!

您可以查看complete app on GitHub here

用Twilio电话号码配置功能

用面向公共的URL将我们的应用程序打开到网络,请从congress-api-sms root Directory运行twilio serverless:deploy。您应该在终端的底部看到它:
twilio function urls once deployed
获取与您的应用相对应的功能URL(以/congress结尾)并配置带有它的Twilio电话号码,如下所示:选择您在Twilio电话号码控制台中刚购买的Twilio号码部分。粘贴文本字段中的链接,以 webhook的形式粘贴链接,以确保将其设置为 http post 。当您单击保存时,应该看起来像这样!
messaging section of twilio phone number
该服务是无服务器的项目名称,环境没有其他选项,功能路径是文件名。现在,将您的电话和文字“账单”或“修正案”或“摘要”发送给您的Twilio号码。
sms example

Twilio Serverless和国会API的下一步是什么?

being in congress must be fun kimmy schmidt gif
Twilio的无服务器工具包使您可以快速部署Web应用程序,并为您无缝处理服务器的功能和资产。您可以使用这些数据做很多事情,并且可以看到国会正在采取的措施 - 它的有趣数据值得播放!让我在线知道您正在使用Twilio功能和资产来建立什么,不要忘记今年11月投票!