如何创建 php 表单并集成链接到 Telegram 或 Whatsapp 的推送通知系统?

Posted

技术标签:

【中文标题】如何创建 php 表单并集成链接到 Telegram 或 Whatsapp 的推送通知系统?【英文标题】:How to create a php form and integrate a push notification system linked to Telegram or Whatsapp? 【发布时间】:2019-04-15 04:12:31 【问题描述】:

我们的网页设计老师给了我们一个小组项目,他要求我们创建一个 php 表单来收集一些学生及其成绩的数据。系统应该在数据库中输入数据(学生姓名、电话号码、学习水平、GPA),并向管理员发送一些包含新输入数据的即时通知。有没有办法集成一个通知系统,该系统可以与 Telegram 或 Whatsapp 等消息传递应用程序一起使用,并在将所有数据输入到 Whatsapp 或 Telegram 组后立即发送它们?

我们在 php 和 html 中设计了表单,但由于某种原因,它会在页面打开时自动提交,结果,我们在打开页面时已经收到空字段错误消息,这在美学方面并不好看法。第二个问题是我们不知道如何从表单向 Telegram 或 Whatsapp 发送消息。由于我们解决问题的第一次尝试与我们被要求做的非常不同,因此我们决定删除有缺陷的部分并发布带有我们的变量集的基本基本代码,以便您可以更准确地提供帮助。

<?php
//Debug mode on

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Fetch session last typed data
session_start();
$_SESSION['name'] = (isset($_POST['name']) ? $_POST['name'] : '');
$_SESSION['phone'] = (isset($_POST['phone']) ? $_POST['phone'] : '');
$_SESSION['gpa'] = (isset($_POST['gpa']) ? $_POST['gpa'] : '');
$_SESSION['type'] = (isset($_POST['type']) ? $_POST['type'] : '');

//Define Errors
$name_err ='Veuillez entrer le nom';
$phone_err = 'Veuillez entrer le numéro de telephone';
$gpa_err = 'Veuillez entrer le gpa';
$type_err ='Veuillez entrer le type';

//Define Placeholders
$name_ph ='name';
$phone_ph = 'Numéro de téléphone';
$gpa_ph = 'Entrez le gpa';
$type_ph ='le type';

// Vars fetch data from form for email and form use

    $name = (isset($_POST['name']) ? $_POST['name'] : '');
    $phone = (isset($_POST['phone']) ? $_POST['phone'] : '');
    $gpa = (isset($_POST['gpa']) ? $_POST['gpa'] : '');
    $type = (isset($_POST['type']) ? $_POST['type'] : '');

// User ip Address
    $ipadd = $_SERVER['REMOTE_ADDR'];

// Include db config file
    require_once "db.php";

    mysql_select_db(DB_NAME); 

//Safe database record and telegram or whatsapp message 
This is where I need you help :)

?>


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <br>
    <center><img src="/images/School-Logo.png"  style="width:123px;height:93px;"></center>
    <link rel="icon" rel="shortcut icon" type="image/x-icon" href="/images/favicon.ico">
    <title>Récuperation et envoi de donnes scolaires</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
    <link rel="stylesheet" href="/css/custom.css">
    <style type="text/css">
        body font: 14px sans-serif; 
        .wrapper width: 350px; padding: 20px; 
    </style>   
</head>
<body>
   <center> 
        <h1>School system</h1>
        <h3>Collecting Storing data and sending notifications</h3>

        <div class="wrapper">
        <!––  Informations -->
            <div class="studentform">

                <b>
                    Note:
                    <br>
                <ul>

                 <li>Entrez les informations</li>
                 <br>


                </ul>
                </b>

            </div>
            <br>

        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" id="stud" method="post">

            <div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>">
                <p align="left">Name <?php echo $name; ?> <font color="red">*</font> </p>
                <input type="text" name="name" class="form-control" placeholder="<?php echo $name_ph;?>" value="<?php echo $_SESSION['name'];?>">
                <span class="help-block"><?php echo $name_err; ?></span>
            </div>    
            <div class="form-group <?php echo (!empty($phone_err)) ? 'has-error' : ''; ?>">
                <p align="left">Contact <?php echo $phone; ?> <font color="red">*</font></p>
                <input type="text" name="phone" class="form-control" placeholder="<?php echo $phone_ph;?>" value="<?php echo $_SESSION['phone'];?>" align="left" >
                <span class="help-block"><?php echo $phone_err; ?></span>
            </div>
            <div class="form-group <?php echo (!empty($gpa_err)) ? 'has-error' : ''; ?>">
                <p align="left">GPA <font color="red">*</font></p>
                <input type="text" name="gpa" class="form-control" placeholder="<?php echo $gpa_ph;?>" value="<?php echo $_SESSION['gpa'];?>" align="left">
                <span class="help-block"><?php echo $gpa_err; ?></span>
            </div>


             <div class="form-group <?php echo (!empty($type_err)) ? 'has-error' : ''; ?>">
                <p align="left">C <font color="red">*</font></p>
                <select name="type" form="stud" class="pickupselect" style="width:100%;">
                <option value="bachelor">Bachelor</option>
                <option value="master">Master</option>
                </select>
                <span class="help-block"><?php echo $type_err; ?></span>
            </div>
            <div class="form-group">
                <input type="submit" class="btn btn-primary" value="Entrez les informations" align="left">
            </div>
        </form>
    </div>  </center>  
