长期以来,我一直是新闻阅读器应用程序的粉丝。主要是为了能够跟上我感兴趣的故事、作家和出版物的便利。尽管如此,我也意识到这类应用程序对我的日常工作效率的负面影响。
事实证明,点击式标题频繁打断我的注意力是相当令人沮丧的--尤其是我每次都会上当。然而,为了FOMO(Fear of Missing Out)的缘故,我对取消订阅有些犹豫不决。
对于这位千禧一代来说,这种挣扎是真实的。所以,如果你和我一样,在保持社会现状的同时,避免陷入耸人听闻的标题陷阱,你会发现这个教程非常有帮助。
你将建立什么?
你将学习如何创建一个个性化的新闻推送应用程序,在每天结束时将当天的头条新闻编成文字。该项目将由Goutte网络刮刀和Twilio的消息调度API驱动。
构建新闻阅读器的真正优势在于能够指定你想要的新闻传递时间和方式。一旦建成,你的注意力将不再需要在你的工作和跟上最新的头条新闻之间做出决定,因为这些头条新闻正呼唤着你的注意。
在出版时,消息调度目前正处于公开测试阶段。这可能会导致教程的变化,如果你在消息调度普遍可用时查看这个教程。
前提条件
要跟上,你需要以下条件:
- 对PHP有基本的了解
- PHP 7.4,不过最好是8版本。
- 全局安装Composer。
- 一个免费或付费的Twilio账户。如果你是Twilio的新手,请点击这里创建一个免费账户。
- 一部智能手机来测试你的应用程序
创建项目
首先,你需要创建项目的根目录,名为*twilio-news-feed,*然后在终端运行以下命令切换到该目录:
mkdir twilio-news-feed
cd twilio-news-feed
之后,在你的顶层目录内创建以下文件:
- index.php- 将包含你的Goutte刮刀的代码
- sms-scheduler.php - 将包含Twilio SMS API的代码。
要创建这些文件,运行以下命令:
touch index.php sms-scheduler.php
然后,创建第三个文件,.env,它将包含代码与Twilio的消息调度API交互所需的Twilio证书。在该文件中,粘贴以下代码:
TWILIO_ACCOUNT_SID=<TWILIO_ACCOUNT_SID>
TWILIO_AUTH_TOKEN=<TWILIO_AUTH_TOKEN>
TWILIO_MESSAGING_SERVICE_SID=<TWILIO_MESSAGING_SERVICE_SID>
TWILIO_PHONE_NUMBER="<TWILIO_PHONE_NUMBER>"
检索你的Twilio凭证
创建一个Twilio消息传递服务
为了能够使用Twilio的消息调度,你需要设置一个消息服务。消息服务是为你的特定用例或活动捆绑消息功能的容器。例如,你可能想创建一个信息服务来捆绑所有将向客户发送营销信息的电话号码。
在这种情况下,我们将使用一个信息服务来通知用户,并将其与你的电话号码捆绑在一起。要创建它,请登录Twilio控制台,点击**"探索产品",并选择"消息服务 "选项。然后,点击服务,再点击"创建消息服务 "按钮。

在**"Messaging Service Friendly Name "输入栏中输入"Twilio News Reader"。然后在"选择你要使用的信息服务 "的下拉列表中选择"通知我的用户"。当你完成后,点击"创建消息服务 "**按钮,以继续进行本设置的第二步。

接下来,你需要添加发件人。发件人代表一个频道、数字类型或消息类型,可以使用Twilio消息传输API发送和接收消息。
现在是时候添加你的Twilio号码了,所以点击**"添加发件人 "按钮开始。选择"电话号码 "选项并点击"继续"。

然后点击你想添加的号码旁边的复选框,再点击**"添加电话号码 "**按钮。

现在点击"步骤3:设置整合 "按钮。你不需要在这个页面上更新任何信息,因此继续进行第4步。第4步也不需要做任何更改。点击"完成信息服务设置 "**按钮,以最终完成这一设置。

要测试它是否工作,请点击**"尝试发送消息 "**按钮。

在**"收件人电话号码 "文本字段中添加您经过验证的个人电话号码。接下来,在"来自短信服务SID "中选择你新创建的短信服务。对于"正文 "字段,你可以添加任何你想要的文本。点击"发送测试短信 "**按钮,然后确认你的手机已经收到信息。如果一切按预期进行,你应该收到像下面截图中那样的文本信息。

恭喜你成功地设置了你的新的信息服务创建了消息服务后,复制消息服务的SID,并将其粘贴在*.env*中,代替<TWILIO_MESSAGING_SERVICE_SID> 。