</body>
<footer>
<center>school data 2019</center>
<br>
</footer>
</html>

【问题讨论】:

您不能直接通过 WhatsApp 发送消息,因为它不提供任何公共 API 可供使用。但我认为 Telegram 提供了某种 API 来查看他们的官方网站。 【参考方案1】:

A) 对于问题的第一部分,您没有检查表单是否提交;这样,每次页面加载时都会执行顶部的 PHP 代码。为了解决这个问题,我们需要检查表单是否提交:

将提交按钮更改为:

 <input type="submit" class="btn btn-primary" value="Entrez les informations" align="left">

到:

 <input type="submit" name="submitedFrom" class="btn btn-primary" value="Entrez les informations" align="left">

提交按钮必须有一个 name 属性,以便它可以通过 $post 变量发送。

if(isset($_POST['submitedFrom']) && is_array($_POST) && !empty($_POST) && $_POST['submitedFrom'] == 'Entrez les informations')

   // Fetch session last typed data
   session_start();
   $_SESSION['name'] = (isset($_POST['name']) ? $_POST['name'] : '');
   $_SESSION['phone'] = (isset($_POST['phone']) ? $_POST['phone'] : '');
   $_SESSION['gpa'] = (isset($_POST['gpa']) ? $_POST['gpa'] : '');
   $_SESSION['type'] = (isset($_POST['type']) ? $_POST['type'] : '');

   //Define Errors
   $name_err ='Veuillez entrer le nom';
   .
   .
   .

这样当表单提交时,在post变量中发送提交按钮值后,表单将被提交。

B) 对于问题的第二部分,我假设您知道如何在数据库中添加记录。所以我解释了如何向 Telegram 频道发送消息,以便频道的每个成员都可以看到消息(提交的表单数据)。但我必须警告你,它包含大量的阅读和研究。我的解释只是这个过程的指南。

注意:您必须在实际服务器上测试您的电报机器人,它不能在本地主机中运行。还有其他工具,例如 ngrok,通过在本地和人工临时服务器之间创建绑定,您可以在 localhost 中对其进行测试。

Telegram 机器人初始化步骤:

1 - 首先,您必须在电报之父中构建一个机器人,以便在命名后为您的机器人获取机器人令牌

2 - 创建一个频道,然后将机器人添加到频道中

3 - 授予您的机器人在频道选项中读取和写入的权限(这样机器人可以将消息发送到频道中)

4 - 通过在浏览器的地址栏中键入以下代码,为您的机器人设置一个 webhook:

https://api.telegram.org/bot<bot-token>/setWebhook?url=<webhook-url>

<bot-token> - bot token get from BotFather on Telegram
<webhook-url> - webhook url in base64

通过设置 webhook,您可以告诉电报通过此 URL 与机器人通信。实际上,您指向的是您的机器人逻辑存在的地方。

5 - 使用此功能,您可以通过 bot 将消息发送到频道:

define('BOT_TOKEN', <bot-token>);
define('API_URL', 'https://api.telegram.org/bot' . BOT_TOKEN . '/');

function apiRequest($method, $parameters, $token=null) 

    foreach ($parameters as $key => &$val) 
        if (!is_numeric($val) && !is_string($val)) 
            $val = json_encode($val);
        
    
    if(empty($token))
        $url = API_URL.$method;
    else
        $url = "https://api.telegram.org/bot$token/".$method;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
    $response = curl_exec($ch);

    return $response;

方法变量是与 API 通信的电报预定义方法。你可以看到所有的消息发送方法列表here。

通过此示例,您可以向频道发送消息:

$params = [
'chat_id' => 'channels chat id', 
"text" => 'form data that you want to send', 
]

apiRequest("sendMessage", $params);

我希望这会对您有所帮助,但请记住在开始编码之前仔细阅读文档。

【讨论】:

确定if(isset($_POST['Entrez les informations']) 有效吗? @kerbholz 当我们没有任何控制器和重定向并且代码过程在同一页面上时,为什么不呢? 想知道,因为没有名为'Entrez les informations'的字段 @kerbholz 是的,你是对的。我的错。我认为它是提交按钮的名称:D 非常感谢您刚刚挽救了 6 条生命

以上是关于如何创建 php 表单并集成链接到 Telegram 或 Whatsapp 的推送通知系统?的主要内容,如果未能解决你的问题,请参考以下文章

创建Web表单并与数据库集成吗?

使用 Auth0 和 PHP 创建后登录用户

如何将出生日期从数据库显示到表单并在 php 和 PDO 中更新?

简单的提交表单以转到页面

如何将复制按钮集成到使用 cocoon gem 创建的表单中

如何在 PHP 中将 MoneyBookers 集成到 Web 应用程序中? [关闭]