接下来,去控制台的仪表板,检索你的Twilio Auth Token、账户SID和电话号码。复制它们并将它们分别粘贴在.env中的<TWILIO_ACCOUNT_SID>,<TWILIO_AUTH_TOKEN>, 和<TWILIO_PHONE_NUMBER> 的位置。
现在,是时候享受一下创建新闻阅读器应用程序的乐趣了。
安装所需的依赖项
接下来,运行以下命令来安装项目的三个依赖项。Goutte,Twilio的PHP SDKs,和PHP Dotenv:
composer require fabpot/goutte twilio/sdk vlucas/phpdotenv
创建Goutte网络搜刮器
我将抓取Sky News网站,但也可以自由选择其他网站或博客,并使用我的例子作为参考指南。请注意,虽然合法,但在一些国家和司法管辖区(如欧盟),允许你对搜刮的数据做什么是有限制的。

Goutte通过直接从HTML响应中提取数据来工作。在这个例子中,我们想抓取天空新闻头版的每个故事的标题。要做到这一点,你需要在你的浏览器上打开开发者检查器工具 对于我来说,它是谷歌chrome上的 "检查元素 "工具。你可以在**"视图>开发者>检查元素 "**上找到它。
正如你从前面的例子截图中看到的,你正在寻找<span> 元素,其类别为sdc-site-tile__headline-link 。这是包含天空新闻网站首页所有标题的类。 有了这些信息,现在是写代码的时候了。
复制并粘贴以下代码到index.php:
<?php
require 'vendor/autoload.php';
require_once 'sms-scheduler.php';
use Goutte\Client;
function breaking_news()
{
$client = new Client();
$url = "https://news.sky.com/";
$crawler = $client->request('GET', $url);
$crawler
->filter('.sdc-site-tile__headline-link')
->each(function ($node) {
$href = $node->attr('href');
$link = 'https://news.sky.com/' . $href;
$headline = $node->text();
$output = "$headline" . " $link";
return schedule_text($output);
});
}
breaking_news();
代码一开始就要求有必要的依赖关系和文件。函数breaking_news() 创建一个新的GoutteClient 对象,并将其传递给变量$client 。天空新闻的URL被传递到变量$url ,并通过request() 方法提出请求,返回一个分配给变量$crawler 的Crawler对象。
为了获得头条新闻,sdc-site-tile__headline-link 类被传递给filter() 方法,each() 方法被用来在各个节点中迭代提取头条新闻文本。
一旦完成,breaking_news() 函数会返回Twilio消息传递函数,并将标题列表作为参数传递给它。接下来,你需要创建文本消息函数,它将使用Twilio API来发送新闻提要的文本。
就像现在这样,运行这段代码会导致62条短信被发送,所以虽然这对学习和测试很有帮助,但要注意不要太快烧掉你的数据。Twilio目前允许每条消息的最大长度为1600个字符。
将新闻源作为短信发送
接下来,复制并粘贴以下代码到sms-scheduler.php:
<?php
require_once 'vendor/autoload.php';
use Twilio\Rest\Client;
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
function schedule_text($var)
{
$twilio = new Client(
$_ENV['TWILIO_ACCOUNT_SID'],
$_ENV['TWILIO_AUTH_TOKEN']
);
$message = $twilio
->messages
->create(
$_ENV['TWILIO_PHONE_NUMBER'],
[
"messagingServiceSid" => "TWILIO_MESSAGING_SERVICE_ID",
"body" => "Breaking News! " . $var,
"sendAt" => (new \DateTime())->add(new DateInterval("P1D")),
"scheduleType" => "fixed"
]
);
}
该代码首先要求所有必要的依赖性。然后,用你的Twilio账户SID和Auth令牌值初始化一个新的TwilioClient 对象。之后,用你经过验证的Twilio电话号码、你的消息服务ID和短信正文创建一个Twilio消息。
在正文参数中,你把之前和Goutte一起搜刮到的新闻头条和标题一起传过去 **Breaking News!**最后,你用PHP的DateTime函数设置你想发送消息的时间,scheduleType为 "fixed"。
测试时间!
代码完成后,是时候进行测试了。要做到这一点,通过运行下面的命令来运行代码:
php index.php
如果一切按预期进行,你应该会收到来自天空新闻的所有最新消息的文本信息:

恭喜你完成了这个教程,你做得很好如果你觉得相当有野心,你可以扩展这个应用程序,使其做得更多。例如,我认为收到美味的菜谱和了解最新的度假优惠信息会非常好。你永远不知道你会创造出什么,如果你让你的想象力尽情发挥的话
我迫不及待地想看到你建立的东西。